Merge remote-tracking branch 'origin/sabe/attributes' into develop

This commit is contained in:
Tyler Renelle
2014-01-04 15:58:16 -07:00
2 changed files with 107 additions and 20 deletions
+39 -2
View File
@@ -747,6 +747,7 @@ api.wrap = (user) ->
nextDelta *= task.checklist.length
unless task.type is 'reward'
if (user.preferences.automaticAllocation is true and user.preferences.allocationMode is 'taskbased') then user.stats.training[task.attribute] += nextDelta
adjustAmt = nextDelta
# ===== STRENGTH =====
# (Only for up-scoring, ignore up-onlies and rewards)
@@ -1004,6 +1005,43 @@ api.wrap = (user) ->
{stats} new stats
{update} if aggregated changes, pass in userObj as update. otherwise commits will be made immediately
###
autoAllocate: ->
switch user.preferences.allocationMode
when "flat"
suggested = Math.min(user.stats.str, user.stats.int, user.stats.con, user.stats.per)
if user.stats.int is suggested # In case of ties, favor INT first, to get the next point sooner
return "int"
else if user.stats.per is suggested # Then favor PER, it's a god stat
return "per"
else if user.stats.str is suggested # Then favor STR, everyone loves crits
return "str"
else
return "con" # CON, the unsexiest of attributes
when "classbased"
# Attributes get 3:2:1:1 per 7 levels.
ideal = [(user.stats.lvl / 7 * 3), (user.stats.lvl / 7 * 2), (user.stats.lvl / 7), (user.stats.lvl / 7)]
# Primary, secondary etc. attributes aren't explicitly defined, so hardcode them. In order as above
switch user.stats.class
when "wizard" then preference = ["int", "per", "con", "str"]
when "rogue" then preference = ["per", "str", "int", "con"]
when "healer" then preference = ["con", "int", "str", "per"]
else preference = ["str", "con", "per", "int"]
# Get the difference between the ideal attribute spread according to level, and the user's current spread.
diff = [(user.stats[preference[0]]-ideal[0]),(user.stats[preference[1]]-ideal[1]),(user.stats[preference[2]]-ideal[2]),(user.stats[preference[3]]-ideal[3])]
suggested = _.findIndex(diff, ((val) -> if val is _.min(diff) then true)) # Returns the index of the first attribute that's furthest behind the ideal
if suggested is -1 then return "str" else return preference[suggested] # If _.findIndex failed, we'd get a -1...
when "taskbased"
suggested = _.findKey(user.stats.training, ((val) -> if val is _.max(user.stats.training) then val)) # Returns the stat that's been trained up the most this level
# FIXME Reset training for this level. Tried _.each but couldn't get it to take.
user.stats.training.str = 0
user.stats.training.int = 0
user.stats.training.con = 0
user.stats.training.per = 0
if suggested is undefined then return "str" else return suggested # Failed _.findkey gives undefined
# tallies = _.reduce user.tasks, ((m,v)-> m[v.attribute or 'str'] += v.value;m), {str:0,int:0,con:0,per:0}
# suggested = _.reduce tallies, ((m,v,k)-> if v>tallies[m] then k else m), 'str'
else return "str" # if all else fails, dump into STR
updateStats: (stats) ->
# Game Over
return user.stats.hp=0 if stats.hp <= 0
@@ -1029,8 +1067,7 @@ api.wrap = (user) ->
# Auto-allocate a point, or give them a new manual point
if user.preferences.automaticAllocation
tallies = _.reduce user.tasks, ((m,v)-> m[v.attribute or 'str'] += v.value;m), {str:0,int:0,con:0,per:0}
suggested = _.reduce tallies, ((m,v,k)-> if v>tallies[m] then k else m), 'str'
suggested = user.fns.autoAllocate()
user.stats[suggested]++
else
# add new allocatable points. We could do user.stats.points++, but this does a fail-safe just in case