Merge pull request #155 from HabitRPG/sabe/drops

Overhaul drop chance to a percentage multiplier system
This commit is contained in:
Sabe Jones 2014-02-26 20:46:59 -06:00
commit fdc47b4d29
2 changed files with 23 additions and 16 deletions

View file

@ -12645,14 +12645,15 @@ var process=require("__browserify_process");(function() {
}), user);
},
randomDrop: function(modifiers) {
var acceptableDrops, bonus, chance, drop, dropK, quest, rarity, task, _base, _base1, _base2, _name, _name1, _name2, _ref, _ref1, _ref2, _ref3, _ref4;
var acceptableDrops, chance, drop, dropK, quest, rarity, task, _base, _base1, _base2, _name, _name1, _name2, _ref, _ref1, _ref2, _ref3, _ref4;
task = modifiers.task;
bonus = Math.abs(task.value) * task.priority + (task.streak || 0) + (user._statsComputed.per * .5);
bonus /= 100;
chance = api.diminishingReturns(bonus, 1, 0.5);
chance = Math.abs(task.value - 25) / 1000;
chance *= task.priority * (1 + (task.streak / 100 || 0)) * (1 + (user._statsComputed.per / 50)) * (1 + (user.contributor.level / 25 || 0)) * (1 + (user.achievements.rebirths / 25 || 0)) * (1 + (user.achievements.streak / 100 || 0)) * (user._tmp.crit || 1) * (1 + (_.reduce(task.checklist, (function(m, i) {
return m + (i.completed ? 1 : 0);
}), 0) || 0));
quest = content.quests[(_ref = user.party.quest) != null ? _ref.key : void 0];
if ((quest != null ? quest.collect : void 0) && user.fns.predictableRandom(user.stats.gp) < bonus) {
if ((quest != null ? quest.collect : void 0) && user.fns.predictableRandom(user.stats.gp) < (chance * 2)) {
dropK = user.fns.randomVal(quest.collect, {
key: true
});
@ -12661,7 +12662,7 @@ var process=require("__browserify_process");(function() {
user.markModified('party.quest.progress');
}
}
if ((api.daysSince(user.items.lastDrop.date, user.preferences) === 0) && (user.items.lastDrop.count >= 5)) {
if ((api.daysSince(user.items.lastDrop.date, user.preferences) === 0) && (user.items.lastDrop.count >= 5 + Math.floor(user._statsComputed.per / 10))) {
return;
}
if (((_ref1 = user.flags) != null ? _ref1.dropsEnabled : void 0) && user.fns.predictableRandom(user.stats.exp) < chance) {

View file

@ -981,23 +981,29 @@ api.wrap = (user, main=true) ->
{task} = modifiers
# % chance of getting a drop
bonus =
Math.abs(task.value) * # + Task Redness
task.priority + # * Task Priority
(task.streak or 0) + # + Streak bonus
(user._statsComputed.per * .5) # + Perception
bonus /= 100 # /100 (as a percent)
chance = api.diminishingReturns(bonus, 1, 0.5) # see HabitRPG/habitrpg#1922 for details
#console.log "Drop Equation: Bonus(#{bonus.toFixed(3)}), Modified Chance(#{chance.toFixed(3)})\n"
chance = Math.abs(task.value - 25) / 1000 # Base drop chance based on task value. Subtract more than the max possible task value so we never get a 0
chance *=
task.priority * # Task priority: +50% for Medium, +100% for Hard
(1 + (task.streak / 100 or 0)) * # Streak bonus: +1% per streak
(1 + (user._statsComputed.per / 50)) * # PERception: +2% per point
(1 + (user.contributor.level / 25 or 0)) * # Contrib levels: +4% per level
(1 + (user.achievements.rebirths / 25 or 0)) * # Rebirths: +4% per achievement
(1 + (user.achievements.streak / 100 or 0)) * # Streak achievements: +1% per achievement
(user._tmp.crit or 1) * # Use the crit multiplier if we got one
(1 + (_.reduce(task.checklist,((m,i)->m+(if i.completed then 1 else 0)),0) or 0)) # +100% per checklist item complete
#console.log("Drop chance: " + chance)
quest = content.quests[user.party.quest?.key]
if quest?.collect and user.fns.predictableRandom(user.stats.gp) < bonus # NOTE: < bonus, higher chance than drops
if quest?.collect and user.fns.predictableRandom(user.stats.gp) < (chance * 2) # 2x as likely to get a collection quest drop as a pet item drop
dropK = user.fns.randomVal quest.collect, {key:true}
user.party.quest.progress.collect[dropK]++
user.markModified? 'party.quest.progress'
#console.log {progress:user.party.quest.progress}
return if (api.daysSince(user.items.lastDrop.date, user.preferences) is 0) and (user.items.lastDrop.count >= 5)
return if (api.daysSince(user.items.lastDrop.date, user.preferences) is 0) and (user.items.lastDrop.count >= 5 + Math.floor(user._statsComputed.per / 10))
if user.flags?.dropsEnabled and user.fns.predictableRandom(user.stats.exp) < chance
# current breakdown - 1% (adjustable) chance on drop