feat(Armoire): WIP
This commit is contained in:
@@ -140,6 +140,9 @@ gear =
|
||||
201502: text: t('weaponMystery201502Text'), notes: t('weaponMystery201502Notes'), mystery:'201502', value: 0
|
||||
201505: text: t('weaponMystery201505Text'), notes: t('weaponMystery201505Notes'), mystery:'201505', value: 0
|
||||
301404: text: t('weaponMystery301404Text'), notes: t('weaponMystery301404Notes'), mystery:'301404', value: 0
|
||||
armoire:
|
||||
basicCrossbow: text: t('weaponArmoireBasicCrossbowText'), notes: t('weaponArmoireBasicCrossbowNotes', {str: 5, per: 5, con: 5}), value: 100, str: 5, per: 5, con: 5
|
||||
lunarSceptre: text: t('weaponArmoireLunarSceptreText'), notes: t('weaponArmoireLunarSceptreNotes', {con: 7, int: 7}), value: 100, con: 7, int: 7, set: 'soothing'
|
||||
|
||||
armor:
|
||||
base:
|
||||
@@ -224,6 +227,9 @@ gear =
|
||||
201503: text: t('armorMystery201503Text'), notes: t('armorMystery201503Notes'), mystery:'201503', value: 0
|
||||
201504: text: t('armorMystery201504Text'), notes: t('armorMystery201504Notes'), mystery:'201504', value: 0
|
||||
301404: text: t('armorMystery301404Text'), notes: t('armorMystery301404Notes'), mystery:'301404', value: 0
|
||||
armoire:
|
||||
lunarArmor: text: t('armorArmoireLunarArmorText'), notes: t('armorArmoireLunarArmorNotes', {str: 7, int: 7}), value: 100, str: 7, int: 7, set: 'soothing'
|
||||
gladiatorArmor: text: t('armorArmoireGladiatorArmorText'), notes: t('armorArmoireGladiatorArmorNotes', {str: 7, per: 7}), value: 100, str: 7, per: 7, set: 'gladiator'
|
||||
|
||||
head:
|
||||
base:
|
||||
@@ -306,6 +312,12 @@ gear =
|
||||
201505: text: t('headMystery201505Text'), notes: t('headMystery201505Notes'), mystery:'201505', value: 0
|
||||
301404: text: t('headMystery301404Text'), notes: t('headMystery301404Notes'), mystery:'301404', value: 0
|
||||
301405: text: t('headMystery301405Text'), notes: t('headMystery301405Notes'), mystery:'301405', value: 0
|
||||
armoire:
|
||||
lunarCrown: text: t('headArmoireLunarCrownText'), notes: t('headArmoireLunarCrownNotes', {con: 7, per: 7}), value: 100, con: 7, per: 7, set: 'soothing'
|
||||
redHairbow: text: t('headArmoireRedHairbowText'), notes: t('headArmoireRedHairbowNotes', {str: 5, int: 5, con: 5}), value: 100, str: 5, int: 5, con: 5
|
||||
violetFloppyHat: text: t('headArmoireVioletFloppyHatText'), notes: t('headArmoireVioletFloppyHatNotes', {per: 5, int: 5, con: 5}), value: 100, per: 5, int: 5, con: 5
|
||||
gladiatorHelm: text: t('headArmoireGladiatorHelmText'), notes: t('headArmoireGladiatorHelmNotes', {per: 7, int: 7}), value: 100, per: 7, int: 7, set: 'gladiator'
|
||||
rancherHat: text: t('headArmoireRancherHatText'), notes: t('headArmoireRancherHatNotes', {str: 5, per: 5, int: 5}), value: 100, str: 5, per: 5, int: 5
|
||||
|
||||
shield:
|
||||
base:
|
||||
@@ -365,6 +377,8 @@ gear =
|
||||
spring2015Healer: event: events.spring2015, specialClass: 'healer', text: t('shieldSpecialSpring2015HealerText'), notes: t('shieldSpecialSpring2015HealerNotes', {con: 9}), value: 70, con: 9
|
||||
mystery:
|
||||
301405: text: t('shieldMystery301405Text'), notes: t('shieldMystery301405Notes'), mystery:'301405', value: 0
|
||||
armoire:
|
||||
gladiatorShield: text: t('shieldArmoireGladiatorShieldText'), notes: t('shieldArmoireGladiatorShieldNotes', {con: 5, str: 5}), value: 100, con: 5, str: 5, set: 'gladiator'
|
||||
|
||||
back:
|
||||
base:
|
||||
@@ -442,7 +456,7 @@ api.gear =
|
||||
flat: {}
|
||||
|
||||
_.each gearTypes, (type) ->
|
||||
_.each classes.concat(['base', 'special', 'mystery']), (klass) ->
|
||||
_.each classes.concat(['base', 'special', 'mystery', 'armoire']), (klass) ->
|
||||
# add "type" to each item, so we can reference that as "weapon" or "armor" in the html
|
||||
_.each gear[type][klass], (item, i) ->
|
||||
key = "#{type}_#{klass}_#{i}"
|
||||
@@ -475,11 +489,12 @@ api.timeTravelerStore = (owned) ->
|
||||
|
||||
###
|
||||
---------------------------------------------------------------
|
||||
Potion
|
||||
Unique Rewards: Potion and Armoire
|
||||
---------------------------------------------------------------
|
||||
###
|
||||
|
||||
api.potion = type: 'potion', text: t('potionText'), notes: t('potionNotes'), value: 25, key: 'potion'
|
||||
api.armoire = type: 'armoire', text: t('armoireText'), notes: t('armoireNotesFull'), value: 100, key: 'armoire', canOwn: ((u)-> _.contains(u.achievements.ultimateGearSets, true))
|
||||
|
||||
###
|
||||
---------------------------------------------------------------
|
||||
|
||||
+36
-31
@@ -166,6 +166,7 @@ api.updateStore = (user) ->
|
||||
changes = changes.concat _.filter content.gear.flat, (v) ->
|
||||
v.klass in ['special','mystery'] and !user.items.gear.owned[v.key] and v.canOwn?(user)
|
||||
changes.push content.potion
|
||||
if user.flags.armoireEnabled then changes.push content.armoire
|
||||
# Return sorted store (array)
|
||||
_.sortBy changes, (c)->sortOrder[c.type]
|
||||
|
||||
@@ -835,23 +836,40 @@ api.wrap = (user, main=true) ->
|
||||
buy: (req, cb) ->
|
||||
{key} = req.params
|
||||
|
||||
item = if key is 'potion' then content.potion else content.gear.flat[key]
|
||||
item = if key is 'potion' then content.potion
|
||||
else if key is 'armoire' then content.armoire
|
||||
else content.gear.flat[key]
|
||||
return cb?({code:404, message:"Item '#{key} not found (see https://github.com/HabitRPG/habitrpg-shared/blob/develop/script/content.coffee)"}) unless item
|
||||
return cb?({code:401, message: i18n.t('messageNotEnoughGold', req.language)}) if user.stats.gp < item.value
|
||||
return cb?({code:401, message: "You can't own this item"}) if item.canOwn? and !item.canOwn(user)
|
||||
return cb?({code:401, message: "You can't buy this item"}) if item.canOwn? and !item.canOwn(user)
|
||||
if item.key is 'potion'
|
||||
user.stats.hp += 15
|
||||
user.stats.hp = 50 if user.stats.hp > 50
|
||||
else if item.key is 'armoire'
|
||||
armoireResult = user.fns.predictableRandom()
|
||||
eligibleEquipment = _.filter(content.gear.flat, ((i)->i.klass is 'armoire' and !user.items.gear.owned[i.key]))
|
||||
if !_.isEmpty(eligibleEquipment) and (armoireResult < .7 or !user.flags.armoireOpened)
|
||||
drop = user.fns.randomVal(eligibleEquipment)
|
||||
user.items.gear.owned[drop.key] = true
|
||||
user.flags.armoireOpened = true
|
||||
message = i18n.t('armoireEquipment', {dropText: drop.text(req.language)}, req.language)
|
||||
else if (!_.isEmpty(eligibleEquipment) and armoireResult < .85) or armoireResult < .6
|
||||
drop = user.fns.randomVal _.where(content.food, {canDrop:true})
|
||||
user.items.food[drop.key] ?= 0
|
||||
user.items.food[drop.key] += 1
|
||||
message = i18n.t('armoireFood', {dropArticle: drop.article, dropText: drop.text(req.language)}, req.language)
|
||||
else
|
||||
user.stats.exp += Math.floor(user.fns.predictableRandom(user.stats.exp) * 40 + 10)
|
||||
message = i18n.t('armoireExp', req.language)
|
||||
else
|
||||
user.items.gear.equipped[item.type] = item.key
|
||||
user.items.gear.owned[item.key] = true
|
||||
message = user.fns.handleTwoHanded(item, null, req)
|
||||
message ?= i18n.t('messageBought', {itemText: item.text(req.language)}, req.language)
|
||||
if not user.achievements.ultimateGear and item.last
|
||||
user.fns.ultimateGear()
|
||||
if item.last then user.fns.ultimateGear()
|
||||
user.stats.gp -= item.value
|
||||
mixpanel?.track("Acquire Item",{'itemName':key,'acquireMethod':'Gold','goldCost':item.value})
|
||||
cb? {code:200, message}, _.pick(user,$w 'items achievements stats')
|
||||
cb? {code:200, message}, _.pick(user,$w 'items achievements stats flags')
|
||||
|
||||
buyMysterySet: (req, cb)->
|
||||
return cb?({code:401, message:"You don't have enough Mystic Hourglasses"}) unless user.purchased.plan.consecutive.trinkets>0
|
||||
@@ -1660,32 +1678,19 @@ api.wrap = (user, main=true) ->
|
||||
# ----------------------------------------------------------------------
|
||||
# Achievements
|
||||
# ----------------------------------------------------------------------
|
||||
ultimateGear: () ->
|
||||
# on the server this is a LoDash transform, on the client its an object
|
||||
gear = if window? then user.items.gear.owned else user.items.gear.owned.toObject()
|
||||
ownedLastGear = _.chain(content.gear.flat)
|
||||
.pick(_.keys gear)
|
||||
.values()
|
||||
.filter (gear) -> gear.last
|
||||
|
||||
lastGearClassTypeMatrix = {}
|
||||
_.each content.classes, (klass) ->
|
||||
lastGearClassTypeMatrix[klass] = {}
|
||||
#_.each content.gearTypes, (type) ->
|
||||
_.each ['armor', 'weapon', 'shield', 'head'], (type) ->
|
||||
lastGearClassTypeMatrix[klass][type] = false
|
||||
return true # false exits the each loop early
|
||||
|
||||
ownedLastGear.each (gear) ->
|
||||
lastGearClassTypeMatrix[gear.klass]["shield"] = true if gear.twoHanded
|
||||
lastGearClassTypeMatrix[gear.klass][gear.type] = true
|
||||
|
||||
shouldGrant = _(lastGearClassTypeMatrix)
|
||||
.values()
|
||||
.reduce(((ans, klass) -> ans or _(klass).values().reduce(((ans, gearType) -> ans and gearType), true)), false)
|
||||
.valueOf()
|
||||
|
||||
user.achievements.ultimateGear = shouldGrant
|
||||
ultimateGear: ->
|
||||
# on the server this is a Lodash transform, on the client its an object
|
||||
owned = if window? then user.items.gear.owned else user.items.gear.owned.toObject()
|
||||
user.achievements.ultimateGearSets ?= {healer: false, wizard: false, rogue: false, warrior: false}
|
||||
content.classes.forEach (klass) ->
|
||||
user.achievements.ultimateGearSets[klass] = _.reduce ['armor', 'shield', 'head', 'weapon'], (soFarGood, type) ->
|
||||
found = _.find content.gear.tree[type][klass], {last:true}
|
||||
soFarGood and (!found or owned[found.key]==true) #!found only true when weapon is two-handed (mages)
|
||||
, true # start with true, else `and` will fail right away
|
||||
user.markModified? 'achievements.ultimateGearSets'
|
||||
if _.contains(user.achievements.ultimateGearSets, true) and user.flags.armoireEnabled != true
|
||||
user.flags.armoireEnabled = true
|
||||
user.markModified? 'flags'
|
||||
|
||||
nullify: ->
|
||||
user.ops = null
|
||||
|
||||
Reference in New Issue
Block a user