mirror of
https://github.com/sudoxnym/habitica.git
synced 2026-07-12 06:57:47 +00:00
Merge branch 'master' into classes
Conflicts: dist/habitrpg-shared.js dist/spritesheets.css img/sprites/Egg_Sprite_Sheet.png
This commit is contained in:
commit
6d2e67fab6
3 changed files with 82 additions and 67 deletions
24
dist/habitrpg-shared.js
vendored
24
dist/habitrpg-shared.js
vendored
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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', ->
|
||||
|
|
|
|||
Loading…
Reference in a new issue