diff --git a/dist/habitrpg-shared.js b/dist/habitrpg-shared.js index 0e0d70cfe8..9b012f1648 100644 --- a/dist/habitrpg-shared.js +++ b/dist/habitrpg-shared.js @@ -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) { diff --git a/script/index.coffee b/script/index.coffee index 6690bad255..b2634196c9 100644 --- a/script/index.coffee +++ b/script/index.coffee @@ -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