From fc841d0ad4bb63c6aa5250dfdabaa2c477b6dade Mon Sep 17 00:00:00 2001 From: Sabe Jones Date: Thu, 29 Aug 2019 15:22:12 -0400 Subject: [PATCH] Hourglass Quest (#11325) * feat(content): Hourglass Quest * fix(hourglasses): NaN from undefined * fix(quests): sanity check for negative scrolls * fix(hourglasses): don't show quantity selection for binary items * fix(route): validate number, use body not params * test(timetrav): add quest tests --- .../user/POST-user_purchase_hourglass.test.js | 20 ++++++- website/client/components/shops/buyModal.vue | 2 +- .../components/shops/quests/buyQuestModal.vue | 10 +++- .../components/shops/timeTravelers/index.vue | 41 +++++++++++-- website/client/store/actions/shops.js | 5 +- website/common/locales/en/content.json | 4 ++ website/common/locales/en/questsContent.json | 11 +++- website/common/script/content/eggs.js | 6 ++ website/common/script/content/quests.js | 44 ++++++++++++++ website/common/script/libs/getItemInfo.js | 8 ++- website/common/script/libs/shops.js | 14 +++++ website/common/script/ops/buy/buy.js | 12 +++- .../script/ops/buy/hourglassPurchase.js | 55 +++++++++++------- .../spritesmith/quests/bosses/quest_robot.png | Bin 0 -> 9379 bytes .../quests/items/quest_robot_bolt.png | Bin 0 -> 427 bytes .../quests/items/quest_robot_gear.png | Bin 0 -> 547 bytes .../quests/items/quest_robot_spring.png | Bin 0 -> 376 bytes .../scrolls/inventory_quest_scroll_robot.png | Bin 0 -> 1237 bytes .../spritesmith/stable/eggs/Pet_Egg_Robot.png | Bin 0 -> 637 bytes .../mounts/body/Mount_Body_Robot-Base.png | Bin 0 -> 302 bytes .../body/Mount_Body_Robot-CottonCandyBlue.png | Bin 0 -> 334 bytes .../body/Mount_Body_Robot-CottonCandyPink.png | Bin 0 -> 336 bytes .../mounts/body/Mount_Body_Robot-Desert.png | Bin 0 -> 315 bytes .../mounts/body/Mount_Body_Robot-Golden.png | Bin 0 -> 329 bytes .../mounts/body/Mount_Body_Robot-Red.png | Bin 0 -> 329 bytes .../mounts/body/Mount_Body_Robot-Shade.png | Bin 0 -> 319 bytes .../mounts/body/Mount_Body_Robot-Skeleton.png | Bin 0 -> 772 bytes .../mounts/body/Mount_Body_Robot-White.png | Bin 0 -> 329 bytes .../mounts/body/Mount_Body_Robot-Zombie.png | Bin 0 -> 364 bytes .../mounts/head/Mount_Head_Robot-Base.png | Bin 0 -> 982 bytes .../head/Mount_Head_Robot-CottonCandyBlue.png | Bin 0 -> 1120 bytes .../head/Mount_Head_Robot-CottonCandyPink.png | Bin 0 -> 1060 bytes .../mounts/head/Mount_Head_Robot-Desert.png | Bin 0 -> 1209 bytes .../mounts/head/Mount_Head_Robot-Golden.png | Bin 0 -> 1016 bytes .../mounts/head/Mount_Head_Robot-Red.png | Bin 0 -> 1003 bytes .../mounts/head/Mount_Head_Robot-Shade.png | Bin 0 -> 1021 bytes .../mounts/head/Mount_Head_Robot-Skeleton.png | Bin 0 -> 1057 bytes .../mounts/head/Mount_Head_Robot-White.png | Bin 0 -> 890 bytes .../mounts/head/Mount_Head_Robot-Zombie.png | Bin 0 -> 1585 bytes .../mounts/icon/Mount_Icon_Robot-Base.png | Bin 0 -> 485 bytes .../icon/Mount_Icon_Robot-CottonCandyBlue.png | Bin 0 -> 506 bytes .../icon/Mount_Icon_Robot-CottonCandyPink.png | Bin 0 -> 506 bytes .../mounts/icon/Mount_Icon_Robot-Desert.png | Bin 0 -> 486 bytes .../mounts/icon/Mount_Icon_Robot-Golden.png | Bin 0 -> 499 bytes .../mounts/icon/Mount_Icon_Robot-Red.png | Bin 0 -> 486 bytes .../mounts/icon/Mount_Icon_Robot-Shade.png | Bin 0 -> 458 bytes .../mounts/icon/Mount_Icon_Robot-Skeleton.png | Bin 0 -> 489 bytes .../mounts/icon/Mount_Icon_Robot-White.png | Bin 0 -> 450 bytes .../mounts/icon/Mount_Icon_Robot-Zombie.png | Bin 0 -> 676 bytes .../stable/pets/Pet-Robot-Base.png | Bin 0 -> 1134 bytes .../stable/pets/Pet-Robot-CottonCandyBlue.png | Bin 0 -> 1151 bytes .../stable/pets/Pet-Robot-CottonCandyPink.png | Bin 0 -> 1152 bytes .../stable/pets/Pet-Robot-Desert.png | Bin 0 -> 1148 bytes .../stable/pets/Pet-Robot-Golden.png | Bin 0 -> 1152 bytes .../spritesmith/stable/pets/Pet-Robot-Red.png | Bin 0 -> 1136 bytes .../stable/pets/Pet-Robot-Shade.png | Bin 0 -> 1135 bytes .../stable/pets/Pet-Robot-Skeleton.png | Bin 0 -> 1087 bytes .../stable/pets/Pet-Robot-White.png | Bin 0 -> 1134 bytes .../stable/pets/Pet-Robot-Zombie.png | Bin 0 -> 1179 bytes website/server/controllers/api-v3/news.js | 12 ++-- website/server/controllers/api-v3/user.js | 7 ++- 61 files changed, 209 insertions(+), 42 deletions(-) create mode 100644 website/raw_sprites/spritesmith/quests/bosses/quest_robot.png create mode 100644 website/raw_sprites/spritesmith/quests/items/quest_robot_bolt.png create mode 100644 website/raw_sprites/spritesmith/quests/items/quest_robot_gear.png create mode 100644 website/raw_sprites/spritesmith/quests/items/quest_robot_spring.png create mode 100644 website/raw_sprites/spritesmith/quests/scrolls/inventory_quest_scroll_robot.png create mode 100644 website/raw_sprites/spritesmith/stable/eggs/Pet_Egg_Robot.png create mode 100644 website/raw_sprites/spritesmith/stable/mounts/body/Mount_Body_Robot-Base.png create mode 100644 website/raw_sprites/spritesmith/stable/mounts/body/Mount_Body_Robot-CottonCandyBlue.png create mode 100644 website/raw_sprites/spritesmith/stable/mounts/body/Mount_Body_Robot-CottonCandyPink.png create mode 100644 website/raw_sprites/spritesmith/stable/mounts/body/Mount_Body_Robot-Desert.png create mode 100644 website/raw_sprites/spritesmith/stable/mounts/body/Mount_Body_Robot-Golden.png create mode 100644 website/raw_sprites/spritesmith/stable/mounts/body/Mount_Body_Robot-Red.png create mode 100644 website/raw_sprites/spritesmith/stable/mounts/body/Mount_Body_Robot-Shade.png create mode 100644 website/raw_sprites/spritesmith/stable/mounts/body/Mount_Body_Robot-Skeleton.png create mode 100644 website/raw_sprites/spritesmith/stable/mounts/body/Mount_Body_Robot-White.png create mode 100644 website/raw_sprites/spritesmith/stable/mounts/body/Mount_Body_Robot-Zombie.png create mode 100644 website/raw_sprites/spritesmith/stable/mounts/head/Mount_Head_Robot-Base.png create mode 100644 website/raw_sprites/spritesmith/stable/mounts/head/Mount_Head_Robot-CottonCandyBlue.png create mode 100644 website/raw_sprites/spritesmith/stable/mounts/head/Mount_Head_Robot-CottonCandyPink.png create mode 100644 website/raw_sprites/spritesmith/stable/mounts/head/Mount_Head_Robot-Desert.png create mode 100644 website/raw_sprites/spritesmith/stable/mounts/head/Mount_Head_Robot-Golden.png create mode 100644 website/raw_sprites/spritesmith/stable/mounts/head/Mount_Head_Robot-Red.png create mode 100644 website/raw_sprites/spritesmith/stable/mounts/head/Mount_Head_Robot-Shade.png create mode 100644 website/raw_sprites/spritesmith/stable/mounts/head/Mount_Head_Robot-Skeleton.png create mode 100644 website/raw_sprites/spritesmith/stable/mounts/head/Mount_Head_Robot-White.png create mode 100644 website/raw_sprites/spritesmith/stable/mounts/head/Mount_Head_Robot-Zombie.png create mode 100644 website/raw_sprites/spritesmith/stable/mounts/icon/Mount_Icon_Robot-Base.png create mode 100644 website/raw_sprites/spritesmith/stable/mounts/icon/Mount_Icon_Robot-CottonCandyBlue.png create mode 100644 website/raw_sprites/spritesmith/stable/mounts/icon/Mount_Icon_Robot-CottonCandyPink.png create mode 100644 website/raw_sprites/spritesmith/stable/mounts/icon/Mount_Icon_Robot-Desert.png create mode 100644 website/raw_sprites/spritesmith/stable/mounts/icon/Mount_Icon_Robot-Golden.png create mode 100644 website/raw_sprites/spritesmith/stable/mounts/icon/Mount_Icon_Robot-Red.png create mode 100644 website/raw_sprites/spritesmith/stable/mounts/icon/Mount_Icon_Robot-Shade.png create mode 100644 website/raw_sprites/spritesmith/stable/mounts/icon/Mount_Icon_Robot-Skeleton.png create mode 100644 website/raw_sprites/spritesmith/stable/mounts/icon/Mount_Icon_Robot-White.png create mode 100644 website/raw_sprites/spritesmith/stable/mounts/icon/Mount_Icon_Robot-Zombie.png create mode 100644 website/raw_sprites/spritesmith/stable/pets/Pet-Robot-Base.png create mode 100644 website/raw_sprites/spritesmith/stable/pets/Pet-Robot-CottonCandyBlue.png create mode 100644 website/raw_sprites/spritesmith/stable/pets/Pet-Robot-CottonCandyPink.png create mode 100644 website/raw_sprites/spritesmith/stable/pets/Pet-Robot-Desert.png create mode 100644 website/raw_sprites/spritesmith/stable/pets/Pet-Robot-Golden.png create mode 100644 website/raw_sprites/spritesmith/stable/pets/Pet-Robot-Red.png create mode 100644 website/raw_sprites/spritesmith/stable/pets/Pet-Robot-Shade.png create mode 100644 website/raw_sprites/spritesmith/stable/pets/Pet-Robot-Skeleton.png create mode 100644 website/raw_sprites/spritesmith/stable/pets/Pet-Robot-White.png create mode 100644 website/raw_sprites/spritesmith/stable/pets/Pet-Robot-Zombie.png diff --git a/test/api/v3/integration/user/POST-user_purchase_hourglass.test.js b/test/api/v3/integration/user/POST-user_purchase_hourglass.test.js index 7d68478668..721eb69aa9 100644 --- a/test/api/v3/integration/user/POST-user_purchase_hourglass.test.js +++ b/test/api/v3/integration/user/POST-user_purchase_hourglass.test.js @@ -14,7 +14,7 @@ describe('POST /user/purchase-hourglass/:type/:key', () => { // More tests in common code unit tests - it('buys a hourglass pet', async () => { + it('buys an hourglass pet', async () => { let response = await user.post('/user/purchase-hourglass/pets/MantisShrimp-Base'); await user.sync(); @@ -22,4 +22,22 @@ describe('POST /user/purchase-hourglass/:type/:key', () => { expect(user.purchased.plan.consecutive.trinkets).to.eql(1); expect(user.items.pets['MantisShrimp-Base']).to.eql(5); }); + + it('buys an hourglass quest', async () => { + let response = await user.post('/user/purchase-hourglass/quests/robot'); + await user.sync(); + + expect(response.message).to.eql(t('hourglassPurchase')); + expect(user.purchased.plan.consecutive.trinkets).to.eql(1); + expect(user.items.quests.robot).to.eql(1); + }); + + it('buys multiple hourglass quests', async () => { + let response = await user.post('/user/purchase-hourglass/quests/robot', {quantity: 2}); + await user.sync(); + + expect(response.message).to.eql(t('hourglassPurchase')); + expect(user.purchased.plan.consecutive.trinkets).to.eql(0); + expect(user.items.quests.robot).to.eql(2); + }); }); diff --git a/website/client/components/shops/buyModal.vue b/website/client/components/shops/buyModal.vue index de3038cc18..99de909e01 100644 --- a/website/client/components/shops/buyModal.vue +++ b/website/client/components/shops/buyModal.vue @@ -306,7 +306,7 @@ const hideAmountSelectionForPurchaseTypes = [ 'gear', 'backgrounds', 'mystery_set', 'card', 'rebirth_orb', 'fortify', 'armoire', 'keys', - 'debuffPotion', + 'debuffPotion', 'pets', 'mounts', ]; export default { diff --git a/website/client/components/shops/quests/buyQuestModal.vue b/website/client/components/shops/quests/buyQuestModal.vue index bb7000a436..82f60b833a 100644 --- a/website/client/components/shops/quests/buyQuestModal.vue +++ b/website/client/components/shops/quests/buyQuestModal.vue @@ -23,7 +23,7 @@ strong {{ $t('howManyToBuy') }} .box input(type='number', min='0', step='1', v-model.number='selectedAmountToBuy') - span.svg-icon.inline.icon-32(aria-hidden="true", v-html="(priceType === 'gems') ? icons.gem : icons.gold") + span.svg-icon.inline.icon-32(aria-hidden="true", v-html="currencyIcon") span.value(:class="priceType") {{ item.value }} button.btn.btn-primary( @@ -44,6 +44,7 @@ div.clearfix(slot="modal-footer") span.balance.float-left {{ $t('yourBalance') }} balanceInfo( + :withHourglass="priceType === 'hourglasses'", :currencyNeeded="priceType", :amountNeeded="item.value" ).float-right @@ -202,6 +203,7 @@ import svgGem from 'assets/svg/gem.svg'; import svgPin from 'assets/svg/pin.svg'; import svgExperience from 'assets/svg/experience.svg'; + import svgHourglasses from 'assets/svg/hourglass.svg'; import BalanceInfo from '../balanceInfo.vue'; import currencyMixin from '../_currencyMixin'; @@ -229,6 +231,7 @@ gem: svgGem, pin: svgPin, experience: svgExperience, + hourglass: svgHourglasses, }), isPinned: false, @@ -258,6 +261,11 @@ return this.item.notes; } }, + currencyIcon () { + if (this.priceType === 'gold') return this.icons.gold; + if (this.priceType === 'hourglasses') return this.icons.hourglass; + return this.icons.gem; + }, }, methods: { onChange ($event) { diff --git a/website/client/components/shops/timeTravelers/index.vue b/website/client/components/shops/timeTravelers/index.vue index b3a2ee7813..5521ce2770 100644 --- a/website/client/components/shops/timeTravelers/index.vue +++ b/website/client/components/shops/timeTravelers/index.vue @@ -68,9 +68,13 @@ :emptyItem="false", @click="selectItemToBuy(ctx.item)" ) - span(slot="popoverContent", slot-scope="ctx") + span(slot="popoverContent", slot-scope="ctx", v-if="category !== 'quests'") div h4.popover-content-title {{ ctx.item.text }} + span(slot="popoverContent", slot-scope="ctx", v-if="category === 'quests'") + div.questPopover + h4.popover-content-title {{ item.text }} + questInfo(:quest="item") template(slot="itemBadge", slot-scope="ctx") span.badge.badge-pill.badge-item.badge-svg( @@ -79,6 +83,18 @@ @click.prevent.stop="togglePinned(ctx.item)" ) span.svg-icon.inline.icon-12.color(v-html="icons.pin") + buyQuestModal( + :item="selectedItemToBuy || {}", + :priceType="selectedItemToBuy ? selectedItemToBuy.currency : ''", + :withPin="true", + @change="resetItemToBuy($event)", + ) + template(slot="item", slot-scope="ctx") + item.flat( + :item="ctx.item", + :itemContentClass="ctx.item.class", + :showPopover="false" + )