mirror of
https://github.com/sudoxnym/habitica-self-host.git
synced 2026-08-01 19:50:37 +00:00
use the path-setting method to notify derby of things that model must change
This commit is contained in:
parent
ad9c1940a9
commit
c0cf9780fe
1 changed files with 23 additions and 17 deletions
|
|
@ -87,13 +87,13 @@ obj.taskDeltaFormula = (currentValue, direction) ->
|
|||
Drop System
|
||||
###
|
||||
|
||||
randomDrop = (user, delta, priority, streak = 0) ->
|
||||
randomDrop = (user, delta, priority, streak = 0, paths) ->
|
||||
# limit drops to 2 / day
|
||||
user.items.lastDrop ?=
|
||||
date: +moment().subtract('d', 1) # trick - set it to yesterday on first run, that way they can get drops today
|
||||
count: 0
|
||||
reachedDropLimit = (helpers.daysBetween(user.items.lastDrop.date, +new Date) is 0)
|
||||
and (user.items.lastDrop.count >= 2)
|
||||
paths['items.lastDrop'] = true
|
||||
reachedDropLimit = (helpers.daysBetween(user.items.lastDrop.date, +new Date) is 0) and (user.items.lastDrop.count >= 2)
|
||||
return if reachedDropLimit
|
||||
|
||||
# % chance of getting a pet or meat
|
||||
|
|
@ -109,7 +109,7 @@ randomDrop = (user, delta, priority, streak = 0) ->
|
|||
# Egg, 40% chance
|
||||
if rarity > .6
|
||||
drop = randomVal(pets)
|
||||
(user.items.eggs ?= []).push drop
|
||||
(user.items.eggs ?= []).push drop; paths['items.eggs'] = true
|
||||
drop.type = 'Egg'
|
||||
drop.dialog = "You've found a #{drop.text} Egg! #{drop.notes}"
|
||||
|
||||
|
|
@ -142,7 +142,7 @@ randomDrop = (user, delta, priority, streak = 0) ->
|
|||
acceptableDrops = hatchingPotions.filter (hatchingPotion) ->
|
||||
hatchingPotion.name in acceptableDrops
|
||||
drop = randomVal acceptableDrops
|
||||
(user.items.hatchingPotions ?= []).push drop.name
|
||||
(user.items.hatchingPotions ?= []).push drop.name; paths['items.hatchingPotions'] = true
|
||||
drop.type = 'HatchingPotion'
|
||||
drop.dialog = "You've found a #{drop.text} Hatching Potion! #{drop.notes}"
|
||||
|
||||
|
|
@ -151,12 +151,14 @@ randomDrop = (user, delta, priority, streak = 0) ->
|
|||
|
||||
user.items.lastDrop.date = +new Date
|
||||
user.items.lastDrop.count++
|
||||
paths['items.lastDrop'] = true
|
||||
|
||||
# {task} task you want to score
|
||||
# {direction} 'up' or 'down'
|
||||
obj.score = (user, task, direction, times=1, cron=false) ->
|
||||
obj.score = (user, task, direction, options={}) ->
|
||||
{gp, hp, exp, lvl} = user.stats
|
||||
{type, value, streak} = task
|
||||
[paths, times, cron] = [options.paths || {}, options.times || 1, options.cron || false]
|
||||
priority = task.priority or '!'
|
||||
|
||||
# If they're trying to purhcase a too-expensive reward, confirm they want to take a hit for it
|
||||
|
|
@ -198,10 +200,10 @@ obj.score = (user, task, direction, times=1, cron=false) ->
|
|||
# Add habit value to habit-history (if different)
|
||||
if (delta > 0) then addPoints() else subtractPoints()
|
||||
if task.value != value
|
||||
(task.history ?= []).push { date: +new Date, value: value }
|
||||
(task.history ?= []).push { date: +new Date, value: value }; paths["tasks.#{task.id}.history"] = true
|
||||
|
||||
when 'daily'
|
||||
if cron? # cron
|
||||
if cron
|
||||
calculateDelta()
|
||||
subtractPoints()
|
||||
task.streak = 0
|
||||
|
|
@ -214,6 +216,7 @@ obj.score = (user, task, direction, times=1, cron=false) ->
|
|||
else
|
||||
streak = if streak then streak - 1 else 0
|
||||
task.streak = streak
|
||||
paths["tasks.#{task.id}.streak"] = true
|
||||
|
||||
when 'todo'
|
||||
if cron? #cron
|
||||
|
|
@ -235,11 +238,11 @@ obj.score = (user, task, direction, times=1, cron=false) ->
|
|||
# hp - gp difference
|
||||
gp = 0
|
||||
|
||||
task.value = value
|
||||
updateStats user, { hp, exp, gp }
|
||||
task.value = value; paths["tasks.#{task.id}.value"] = true
|
||||
updateStats user, { hp, exp, gp }, paths
|
||||
|
||||
# Drop system #FIXME
|
||||
randomDrop(user, delta, priority, streak) if direction is 'up'
|
||||
randomDrop(user, delta, priority, streak, paths) if direction is 'up'
|
||||
|
||||
return delta
|
||||
|
||||
|
|
@ -248,7 +251,7 @@ obj.score = (user, task, direction, times=1, cron=false) ->
|
|||
{stats} new stats
|
||||
{update} if aggregated changes, pass in userObj as update. otherwise commits will be made immediately
|
||||
###
|
||||
updateStats = (user, newStats) ->
|
||||
updateStats = (user, newStats, paths) ->
|
||||
# if user is dead, dont do anything
|
||||
return if user.stats.hp <= 0
|
||||
|
||||
|
|
@ -259,6 +262,7 @@ updateStats = (user, newStats) ->
|
|||
return
|
||||
else
|
||||
user.stats.hp = newStats.hp
|
||||
paths['stats.hp'] = true
|
||||
|
||||
if newStats.exp?
|
||||
tnl = obj.tnl(user.stats.lvl)
|
||||
|
|
@ -282,19 +286,21 @@ updateStats = (user, newStats) ->
|
|||
user.stats.hp = 50
|
||||
|
||||
user.stats.exp = newStats.exp
|
||||
|
||||
paths["stats.exp"]=true; paths['stats.lvl']=true; paths['stats.gp']=true; paths['stats.hp']=true;
|
||||
#if silent
|
||||
#console.log("pushing silent :" + obj.stats.exp)
|
||||
|
||||
|
||||
# Set flags when they unlock features
|
||||
if !user.flags.customizationsNotification and (user.stats.exp > 10 or user.stats.lvl > 1)
|
||||
user.flags.customizationsNotification = true
|
||||
user.flags.customizationsNotification = true; paths['flags.customizationsNotification']=true;
|
||||
if !user.flags.itemsEnabled and user.stats.lvl >= 2
|
||||
user.flags.itemsEnabled = true
|
||||
user.flags.itemsEnabled = true; paths['flags.itemsEnabled']=true;
|
||||
if !user.flags.partyEnabled and user.stats.lvl >= 3
|
||||
user.flags.partyEnabled = true
|
||||
user.flags.partyEnabled = true; paths['flags.partyEnabled']=true;
|
||||
if !user.flags.dropsEnabled and user.stats.lvl >= 4
|
||||
user.flags.dropsEnabled = true
|
||||
user.flags.dropsEnabled = true; paths['flags.dropsEnabled']=true;
|
||||
|
||||
if newStats.gp?
|
||||
#FIXME what was I doing here? I can't remember, gp isn't defined
|
||||
|
|
@ -338,7 +344,7 @@ obj.cron = (user) ->
|
|||
thatDay = moment(today).subtract('days', n + 1)
|
||||
scheduleMisses++ if helpers.shouldDo(thatDay, repeat, obj.preferences?.dayStart) is true
|
||||
#FIXME with times & cron
|
||||
score(user, task, 'down', scheduleMisses, true) if scheduleMisses > 0
|
||||
score(user, task, 'down', {times:scheduleMisses, cron:true}) if scheduleMisses > 0
|
||||
|
||||
switch type
|
||||
when 'daily'
|
||||
|
|
|
|||
Loading…
Reference in a new issue