diff --git a/common/locales/en/character.json b/common/locales/en/character.json index 4e3f8a4645..dfb6cfab20 100644 --- a/common/locales/en/character.json +++ b/common/locales/en/character.json @@ -52,6 +52,7 @@ "classEquipBonus": "Class Bonus", "battleGear": "Battle Gear", "battleGearText": "This is the gear you wear into battle; it affects numbers when interacting with your tasks.", + "autoEquipBattleGear": "Auto-equip new gear", "costume": "Costume", "costumeText": "If you prefer the look of other gear to what you have equipped, check the \"Use Costume\" box to visually don a costume while wearing your battle gear underneath.", "useCostume": "Use Costume", diff --git a/common/script/index.coffee b/common/script/index.coffee index 4ed93b832a..473167bc2e 100644 --- a/common/script/index.coffee +++ b/common/script/index.coffee @@ -978,7 +978,7 @@ api.wrap = (user, main=true) -> message = i18n.t('armoireExp', req.language) armoireResp = {"type": "experience", "value": armoireExp} else - user.items.gear.equipped[item.type] = item.key + if user.preferences.autoEquip then 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) diff --git a/test/common/algos.mocha.coffee b/test/common/algos.mocha.coffee index 5f98890666..642156b752 100644 --- a/test/common/algos.mocha.coffee +++ b/test/common/algos.mocha.coffee @@ -30,7 +30,9 @@ newUser = (addTasks=true)-> quest: progress: down: 0 - preferences: {} + preferences: { + autoEquip: true + } dailys: [] todos: [] rewards: [] @@ -145,7 +147,7 @@ describe 'User', -> buffs = {per:0, int:0, con:0, str:0, stealth: 0, streaks: false} expect(user.stats).to.eql { str: 1, con: 1, per: 1, int: 1, hp: 50, mp: 32, lvl: 1, exp: 0, gp: 0, class: 'warrior', buffs: buffs } expect(user.items.gear).to.eql { equipped: base_gear, costume: base_gear, owned: {weapon_warrior_0: true} } - expect(user.preferences).to.eql { costume: false } + expect(user.preferences).to.eql { autoEquip: true, costume: false } it 'calculates max MP', -> user = newUser() @@ -392,33 +394,6 @@ describe 'User', -> } describe 'store', -> - it 'recovers hp buying potions', -> - user = newUser() - user.stats.hp = 30 - user.stats.gp = 50 - user.ops.buy {params: {key: 'potion'}} - expect(user).toHaveHP 45 - expect(user).toHaveGP 25 - - user.ops.buy {params: {key: 'potion'}} - expect(user).toHaveHP 50 # don't exceed max hp - expect(user).toHaveGP 0 - - it 'buys equipment', -> - user = newUser() - user.stats.gp = 31 - user.ops.buy {params: {key: 'armor_warrior_1'}} - expect(user.items.gear.owned).to.eql { weapon_warrior_0: true, armor_warrior_1: true } - expect(user.items.gear.equipped).to.eql { armor: 'armor_warrior_1', weapon: 'weapon_base_0', head: 'head_base_0', shield: 'shield_base_0' } - expect(user).toHaveGP 1 - - it 'does not buy equipment without enough Gold', -> - user = newUser() - user.stats.gp = 1 - user.ops.buy {params: {key: 'armor_warrior_1'}} - expect(user.items.gear.equipped).to.eql { armor: 'armor_base_0', weapon: 'weapon_base_0', head: 'head_base_0', shield: 'shield_base_0' } - expect(user).toHaveGP 1 - it 'buys a Quest scroll', -> user = newUser() user.stats.gp = 205 diff --git a/test/common/user.fns.buy.test.js b/test/common/user.fns.buy.test.js index bcfe333d27..05f7abb78d 100644 --- a/test/common/user.fns.buy.test.js +++ b/test/common/user.fns.buy.test.js @@ -16,9 +16,13 @@ describe('user.fns.buy', function() { gear: { owned: { weapon_warrior_0: true + }, + equipped: { + weapon_warrior_0: true } } }, + preferences: {}, stats: { gp: 200 }, achievements: { }, flags: { } @@ -36,13 +40,77 @@ describe('user.fns.buy', function() { }); context('Potion', function() { - it('recovers hp'); + it('recovers 15 hp', function() { + user.stats.hp = 30; + user.ops.buy({params: {key: 'potion'}}); + expect(user.stats.hp).to.eql(45); + }); + + it('does not increase hp above 50', function() { + user.stats.hp = 45; + user.ops.buy({params: {key: 'potion'}}); + expect(user.stats.hp).to.eql(50); + }); + + it('deducts 25 gp', function() { + user.stats.hp = 45; + user.ops.buy({params: {key: 'potion'}}); + + expect(user.stats.gp).to.eql(175); + }); + + it('does not purchase if not enough gp', function() { + user.stats.hp = 45; + user.stats.gp = 5; + user.ops.buy({params: {key: 'potion'}}); + + expect(user.stats.hp).to.eql(45); + expect(user.stats.gp).to.eql(5); + }); }); context('Gear', function() { - it('buys equipment'); + it('adds equipment to inventory', function() { + user.stats.gp = 31; - it('does not buy equipment without enough Gold'); + user.ops.buy({params: {key: 'armor_warrior_1'}}); + + expect(user.items.gear.owned).to.eql({ weapon_warrior_0: true, armor_warrior_1: true }); + }); + + it('deducts gold from user', function() { + user.stats.gp = 31; + + user.ops.buy({params: {key: 'armor_warrior_1'}}); + + expect(user.stats.gp).to.eql(1); + }); + + it('auto equips equipment if user has auto-equip preference turned on', function() { + user.stats.gp = 31; + user.preferences.autoEquip = true; + + user.ops.buy({params: {key: 'armor_warrior_1'}}); + + expect(user.items.gear.equipped).to.have.property('armor', 'armor_warrior_1'); + }); + + it('buys equipment but does not auto-equip', function() { + user.stats.gp = 31; + user.preferences.autoEquip = false; + + user.ops.buy({params: {key: 'armor_warrior_1'}}); + + expect(user.items.gear.equipped).to.not.have.property('armor'); + }); + + it('does not buy equipment without enough Gold', function() { + user.stats.gp = 20; + + user.ops.buy({params: {key: 'armor_warrior_1'}}); + + expect(user.items.gear.owned).to.not.have.property('armor_warrior_1'); + }); }); context('Quests', function() { diff --git a/website/src/models/user.js b/website/src/models/user.js index fbcf62ec8c..d55a06c2d1 100644 --- a/website/src/models/user.js +++ b/website/src/models/user.js @@ -347,6 +347,7 @@ var UserSchema = new Schema({ language: String, automaticAllocation: Boolean, allocationMode: {type:String, enum: ['flat','classbased','taskbased'], 'default': 'flat'}, + autoEquip: {type: Boolean, 'default': true}, costume: Boolean, dateFormat: {type: String, enum:['MM/dd/yyyy', 'dd/MM/yyyy', 'yyyy/MM/dd'], 'default': 'MM/dd/yyyy'}, sleep: {type: Boolean, 'default': false}, diff --git a/website/views/options/inventory/equipment.jade b/website/views/options/inventory/equipment.jade index ba45f9a693..8d77a25a8b 100644 --- a/website/views/options/inventory/equipment.jade +++ b/website/views/options/inventory/equipment.jade @@ -4,6 +4,13 @@ h3.equipment-title.hint(popover-trigger='mouseenter', popover-placement='right', popover-append-to-body='true', popover=env.t('battleGearText'))=env.t('battleGear') + + .checkbox.equipment-title + label + input(type="checkbox", ng-model="user.preferences.autoEquip", + ng-change='set({"preferences.autoEquip":user.preferences.autoEquip ? true : false})') + |   + =env.t('autoEquipBattleGear') div button.btn.btn-default(type="button", ng-click='dequip("battleGear");') {{env.t("unequipBattleGear")}}