diff --git a/dist/habitrpg-shared.js b/dist/habitrpg-shared.js index e17495750d..1abaf6b0d3 100644 --- a/dist/habitrpg-shared.js +++ b/dist/habitrpg-shared.js @@ -8924,7 +8924,7 @@ var global=self;/** randomDrop = function(user, modifiers) { - var acceptableDrops, chanceMultiplier, delta, drop, priority, rarity, reachedDropLimit, streak, _base, _base1, _base2, _name, _name1, _ref1; + var acceptableDrops, chanceMultiplier, delta, drop, priority, rarity, reachedDropLimit, streak, _base, _base1, _base2, _base3, _name, _name1, _name2, _ref1; delta = modifiers.delta, priority = modifiers.priority, streak = modifiers.streak; if (streak == null) { streak = 0; @@ -8935,7 +8935,7 @@ var global=self;/** count: 0 }; } - reachedDropLimit = (helpers.daysSince(user.items.lastDrop.date, user.preferences) === 0) && (user.items.lastDrop.count >= 2); + reachedDropLimit = (helpers.daysSince(user.items.lastDrop.date, user.preferences) === 0) && (user.items.lastDrop.count >= 5); if (reachedDropLimit) { return; } @@ -8944,21 +8944,29 @@ var global=self;/** chanceMultiplier += streak; if (((_ref1 = user.flags) != null ? _ref1.dropsEnabled : void 0) && Math.random() < (.05 * chanceMultiplier)) { rarity = Math.random(); - if (rarity > .5) { - drop = helpers.randomVal(eggs); - if ((_base1 = user.items.eggs)[_name = drop.name] == null) { + if (rarity > .6) { + drop = helpers.randomVal(_.omit(items.items.food, 'Saddle')); + if ((_base1 = user.items.food)[_name = drop.name] == null) { _base1[_name] = 0; } + user.items.food[drop.name] += 1; + drop.type = 'Food'; + drop.dialog = "You've found a " + drop.text + " Food! " + drop.notes; + } else if (rarity > .3) { + drop = helpers.randomVal(eggs); + if ((_base2 = user.items.eggs)[_name1 = drop.name] == null) { + _base2[_name1] = 0; + } user.items.eggs[drop.name]++; drop.type = 'Egg'; drop.dialog = "You've found a " + drop.text + " Egg! " + drop.notes; } else { - acceptableDrops = rarity < .02 ? ['Golden'] : rarity < .13 ? ['Zombie', 'CottonCandyPink', 'CottonCandyBlue'] : rarity < .29 ? ['Red', 'Shade', 'Skeleton'] : ['Base', 'White', 'Desert']; + acceptableDrops = rarity < .03 ? ['Golden'] : rarity < .06 ? ['Zombie', 'CottonCandyPink', 'CottonCandyBlue'] : rarity < .09 ? ['Red', 'Shade', 'Skeleton'] : ['Base', 'White', 'Desert']; drop = helpers.randomVal(_.pick(hatchingPotions, (function(v, k) { return __indexOf.call(acceptableDrops, k) >= 0; }))); - if ((_base2 = user.items.hatchingPotions)[_name1 = drop.name] == null) { - _base2[_name1] = 0; + if ((_base3 = user.items.hatchingPotions)[_name2 = drop.name] == null) { + _base3[_name2] = 0; } user.items.hatchingPotions[drop.name]++; drop.type = 'HatchingPotion'; diff --git a/script/algos.coffee b/script/algos.coffee index b579a3d174..25b4eccf48 100644 --- a/script/algos.coffee +++ b/script/algos.coffee @@ -139,7 +139,7 @@ randomDrop = (user, modifiers) -> date: +moment().subtract('d', 1) # trick - set it to yesterday on first run, that way they can get drops today count: 0 - reachedDropLimit = (helpers.daysSince(user.items.lastDrop.date, user.preferences) is 0) and (user.items.lastDrop.count >= 2) + reachedDropLimit = (helpers.daysSince(user.items.lastDrop.date, user.preferences) is 0) and (user.items.lastDrop.count >= 5) return if reachedDropLimit # % chance of getting a pet or meat @@ -152,16 +152,16 @@ randomDrop = (user, modifiers) -> # If they got a drop: 50% chance of egg, 50% Hatching Potion. If hatchingPotion, broken down further even further rarity = Math.random() -# # Food: 40% chance -# if rarity > .6 -# drop = helpers.randomVal _.omit(items.items.food, 'Saddle') -# user.items.food[drop.name] ?= 0 -# user.items.food[drop.name]+= 1 -# drop.type = 'Food' -# drop.dialog = "You've found a #{drop.text} Food! #{drop.notes}" + # Food: 40% chance + if rarity > .6 + drop = helpers.randomVal _.omit(items.items.food, 'Saddle') + user.items.food[drop.name] ?= 0 + user.items.food[drop.name]+= 1 + drop.type = 'Food' + drop.dialog = "You've found a #{drop.text} Food! #{drop.notes}" # Eggs: 30% chance - if rarity > .5 + else if rarity > .3 drop = helpers.randomVal eggs user.items.eggs[drop.name] ?= 0 user.items.eggs[drop.name]++ @@ -171,13 +171,13 @@ randomDrop = (user, modifiers) -> # Hatching Potion, 30% chance - break down by rarity. else acceptableDrops = - # Very Rare: 4% of 50% (4% each) - if rarity < .02 then ['Golden'] - # Rare: 22% of 50% (7.33% each) - else if rarity < .13 then ['Zombie', 'CottonCandyPink', 'CottonCandyBlue'] - # Uncommon: 32% of 50% (10.66% each) - else if rarity < .29 then ['Red', 'Shade', 'Skeleton'] - # Common: 42% of 50% (14% each) + # Very Rare: 10% (of 30%) + if rarity < .03 then ['Golden'] + # Rare: 20% (of 30%) + else if rarity < .06 then ['Zombie', 'CottonCandyPink', 'CottonCandyBlue'] + # Uncommon: 30% (of 30%) + else if rarity < .09 then ['Red', 'Shade', 'Skeleton'] + # Common: 40% (of 30%) else ['Base', 'White', 'Desert'] # No Rarity (@see https://github.com/HabitRPG/habitrpg/issues/1048, we may want to remove rareness when we add mounts) diff --git a/tests/algos.mocha.coffee b/tests/algos.mocha.coffee index 96c0243d0d..5a8e6f6bf8 100644 --- a/tests/algos.mocha.coffee +++ b/tests/algos.mocha.coffee @@ -223,62 +223,69 @@ describe 'Cron', -> afterTasks = after.habits.concat(after.dailys).concat(after.todos).concat(after.rewards) expect(beforeTasks).to.eql afterTasks - it 'should preen user history', -> - {before,after} = beforeAfter({daysAgo:1}) - history = [ - # Last year should be condensed to one entry, avg: 1 - {date:'09/01/2012', value: 0} - {date:'10/01/2012', value: 0} - {date:'11/01/2012', value: 2} - {date:'12/01/2012', value: 2} + describe 'preening', -> + beforeEach -> + @clock = sinon.useFakeTimers(Date.parse("2013-11-20"), "Date"); - # Each month of this year should be condensed to 1/mo, averages follow - {date:'01/01/2013', value: 1} #2 - {date:'01/15/2013', value: 3} + afterEach -> + @clock.restore() - {date:'02/01/2013', value: 2} #3 - {date:'02/15/2013', value: 4} + it 'should preen user history', -> + {before,after} = beforeAfter({daysAgo:1}) + history = [ + # Last year should be condensed to one entry, avg: 1 + {date:'09/01/2012', value: 0} + {date:'10/01/2012', value: 0} + {date:'11/01/2012', value: 2} + {date:'12/01/2012', value: 2} - {date:'03/01/2013', value: 3} #4 - {date:'03/15/2013', value: 5} + # Each month of this year should be condensed to 1/mo, averages follow + {date:'01/01/2013', value: 1} #2 + {date:'01/15/2013', value: 3} - {date:'04/01/2013', value: 4} #5 - {date:'04/15/2013', value: 6} + {date:'02/01/2013', value: 2} #3 + {date:'02/15/2013', value: 4} - {date:'05/01/2013', value: 5} #6 - {date:'05/15/2013', value: 7} + {date:'03/01/2013', value: 3} #4 + {date:'03/15/2013', value: 5} - {date:'06/01/2013', value: 6} #7 - {date:'06/15/2013', value: 8} + {date:'04/01/2013', value: 4} #5 + {date:'04/15/2013', value: 6} - {date:'07/01/2013', value: 7} #8 - {date:'07/15/2013', value: 9} + {date:'05/01/2013', value: 5} #6 + {date:'05/15/2013', value: 7} - {date:'08/01/2013', value: 8} #9 - {date:'08/15/2013', value: 10} + {date:'06/01/2013', value: 6} #7 + {date:'06/15/2013', value: 8} - {date:'09/01/2013', value: 9} #10 - {date:'09/15/2013', value: 11} + {date:'07/01/2013', value: 7} #8 + {date:'07/15/2013', value: 9} - {date:'010/01/2013', value: 10} #11 - {date:'010/15/2013', value: 12} + {date:'08/01/2013', value: 8} #9 + {date:'08/15/2013', value: 10} - # This month should condense each week - {date:'011/01/2013', value: 12} - {date:'011/02/2013', value: 13} - {date:'011/03/2013', value: 14} - {date:'011/04/2013', value: 15} - ] - after.history = {exp: _.cloneDeep(history), todos: _.cloneDeep(history)} - after.habits[0].history = _.cloneDeep(history) - algos.cron(after) + {date:'09/01/2013', value: 9} #10 + {date:'09/15/2013', value: 11} - # remove history entries created by cron - after.history.exp.pop() - after.history.todos.pop() + {date:'010/01/2013', value: 10} #11 + {date:'010/15/2013', value: 12} - _.each [after.history.exp, after.history.todos, after.habits[0].history], (arr) -> - expect(_.map(arr, (x)->x.value)).to.eql [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] + # This month should condense each week + {date:'011/01/2013', value: 12} + {date:'011/02/2013', value: 13} + {date:'011/03/2013', value: 14} + {date:'011/04/2013', value: 15} + ] + after.history = {exp: _.cloneDeep(history), todos: _.cloneDeep(history)} + after.habits[0].history = _.cloneDeep(history) + algos.cron(after) + + # remove history entries created by cron + after.history.exp.pop() + after.history.todos.pop() + + _.each [after.history.exp, after.history.todos, after.habits[0].history], (arr) -> + expect(_.map(arr, (x)->x.value)).to.eql [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] describe 'Todos', -> it '1 day missed', ->