From ccc1d5b26e9b9824f469e92a32003debbb3e47a6 Mon Sep 17 00:00:00 2001 From: CuriousMagpie Date: Wed, 29 Dec 2021 16:33:11 -0500 Subject: [PATCH 01/23] code from abandoned PR #13382 --- .../src/components/shops/quests/questPopover.vue | 2 +- website/common/script/libs/getItemInfo.js | 11 +++++++++++ website/common/script/ops/buy/buyQuestGold.js | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/website/client/src/components/shops/quests/questPopover.vue b/website/client/src/components/shops/quests/questPopover.vue index 40b4b59e35..b50aaa328a 100644 --- a/website/client/src/components/shops/quests/questPopover.vue +++ b/website/client/src/components/shops/quests/questPopover.vue @@ -13,7 +13,7 @@ {{ item.text }}
{{ $t('questUnlockLostMasterclasser') }} diff --git a/website/common/script/libs/getItemInfo.js b/website/common/script/libs/getItemInfo.js index e7ffb300b6..4bd5e5fdcf 100644 --- a/website/common/script/libs/getItemInfo.js +++ b/website/common/script/libs/getItemInfo.js @@ -8,7 +8,18 @@ import isPinned from './isPinned'; import isFreeRebirth from './isFreeRebirth'; import getOfficialPinnedItems from './getOfficialPinnedItems'; +function userAbleToStartMasterclasser (user) { + return user.achievements.quests.dilatoryDistress3 + && user.achievements.quests.mayhemMistiflying3 + && user.achievements.quests.stoikalmCalamity3 + && user.achievements.quests.taskwoodsTerror3; +} + function lockQuest (quest, user) { + if (quest.key === 'lostMasterclasser1') return !userAbleToStartMasterclasser(user); + if (quest.key === 'lostMasterclasser2' || quest.key === 'lostMasterclasser3' || quest.key === 'lostMasterclasser4') { + return !(userAbleToStartMasterclasser(user) && user.achievements.quests[quest.previous]); + } if (quest.key === 'lostMasterclasser1') return !(user.achievements.quests.dilatoryDistress3 && user.achievements.quests.mayhemMistiflying3 && user.achievements.quests.stoikalmCalamity3 && user.achievements.quests.taskwoodsTerror3); if (quest.lvl && user.stats.lvl < quest.lvl) return true; if (quest.unlockCondition && (quest.key === 'moon1' || quest.key === 'moon2' || quest.key === 'moon3')) { diff --git a/website/common/script/ops/buy/buyQuestGold.js b/website/common/script/ops/buy/buyQuestGold.js index 10a0cfadcb..0fa1ce492b 100644 --- a/website/common/script/ops/buy/buyQuestGold.js +++ b/website/common/script/ops/buy/buyQuestGold.js @@ -53,7 +53,7 @@ export class BuyQuestWithGoldOperation extends AbstractGoldItemOperation { // es checkPrerequisites (user, questKey) { const item = content.quests[questKey]; - if (questKey === 'lostMasterclasser1' && !this.userAbleToStartMasterClasser(user)) { + if (questKey.startsWith('lostMasterclasser') && !this.userAbleToStartMasterClasser(user)) { throw new NotAuthorized(this.i18n('questUnlockLostMasterclasser')); } From adc7a6ee85f951b7a7b76f0a01f0f02cc70d9486 Mon Sep 17 00:00:00 2001 From: CuriousMagpie Date: Fri, 31 Dec 2021 13:43:59 -0500 Subject: [PATCH 02/23] organized quests by type and alphabetically within type --- website/common/script/content/quests.js | 5887 ++++++++++++----------- 1 file changed, 2951 insertions(+), 2936 deletions(-) diff --git a/website/common/script/content/quests.js b/website/common/script/content/quests.js index d9300eed11..e08019d8ec 100644 --- a/website/common/script/content/quests.js +++ b/website/common/script/content/quests.js @@ -14,657 +14,51 @@ const CURRENT_EVENT = find( ); const userCanOwnQuestCategories = USER_CAN_OWN_QUEST_CATEGORIES; +// separatihg & sorting quests by type -- +// generic unlockable, chain, masterclasser, seasonal, pet, potion, time travelers, world +// with intent of eventually refactoring + const quests = { - dilatory: { - text: t('questDilatoryText'), - notes: t('questDilatoryNotes'), - completion: t('questDilatoryCompletion'), - value: 0, - canBuy () { - return false; - }, - category: 'world', - boss: { - name: t('questDilatoryBoss'), - hp: 5000000, - str: 1, - def: 1, - rage: { - title: t('questDilatoryBossRageTitle'), - description: t('questDilatoryBossRageDescription'), - value: 4000000, - tavern: t('questDilatoryBossRageTavern'), - stables: t('questDilatoryBossRageStables'), - market: t('questDilatoryBossRageMarket'), - }, - }, - drop: { - items: [ - { - type: 'pets', - key: 'MantisShrimp-Base', - text: t('questDilatoryDropMantisShrimpPet'), - }, { - type: 'mounts', - key: 'MantisShrimp-Base', - text: t('questDilatoryDropMantisShrimpMount'), - }, { - type: 'food', - key: 'Meat', - text: t('foodMeat'), - }, { - type: 'food', - key: 'Milk', - text: t('foodMilk'), - }, { - type: 'food', - key: 'Potatoe', - text: t('foodPotatoe'), - }, { - type: 'food', - key: 'Strawberry', - text: t('foodStrawberry'), - }, { - type: 'food', - key: 'Chocolate', - text: t('foodChocolate'), - }, { - type: 'food', - key: 'Fish', - text: t('foodFish'), - }, { - type: 'food', - key: 'RottenMeat', - text: t('foodRottenMeat'), - }, { - type: 'food', - key: 'CottonCandyPink', - text: t('foodCottonCandyPink'), - }, { - type: 'food', - key: 'CottonCandyBlue', - text: t('foodCottonCandyBlue'), - }, { - type: 'food', - key: 'Honey', - text: t('foodHoney'), - }, - ], - gp: 0, - exp: 0, - }, - }, - stressbeast: { - text: t('questStressbeastText'), - notes: t('questStressbeastNotes'), - completion: t('questStressbeastCompletion'), - completionChat: t('questStressbeastCompletionChat'), - value: 0, - canBuy () { - return false; - }, - category: 'world', - boss: { - name: t('questStressbeastBoss'), - hp: 2750000, - str: 1, - def: 1, - rage: { - title: t('questStressbeastBossRageTitle'), - description: t('questStressbeastBossRageDescription'), - value: 1450000, - healing: 0.3, - stables: t('questStressbeastBossRageStables'), - bailey: t('questStressbeastBossRageBailey'), - guide: t('questStressbeastBossRageGuide'), - }, - desperation: { - threshold: 500000, - str: 3.5, - def: 2, - text: t('questStressbeastDesperation'), - }, - }, - drop: { - items: [ - { - type: 'pets', - key: 'Mammoth-Base', - text: t('questStressbeastDropMammothPet'), - }, { - type: 'mounts', - key: 'Mammoth-Base', - text: t('questStressbeastDropMammothMount'), - }, { - type: 'food', - key: 'Meat', - text: t('foodMeat'), - }, { - type: 'food', - key: 'Milk', - text: t('foodMilk'), - }, { - type: 'food', - key: 'Potatoe', - text: t('foodPotatoe'), - }, { - type: 'food', - key: 'Strawberry', - text: t('foodStrawberry'), - }, { - type: 'food', - key: 'Chocolate', - text: t('foodChocolate'), - }, { - type: 'food', - key: 'Fish', - text: t('foodFish'), - }, { - type: 'food', - key: 'RottenMeat', - text: t('foodRottenMeat'), - }, { - type: 'food', - key: 'CottonCandyPink', - text: t('foodCottonCandyPink'), - }, { - type: 'food', - key: 'CottonCandyBlue', - text: t('foodCottonCandyBlue'), - }, { - type: 'food', - key: 'Honey', - text: t('foodHoney'), - }, - ], - gp: 0, - exp: 0, - }, - }, - burnout: { - text: t('questBurnoutText'), - notes: t('questBurnoutNotes'), - completion: t('questBurnoutCompletion'), - completionChat: t('questBurnoutCompletionChat'), - value: 0, - canBuy () { - return false; - }, - category: 'world', - boss: { - name: t('questBurnoutBoss'), - hp: 11000000, - str: 2.5, - def: 1, - rage: { - title: t('questBurnoutBossRageTitle'), - description: t('questBurnoutBossRageDescription'), - value: 1000000, - quests: t('questBurnoutBossRageQuests'), - seasonalShop: t('questBurnoutBossRageSeasonalShop'), - tavern: t('questBurnoutBossRageTavern'), - }, - }, - drop: { - items: [ - { - type: 'pets', - key: 'Phoenix-Base', - text: t('questBurnoutDropPhoenixPet'), - }, { - type: 'mounts', - key: 'Phoenix-Base', - text: t('questBurnoutDropPhoenixMount'), - }, { - type: 'food', - key: 'Candy_Base', - text: t('foodCandyBase'), - }, { - type: 'food', - key: 'Candy_White', - text: t('foodCandyWhite'), - }, { - type: 'food', - key: 'Candy_Desert', - text: t('foodCandyDesert'), - }, { - type: 'food', - key: 'Candy_Red', - text: t('foodCandyRed'), - }, { - type: 'food', - key: 'Candy_Shade', - text: t('foodCandyShade'), - }, { - type: 'food', - key: 'Candy_Skeleton', - text: t('foodCandySkeleton'), - }, { - type: 'food', - key: 'Candy_Zombie', - text: t('foodCandyZombie'), - }, { - type: 'food', - key: 'Candy_CottonCandyPink', - text: t('foodCandyCottonCandyPink'), - }, { - type: 'food', - key: 'Candy_CottonCandyBlue', - text: t('foodCandyCottonCandyBlue'), - }, { - type: 'food', - key: 'Candy_Golden', - text: t('foodCandyGolden'), - }, - ], - gp: 0, - exp: 0, - }, - }, - evilsanta: { - event: CURRENT_EVENT && CURRENT_EVENT.season === 'winter' ? CURRENT_EVENT : null, - text: t('questEvilSantaText'), - notes: t('questEvilSantaNotes'), - addlNotes: t('evilSantaAddlNotes'), - completion: t('questEvilSantaCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questEvilSantaBoss'), - hp: 300, - str: 1, - }, - drop: { - items: [ - { - type: 'mounts', - key: 'BearCub-Polar', - text: t('questEvilSantaDropBearCubPolarMount'), - }, - ], - gp: 20, - exp: 100, - }, - }, - evilsanta2: { - event: CURRENT_EVENT && CURRENT_EVENT.season === 'winter' ? CURRENT_EVENT : null, - text: t('questEvilSanta2Text'), - notes: t('questEvilSanta2Notes'), - addlNotes: t('evilSantaAddlNotes'), - completion: t('questEvilSanta2Completion'), - value: 4, - category: 'pet', - collect: { - tracks: { - text: t('questEvilSanta2CollectTracks'), - count: 20, - }, - branches: { - text: t('questEvilSanta2CollectBranches'), - count: 10, - }, - }, - drop: { - items: [ - { - type: 'pets', - key: 'BearCub-Polar', - text: t('questEvilSanta2DropBearCubPolarPet'), - }, - ], - gp: 20, - exp: 100, - }, - }, - gryphon: { - text: t('questGryphonText'), - notes: t('questGryphonNotes'), - completion: t('questGryphonCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questGryphonBoss'), - hp: 300, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Gryphon', - text: t('questGryphonDropGryphonEgg'), - }, { - type: 'eggs', - key: 'Gryphon', - text: t('questGryphonDropGryphonEgg'), - }, { - type: 'eggs', - key: 'Gryphon', - text: t('questGryphonDropGryphonEgg'), - }, - ], - gp: 25, - exp: 125, - unlock: t('questGryphonUnlockText'), - }, - }, - hedgehog: { - text: t('questHedgehogText'), - notes: t('questHedgehogNotes'), - completion: t('questHedgehogCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questHedgehogBoss'), - hp: 400, - str: 1.25, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Hedgehog', - text: t('questHedgehogDropHedgehogEgg'), - }, { - type: 'eggs', - key: 'Hedgehog', - text: t('questHedgehogDropHedgehogEgg'), - }, { - type: 'eggs', - key: 'Hedgehog', - text: t('questHedgehogDropHedgehogEgg'), - }, - ], - gp: 30, - exp: 125, - unlock: t('questHedgehogUnlockText'), - }, - }, - ghost_stag: { // eslint-disable-line camelcase - text: t('questGhostStagText'), - notes: t('questGhostStagNotes'), - completion: t('questGhostStagCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questGhostStagBoss'), - hp: 1200, - str: 2.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Deer', - text: t('questGhostStagDropDeerEgg'), - }, { - type: 'eggs', - key: 'Deer', - text: t('questGhostStagDropDeerEgg'), - }, { - type: 'eggs', - key: 'Deer', - text: t('questGhostStagDropDeerEgg'), - }, - ], - gp: 80, - exp: 800, - unlock: t('questGhostStagUnlockText'), - }, - }, - vice1: { - text: t('questVice1Text'), - notes: t('questVice1Notes'), - completion: t('questVice1Completion'), - group: 'questGroupVice', - value: 4, - lvl: 30, + // generic unlockable quests + basilist: { + text: t('questBasilistText'), + notes: t('questBasilistNotes'), + group: 'questGroupEarnable', + completion: t('questBasilistCompletion'), + goldValue: 100, category: 'unlockable', + unlockCondition: { + condition: 'party invite', + text: t('inviteFriends'), + }, boss: { - name: t('questVice1Boss'), - hp: 750, - str: 1.5, + name: t('questBasilistBoss'), + hp: 100, + str: 0.5, }, drop: { - items: [ - { - type: 'quests', - key: 'vice2', - text: t('questVice1DropVice2Quest'), - onlyOwner: true, - }, - ], - gp: 20, - exp: 100, + gp: 8, + exp: 42, }, }, - vice2: { - text: t('questVice2Text'), - notes: t('questVice2Notes'), - completion: t('questVice2Completion'), - group: 'questGroupVice', - value: 4, - lvl: 30, - category: 'unlockable', - previous: 'vice1', - collect: { - lightCrystal: { - text: t('questVice2CollectLightCrystal'), - count: 30, - }, - }, - drop: { - items: [ - { - type: 'quests', - key: 'vice3', - text: t('questVice2DropVice3Quest'), - onlyOwner: true, - }, - ], - gp: 20, - exp: 75, - }, - }, - vice3: { - text: t('questVice3Text'), - notes: t('questVice3Notes'), - group: 'questGroupVice', - completion: t('questVice3Completion'), - previous: 'vice2', - value: 4, - lvl: 30, - category: 'unlockable', - boss: { - name: t('questVice3Boss'), - hp: 1500, - str: 3, - }, - drop: { - items: [ - { - type: 'gear', - key: 'weapon_special_2', - text: t('questVice3DropWeaponSpecial2'), - }, { - type: 'eggs', - key: 'Dragon', - text: t('questVice3DropDragonEgg'), - }, { - type: 'eggs', - key: 'Dragon', - text: t('questVice3DropDragonEgg'), - }, { - type: 'hatchingPotions', - key: 'Shade', - text: t('questVice3DropShadeHatchingPotion'), - }, { - type: 'hatchingPotions', - key: 'Shade', - text: t('questVice3DropShadeHatchingPotion'), - }, - ], - gp: 100, - exp: 1000, - }, - }, - egg: { - text: t('questEggHuntText'), - notes: t('questEggHuntNotes'), - completion: t('questEggHuntCompletion'), + dustbunnies: { + text: t('questDustBunniesText'), + notes: t('questDustBunniesNotes'), + group: 'questGroupEarnable', + completion: t('questDustBunniesCompletion'), value: 1, - category: 'pet', - event: CURRENT_EVENT && CURRENT_EVENT.season === 'spring' ? CURRENT_EVENT : null, - collect: { - plainEgg: { - text: t('questEggHuntCollectPlainEgg'), - count: 40, - }, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Egg', - text: t('questEggHuntDropPlainEgg'), - }, { - type: 'eggs', - key: 'Egg', - text: t('questEggHuntDropPlainEgg'), - }, { - type: 'eggs', - key: 'Egg', - text: t('questEggHuntDropPlainEgg'), - }, { - type: 'eggs', - key: 'Egg', - text: t('questEggHuntDropPlainEgg'), - }, { - type: 'eggs', - key: 'Egg', - text: t('questEggHuntDropPlainEgg'), - }, { - type: 'eggs', - key: 'Egg', - text: t('questEggHuntDropPlainEgg'), - }, { - type: 'eggs', - key: 'Egg', - text: t('questEggHuntDropPlainEgg'), - }, { - type: 'eggs', - key: 'Egg', - text: t('questEggHuntDropPlainEgg'), - }, { - type: 'eggs', - key: 'Egg', - text: t('questEggHuntDropPlainEgg'), - }, { - type: 'eggs', - key: 'Egg', - text: t('questEggHuntDropPlainEgg'), - }, - ], - gp: 0, - exp: 0, - }, - }, - rat: { - text: t('questRatText'), - notes: t('questRatNotes'), - completion: t('questRatCompletion'), - value: 4, - category: 'pet', + category: 'unlockable', boss: { - name: t('questRatBoss'), - hp: 1200, - str: 2.5, + name: t('questDustBunniesBoss'), + hp: 100, + str: 0.5, }, drop: { - items: [ - { - type: 'eggs', - key: 'Rat', - text: t('questRatDropRatEgg'), - }, { - type: 'eggs', - key: 'Rat', - text: t('questRatDropRatEgg'), - }, { - type: 'eggs', - key: 'Rat', - text: t('questRatDropRatEgg'), - }, - ], - gp: 80, - exp: 800, - unlock: t('questRatUnlockText'), - }, - }, - octopus: { - text: t('questOctopusText'), - notes: t('questOctopusNotes'), - completion: t('questOctopusCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questOctopusBoss'), - hp: 1200, - str: 2.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Octopus', - text: t('questOctopusDropOctopusEgg'), - }, { - type: 'eggs', - key: 'Octopus', - text: t('questOctopusDropOctopusEgg'), - }, { - type: 'eggs', - key: 'Octopus', - text: t('questOctopusDropOctopusEgg'), - }, - ], - gp: 80, - exp: 800, - unlock: t('questOctopusUnlockText'), - }, - }, - dilatory_derby: { // eslint-disable-line camelcase - text: t('questSeahorseText'), - notes: t('questSeahorseNotes'), - completion: t('questSeahorseCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questSeahorseBoss'), - hp: 300, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Seahorse', - text: t('questSeahorseDropSeahorseEgg'), - }, { - type: 'eggs', - key: 'Seahorse', - text: t('questSeahorseDropSeahorseEgg'), - }, { - type: 'eggs', - key: 'Seahorse', - text: t('questSeahorseDropSeahorseEgg'), - }, - ], - gp: 25, - exp: 125, - unlock: t('questSeahorseUnlockText'), + gp: 8, + exp: 42, }, }, + // chain quests atom1: { text: t('questAtom1Text'), notes: t('questAtom1Notes'), @@ -753,100 +147,194 @@ const quests = { exp: 125, }, }, - harpy: { - text: t('questHarpyText'), - notes: t('questHarpyNotes'), - completion: t('questHarpyCompletion'), + goldenknight1: { + text: t('questGoldenknight1Text'), + notes: t('questGoldenknight1Notes'), + completion: t('questGoldenknight1Completion'), + group: 'questGroupGoldenknight', value: 4, - category: 'pet', - boss: { - name: t('questHarpyBoss'), - hp: 600, - str: 1.5, + lvl: 40, + category: 'unlockable', + collect: { + testimony: { + text: t('questGoldenknight1CollectTestimony'), + count: 60, + }, }, drop: { items: [ { - type: 'eggs', - key: 'Parrot', - text: t('questHarpyDropParrotEgg'), - }, { - type: 'eggs', - key: 'Parrot', - text: t('questHarpyDropParrotEgg'), - }, { - type: 'eggs', - key: 'Parrot', - text: t('questHarpyDropParrotEgg'), + type: 'quests', + key: 'goldenknight2', + text: t('questGoldenknight1DropGoldenknight2Quest'), + onlyOwner: true, }, ], - gp: 43, - exp: 350, - unlock: t('questHarpyUnlockText'), + gp: 15, + exp: 120, }, }, - rooster: { - text: t('questRoosterText'), - notes: t('questRoosterNotes'), - completion: t('questRoosterCompletion'), + goldenknight2: { + text: t('questGoldenknight2Text'), + notes: t('questGoldenknight2Notes'), + completion: t('questGoldenknight2Completion'), + group: 'questGroupGoldenknight', value: 4, - category: 'pet', + previous: 'goldenknight1', + lvl: 40, + category: 'unlockable', boss: { - name: t('questRoosterBoss'), - hp: 300, - str: 1.5, + name: t('questGoldenknight2Boss'), + hp: 1000, + str: 3, }, drop: { items: [ { - type: 'eggs', - key: 'Rooster', - text: t('questRoosterDropRoosterEgg'), - }, { - type: 'eggs', - key: 'Rooster', - text: t('questRoosterDropRoosterEgg'), - }, { - type: 'eggs', - key: 'Rooster', - text: t('questRoosterDropRoosterEgg'), + type: 'quests', + key: 'goldenknight3', + text: t('questGoldenknight2DropGoldenknight3Quest'), + onlyOwner: true, }, ], - gp: 25, - exp: 125, - unlock: t('questRoosterUnlockText'), + gp: 75, + exp: 750, }, }, - spider: { - text: t('questSpiderText'), - notes: t('questSpiderNotes'), - completion: t('questSpiderCompletion'), + goldenknight3: { + text: t('questGoldenknight3Text'), + notes: t('questGoldenknight3Notes'), + group: 'questGroupGoldenknight', + completion: t('questGoldenknight3Completion'), + previous: 'goldenknight2', value: 4, - category: 'pet', + lvl: 40, + category: 'unlockable', boss: { - name: t('questSpiderBoss'), - hp: 400, + name: t('questGoldenknight3Boss'), + hp: 1700, + str: 3.5, + }, + drop: { + items: [ + { + type: 'food', + key: 'Honey', + text: t('questGoldenknight3DropHoney'), + }, { + type: 'food', + key: 'Honey', + text: t('questGoldenknight3DropHoney'), + }, { + type: 'food', + key: 'Honey', + text: t('questGoldenknight3DropHoney'), + }, { + type: 'hatchingPotions', + key: 'Golden', + text: t('questGoldenknight3DropGoldenPotion'), + }, { + type: 'hatchingPotions', + key: 'Golden', + text: t('questGoldenknight3DropGoldenPotion'), + }, { + type: 'gear', + key: 'shield_special_goldenknight', + text: t('questGoldenknight3DropWeapon'), + }, + ], + gp: 900, + exp: 1500, + }, + }, + moon1: { + text: t('questMoon1Text'), + notes: t('questMoon1Notes'), + group: 'questGroupMoon', + completion: t('questMoon1Completion'), + value: 4, + category: 'unlockable', + unlockCondition: { + condition: 'login reward', + incentiveThreshold: 7, + text: t('loginReward', { count: 7 }), + }, + collect: { + shard: { + text: t('questMoon1CollectShards'), + count: 20, + }, + }, + drop: { + items: [ + { + type: 'gear', + key: 'head_special_lunarWarriorHelm', + text: t('questMoon1DropHeadgear'), + }, + ], + gp: 7, + exp: 50, + }, + }, + moon2: { + text: t('questMoon2Text'), + notes: t('questMoon2Notes'), + group: 'questGroupMoon', + completion: t('questMoon2Completion'), + previous: 'moon1', + value: 4, + category: 'unlockable', + unlockCondition: { + condition: 'login reward', + incentiveThreshold: 22, + text: t('loginReward', { count: 22 }), + }, + boss: { + name: t('questMoon2Boss'), + hp: 100, str: 1.5, }, drop: { items: [ { - type: 'eggs', - key: 'Spider', - text: t('questSpiderDropSpiderEgg'), - }, { - type: 'eggs', - key: 'Spider', - text: t('questSpiderDropSpiderEgg'), - }, { - type: 'eggs', - key: 'Spider', - text: t('questSpiderDropSpiderEgg'), + type: 'gear', + key: 'armor_special_lunarWarriorArmor', + text: t('questMoon2DropArmor'), }, ], - gp: 31, - exp: 200, - unlock: t('questSpiderUnlockText'), + gp: 37, + exp: 275, + }, + }, + moon3: { + text: t('questMoon3Text'), + notes: t('questMoon3Notes'), + group: 'questGroupMoon', + completion: t('questMoon3Completion'), + previous: 'moon2', + value: 4, + category: 'unlockable', + unlockCondition: { + condition: 'login reward', + incentiveThreshold: 40, + text: t('loginReward', { count: 40 }), + }, + boss: { + name: t('questMoon3Boss'), + hp: 1000, + str: 2, + }, + drop: { + items: [ + { + type: 'gear', + key: 'weapon_special_lunarScythe', + text: t('questMoon3DropWeapon'), + }, + ], + gp: 67, + exp: 650, }, }, moonstone1: { @@ -961,454 +449,103 @@ const quests = { exp: 1500, }, }, - goldenknight1: { - text: t('questGoldenknight1Text'), - notes: t('questGoldenknight1Notes'), - completion: t('questGoldenknight1Completion'), - group: 'questGroupGoldenknight', + vice1: { + text: t('questVice1Text'), + notes: t('questVice1Notes'), + completion: t('questVice1Completion'), + group: 'questGroupVice', value: 4, - lvl: 40, + lvl: 30, category: 'unlockable', + boss: { + name: t('questVice1Boss'), + hp: 750, + str: 1.5, + }, + drop: { + items: [ + { + type: 'quests', + key: 'vice2', + text: t('questVice1DropVice2Quest'), + onlyOwner: true, + }, + ], + gp: 20, + exp: 100, + }, + }, + vice2: { + text: t('questVice2Text'), + notes: t('questVice2Notes'), + completion: t('questVice2Completion'), + group: 'questGroupVice', + value: 4, + lvl: 30, + category: 'unlockable', + previous: 'vice1', collect: { - testimony: { - text: t('questGoldenknight1CollectTestimony'), - count: 60, + lightCrystal: { + text: t('questVice2CollectLightCrystal'), + count: 30, }, }, drop: { items: [ { type: 'quests', - key: 'goldenknight2', - text: t('questGoldenknight1DropGoldenknight2Quest'), + key: 'vice3', + text: t('questVice2DropVice3Quest'), onlyOwner: true, }, ], - gp: 15, - exp: 120, + gp: 20, + exp: 75, }, }, - goldenknight2: { - text: t('questGoldenknight2Text'), - notes: t('questGoldenknight2Notes'), - completion: t('questGoldenknight2Completion'), - group: 'questGroupGoldenknight', + vice3: { + text: t('questVice3Text'), + notes: t('questVice3Notes'), + group: 'questGroupVice', + completion: t('questVice3Completion'), + previous: 'vice2', value: 4, - previous: 'goldenknight1', - lvl: 40, + lvl: 30, category: 'unlockable', boss: { - name: t('questGoldenknight2Boss'), - hp: 1000, + name: t('questVice3Boss'), + hp: 1500, str: 3, }, drop: { items: [ { - type: 'quests', - key: 'goldenknight3', - text: t('questGoldenknight2DropGoldenknight3Quest'), - onlyOwner: true, - }, - ], - gp: 75, - exp: 750, - }, - }, - goldenknight3: { - text: t('questGoldenknight3Text'), - notes: t('questGoldenknight3Notes'), - group: 'questGroupGoldenknight', - completion: t('questGoldenknight3Completion'), - previous: 'goldenknight2', - value: 4, - lvl: 40, - category: 'unlockable', - boss: { - name: t('questGoldenknight3Boss'), - hp: 1700, - str: 3.5, - }, - drop: { - items: [ - { - type: 'food', - key: 'Honey', - text: t('questGoldenknight3DropHoney'), - }, { - type: 'food', - key: 'Honey', - text: t('questGoldenknight3DropHoney'), - }, { - type: 'food', - key: 'Honey', - text: t('questGoldenknight3DropHoney'), - }, { - type: 'hatchingPotions', - key: 'Golden', - text: t('questGoldenknight3DropGoldenPotion'), - }, { - type: 'hatchingPotions', - key: 'Golden', - text: t('questGoldenknight3DropGoldenPotion'), - }, { type: 'gear', - key: 'shield_special_goldenknight', - text: t('questGoldenknight3DropWeapon'), + key: 'weapon_special_2', + text: t('questVice3DropWeaponSpecial2'), + }, { + type: 'eggs', + key: 'Dragon', + text: t('questVice3DropDragonEgg'), + }, { + type: 'eggs', + key: 'Dragon', + text: t('questVice3DropDragonEgg'), + }, { + type: 'hatchingPotions', + key: 'Shade', + text: t('questVice3DropShadeHatchingPotion'), + }, { + type: 'hatchingPotions', + key: 'Shade', + text: t('questVice3DropShadeHatchingPotion'), }, ], - gp: 900, - exp: 1500, - }, - }, - basilist: { - text: t('questBasilistText'), - notes: t('questBasilistNotes'), - group: 'questGroupEarnable', - completion: t('questBasilistCompletion'), - goldValue: 100, - category: 'unlockable', - unlockCondition: { - condition: 'party invite', - text: t('inviteFriends'), - }, - boss: { - name: t('questBasilistBoss'), - hp: 100, - str: 0.5, - }, - drop: { - gp: 8, - exp: 42, - }, - }, - owl: { - text: t('questOwlText'), - notes: t('questOwlNotes'), - completion: t('questOwlCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questOwlBoss'), - hp: 500, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Owl', - text: t('questOwlDropOwlEgg'), - }, { - type: 'eggs', - key: 'Owl', - text: t('questOwlDropOwlEgg'), - }, { - type: 'eggs', - key: 'Owl', - text: t('questOwlDropOwlEgg'), - }, - ], - gp: 37, - exp: 275, - unlock: t('questOwlUnlockText'), - }, - }, - penguin: { - text: t('questPenguinText'), - notes: t('questPenguinNotes'), - completion: t('questPenguinCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questPenguinBoss'), - hp: 400, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Penguin', - text: t('questPenguinDropPenguinEgg'), - }, { - type: 'eggs', - key: 'Penguin', - text: t('questPenguinDropPenguinEgg'), - }, { - type: 'eggs', - key: 'Penguin', - text: t('questPenguinDropPenguinEgg'), - }, - ], - gp: 31, - exp: 200, - unlock: t('questPenguinUnlockText'), - }, - }, - trex: { - text: t('questTRexText'), - notes: t('questTRexNotes'), - completion: t('questTRexCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questTRexBoss'), - hp: 800, - str: 2, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'TRex', - text: t('questTRexDropTRexEgg'), - }, { - type: 'eggs', - key: 'TRex', - text: t('questTRexDropTRexEgg'), - }, { - type: 'eggs', - key: 'TRex', - text: t('questTRexDropTRexEgg'), - }, - ], - gp: 55, - exp: 500, - unlock: t('questTRexUnlockText'), - }, - }, - trex_undead: { // eslint-disable-line camelcase - text: t('questTRexUndeadText'), - notes: t('questTRexUndeadNotes'), - completion: t('questTRexUndeadCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questTRexUndeadBoss'), - hp: 500, - str: 2, - rage: { - title: t('questTRexUndeadRageTitle'), - description: t('questTRexUndeadRageDescription'), - value: 50, - healing: 0.3, - effect: t('questTRexUndeadRageEffect'), - }, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'TRex', - text: t('questTRexDropTRexEgg'), - }, { - type: 'eggs', - key: 'TRex', - text: t('questTRexDropTRexEgg'), - }, { - type: 'eggs', - key: 'TRex', - text: t('questTRexDropTRexEgg'), - }, - ], - gp: 55, - exp: 500, - unlock: t('questTRexUnlockText'), - }, - }, - rock: { - text: t('questRockText'), - notes: t('questRockNotes'), - completion: t('questRockCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questRockBoss'), - hp: 400, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Rock', - text: t('questRockDropRockEgg'), - }, { - type: 'eggs', - key: 'Rock', - text: t('questRockDropRockEgg'), - }, { - type: 'eggs', - key: 'Rock', - text: t('questRockDropRockEgg'), - }, - ], - gp: 31, - exp: 200, - unlock: t('questRockUnlockText'), - }, - }, - bunny: { - text: t('questBunnyText'), - notes: t('questBunnyNotes'), - completion: t('questBunnyCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questBunnyBoss'), - hp: 300, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Bunny', - text: t('questBunnyDropBunnyEgg'), - }, { - type: 'eggs', - key: 'Bunny', - text: t('questBunnyDropBunnyEgg'), - }, { - type: 'eggs', - key: 'Bunny', - text: t('questBunnyDropBunnyEgg'), - }, - ], - gp: 25, - exp: 125, - unlock: t('questBunnyUnlockText'), - }, - }, - slime: { - text: t('questSlimeText'), - notes: t('questSlimeNotes'), - completion: t('questSlimeCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questSlimeBoss'), - hp: 400, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Slime', - text: t('questSlimeDropSlimeEgg'), - }, { - type: 'eggs', - key: 'Slime', - text: t('questSlimeDropSlimeEgg'), - }, { - type: 'eggs', - key: 'Slime', - text: t('questSlimeDropSlimeEgg'), - }, - ], - gp: 31, - exp: 200, - unlock: t('questSlimeUnlockText'), - }, - }, - sheep: { - text: t('questSheepText'), - notes: t('questSheepNotes'), - completion: t('questSheepCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questSheepBoss'), - hp: 300, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Sheep', - text: t('questSheepDropSheepEgg'), - }, { - type: 'eggs', - key: 'Sheep', - text: t('questSheepDropSheepEgg'), - }, { - type: 'eggs', - key: 'Sheep', - text: t('questSheepDropSheepEgg'), - }, - ], - gp: 25, - exp: 125, - unlock: t('questSheepUnlockText'), - }, - }, - kraken: { - text: t('questKrakenText'), - notes: t('questKrakenNotes'), - completion: t('questKrakenCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questKrakenBoss'), - hp: 800, - str: 2, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Cuttlefish', - text: t('questKrakenDropCuttlefishEgg'), - }, { - type: 'eggs', - key: 'Cuttlefish', - text: t('questKrakenDropCuttlefishEgg'), - }, { - type: 'eggs', - key: 'Cuttlefish', - text: t('questKrakenDropCuttlefishEgg'), - }, - ], - gp: 55, - exp: 500, - unlock: t('questKrakenUnlockText'), - }, - }, - whale: { - text: t('questWhaleText'), - notes: t('questWhaleNotes'), - completion: t('questWhaleCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questWhaleBoss'), - hp: 500, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Whale', - text: t('questWhaleDropWhaleEgg'), - }, { - type: 'eggs', - key: 'Whale', - text: t('questWhaleDropWhaleEgg'), - }, { - type: 'eggs', - key: 'Whale', - text: t('questWhaleDropWhaleEgg'), - }, - ], - gp: 37, - exp: 275, - unlock: t('questWhaleUnlockText'), + gp: 100, + exp: 1000, }, }, + // masterclasser quests dilatoryDistress1: { text: t('questDilatoryDistress1Text'), notes: t('questDilatoryDistress1Notes'), @@ -1521,1092 +658,6 @@ const quests = { exp: 650, }, }, - cheetah: { - text: t('questCheetahText'), - notes: t('questCheetahNotes'), - completion: t('questCheetahCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questCheetahBoss'), - hp: 600, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Cheetah', - text: t('questCheetahDropCheetahEgg'), - }, { - type: 'eggs', - key: 'Cheetah', - text: t('questCheetahDropCheetahEgg'), - }, { - type: 'eggs', - key: 'Cheetah', - text: t('questCheetahDropCheetahEgg'), - }, - ], - gp: 43, - exp: 350, - unlock: t('questCheetahUnlockText'), - }, - }, - horse: { - text: t('questHorseText'), - notes: t('questHorseNotes'), - completion: t('questHorseCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questHorseBoss'), - hp: 500, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Horse', - text: t('questHorseDropHorseEgg'), - }, { - type: 'eggs', - key: 'Horse', - text: t('questHorseDropHorseEgg'), - }, { - type: 'eggs', - key: 'Horse', - text: t('questHorseDropHorseEgg'), - }, - ], - gp: 37, - exp: 275, - unlock: t('questHorseUnlockText'), - }, - }, - frog: { - text: t('questFrogText'), - notes: t('questFrogNotes'), - completion: t('questFrogCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questFrogBoss'), - hp: 300, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Frog', - text: t('questFrogDropFrogEgg'), - }, { - type: 'eggs', - key: 'Frog', - text: t('questFrogDropFrogEgg'), - }, { - type: 'eggs', - key: 'Frog', - text: t('questFrogDropFrogEgg'), - }, - ], - gp: 25, - exp: 125, - unlock: t('questFrogUnlockText'), - }, - }, - snake: { - text: t('questSnakeText'), - notes: t('questSnakeNotes'), - completion: t('questSnakeCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questSnakeBoss'), - hp: 1100, - str: 2.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Snake', - text: t('questSnakeDropSnakeEgg'), - }, { - type: 'eggs', - key: 'Snake', - text: t('questSnakeDropSnakeEgg'), - }, { - type: 'eggs', - key: 'Snake', - text: t('questSnakeDropSnakeEgg'), - }, - ], - gp: 73, - exp: 725, - unlock: t('questSnakeUnlockText'), - }, - }, - unicorn: { - text: t('questUnicornText'), - notes: t('questUnicornNotes'), - completion: t('questUnicornCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questUnicornBoss'), - hp: 600, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Unicorn', - text: t('questUnicornDropUnicornEgg'), - }, { - type: 'eggs', - key: 'Unicorn', - text: t('questUnicornDropUnicornEgg'), - }, { - type: 'eggs', - key: 'Unicorn', - text: t('questUnicornDropUnicornEgg'), - }, - ], - gp: 43, - exp: 350, - unlock: t('questUnicornUnlockText'), - }, - }, - sabretooth: { - text: t('questSabretoothText'), - notes: t('questSabretoothNotes'), - completion: t('questSabretoothCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questSabretoothBoss'), - hp: 1000, - str: 2, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Sabretooth', - text: t('questSabretoothDropSabretoothEgg'), - }, { - type: 'eggs', - key: 'Sabretooth', - text: t('questSabretoothDropSabretoothEgg'), - }, { - type: 'eggs', - key: 'Sabretooth', - text: t('questSabretoothDropSabretoothEgg'), - }, - ], - gp: 67, - exp: 650, - unlock: t('questSabretoothUnlockText'), - }, - }, - monkey: { - text: t('questMonkeyText'), - notes: t('questMonkeyNotes'), - completion: t('questMonkeyCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questMonkeyBoss'), - hp: 400, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Monkey', - text: t('questMonkeyDropMonkeyEgg'), - }, { - type: 'eggs', - key: 'Monkey', - text: t('questMonkeyDropMonkeyEgg'), - }, { - type: 'eggs', - key: 'Monkey', - text: t('questMonkeyDropMonkeyEgg'), - }, - ], - gp: 31, - exp: 200, - unlock: t('questMonkeyUnlockText'), - }, - }, - snail: { - text: t('questSnailText'), - notes: t('questSnailNotes'), - completion: t('questSnailCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questSnailBoss'), - hp: 500, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Snail', - text: t('questSnailDropSnailEgg'), - }, { - type: 'eggs', - key: 'Snail', - text: t('questSnailDropSnailEgg'), - }, { - type: 'eggs', - key: 'Snail', - text: t('questSnailDropSnailEgg'), - }, - ], - gp: 37, - exp: 275, - unlock: t('questSnailUnlockText'), - }, - }, - bewilder: { - text: t('questBewilderText'), - notes: t('questBewilderNotes'), - completion: t('questBewilderCompletion'), - completionChat: t('questBewilderCompletionChat'), - value: 0, - canBuy () { - return false; - }, - category: 'world', - boss: { - name: t('questBewilderText'), - hp: 20000000, - str: 1, - def: 1, - rage: { - title: t('questBewilderBossRageTitle'), - description: t('questBewilderBossRageDescription'), - value: 800000, - bailey: t('questBewilderBossRageBailey'), - stables: t('questBewilderBossRageStables'), - market: t('questBewilderBossRageMarket'), - }, - }, - drop: { - items: [ - { - type: 'pets', - key: 'MagicalBee-Base', - text: t('questBewilderDropBumblebeePet'), - }, { - type: 'mounts', - key: 'MagicalBee-Base', - text: t('questBewilderDropBumblebeeMount'), - }, { - type: 'food', - key: 'Meat', - text: t('foodMeat'), - }, { - type: 'food', - key: 'Milk', - text: t('foodMilk'), - }, { - type: 'food', - key: 'Potatoe', - text: t('foodPotatoe'), - }, { - type: 'food', - key: 'Strawberry', - text: t('foodStrawberry'), - }, { - type: 'food', - key: 'Chocolate', - text: t('foodChocolate'), - }, { - type: 'food', - key: 'Fish', - text: t('foodFish'), - }, { - type: 'food', - key: 'RottenMeat', - text: t('foodRottenMeat'), - }, { - type: 'food', - key: 'CottonCandyPink', - text: t('foodCottonCandyPink'), - }, { - type: 'food', - key: 'CottonCandyBlue', - text: t('foodCottonCandyBlue'), - }, { - type: 'food', - key: 'Honey', - text: t('foodHoney'), - }, - ], - gp: 0, - exp: 0, - }, - }, - falcon: { - text: t('questFalconText'), - notes: t('questFalconNotes'), - completion: t('questFalconCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questFalconBoss'), - hp: 700, - str: 2, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Falcon', - text: t('questFalconDropFalconEgg'), - }, { - type: 'eggs', - key: 'Falcon', - text: t('questFalconDropFalconEgg'), - }, { - type: 'eggs', - key: 'Falcon', - text: t('questFalconDropFalconEgg'), - }, - ], - gp: 49, - exp: 425, - unlock: t('questFalconUnlockText'), - }, - }, - treeling: { - text: t('questTreelingText'), - notes: t('questTreelingNotes'), - completion: t('questTreelingCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questTreelingBoss'), - hp: 600, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Treeling', - text: t('questTreelingDropTreelingEgg'), - }, { - type: 'eggs', - key: 'Treeling', - text: t('questTreelingDropTreelingEgg'), - }, { - type: 'eggs', - key: 'Treeling', - text: t('questTreelingDropTreelingEgg'), - }, - ], - gp: 43, - exp: 350, - unlock: t('questTreelingUnlockText'), - }, - }, - axolotl: { - text: t('questAxolotlText'), - notes: t('questAxolotlNotes'), - completion: t('questAxolotlCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questAxolotlBoss'), - hp: 500, - str: 1.5, - rage: { - title: t('questAxolotlRageTitle'), - description: t('questAxolotlRageDescription'), - value: 50, - healing: 0.3, - effect: t('questAxolotlRageEffect'), - }, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Axolotl', - text: t('questAxolotlDropAxolotlEgg'), - }, { - type: 'eggs', - key: 'Axolotl', - text: t('questAxolotlDropAxolotlEgg'), - }, { - type: 'eggs', - key: 'Axolotl', - text: t('questAxolotlDropAxolotlEgg'), - }, - ], - gp: 37, - exp: 275, - unlock: t('questAxolotlUnlockText'), - }, - }, - turtle: { - text: t('questTurtleText'), - notes: t('questTurtleNotes'), - completion: t('questTurtleCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questTurtleBoss'), - hp: 300, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Turtle', - text: t('questTurtleDropTurtleEgg'), - }, { - type: 'eggs', - key: 'Turtle', - text: t('questTurtleDropTurtleEgg'), - }, { - type: 'eggs', - key: 'Turtle', - text: t('questTurtleDropTurtleEgg'), - }, - ], - gp: 25, - exp: 125, - unlock: t('questTurtleUnlockText'), - }, - }, - armadillo: { - text: t('questArmadilloText'), - notes: t('questArmadilloNotes'), - completion: t('questArmadilloCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questArmadilloBoss'), - hp: 600, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Armadillo', - text: t('questArmadilloDropArmadilloEgg'), - }, { - type: 'eggs', - key: 'Armadillo', - text: t('questArmadilloDropArmadilloEgg'), - }, { - type: 'eggs', - key: 'Armadillo', - text: t('questArmadilloDropArmadilloEgg'), - }, - ], - gp: 43, - exp: 350, - unlock: t('questArmadilloUnlockText'), - }, - }, - cow: { - text: t('questCowText'), - notes: t('questCowNotes'), - completion: t('questCowCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questCowBoss'), - hp: 400, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Cow', - text: t('questCowDropCowEgg'), - }, { - type: 'eggs', - key: 'Cow', - text: t('questCowDropCowEgg'), - }, { - type: 'eggs', - key: 'Cow', - text: t('questCowDropCowEgg'), - }, - ], - gp: 31, - exp: 200, - unlock: t('questCowUnlockText'), - }, - }, - beetle: { - text: t('questBeetleText'), - notes: t('questBeetleNotes'), - completion: t('questBeetleCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questBeetleBoss'), - hp: 500, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Beetle', - text: t('questBeetleDropBeetleEgg'), - }, { - type: 'eggs', - key: 'Beetle', - text: t('questBeetleDropBeetleEgg'), - }, { - type: 'eggs', - key: 'Beetle', - text: t('questBeetleDropBeetleEgg'), - }, - ], - gp: 37, - exp: 275, - unlock: t('questBeetleUnlockText'), - }, - }, - taskwoodsTerror1: { - text: t('questTaskwoodsTerror1Text'), - notes: t('questTaskwoodsTerror1Notes'), - group: 'questGroupTaskwoodsTerror', - completion: t('questTaskwoodsTerror1Completion'), - value: 4, - goldValue: 200, - category: 'gold', - boss: { - name: t('questTaskwoodsTerror1Boss'), - hp: 500, - rage: { - title: t('questTaskwoodsTerror1RageTitle'), - description: t('questTaskwoodsTerror1RageDescription'), - value: 50, - healing: 0.3, - effect: t('questTaskwoodsTerror1RageEffect'), - }, - }, - drop: { - items: [ - { - type: 'hatchingPotions', - key: 'Skeleton', - text: t('questTaskwoodsTerror1DropSkeletonPotion'), - }, { - type: 'hatchingPotions', - key: 'Red', - text: t('questTaskwoodsTerror1DropRedPotion'), - }, { - type: 'gear', - key: 'head_special_pyromancersTurban', - text: t('questTaskwoodsTerror1DropHeadgear'), - }, - ], - gp: 0, - exp: 500, - }, - }, - taskwoodsTerror2: { - text: t('questTaskwoodsTerror2Text'), - notes: t('questTaskwoodsTerror2Notes'), - group: 'questGroupTaskwoodsTerror', - completion: t('questTaskwoodsTerror2Completion'), - previous: 'taskwoodsTerror1', - value: 4, - goldValue: 300, - category: 'gold', - collect: { - pixie: { - text: t('questTaskwoodsTerror2CollectPixies'), - count: 25, - }, - brownie: { - text: t('questTaskwoodsTerror2CollectBrownies'), - count: 15, - }, - dryad: { - text: t('questTaskwoodsTerror2CollectDryads'), - count: 10, - }, - }, - drop: { - items: [ - { - type: 'gear', - key: 'armor_special_pyromancersRobes', - text: t('questTaskwoodsTerror2DropArmor'), - }, - ], - gp: 0, - exp: 75, - }, - }, - taskwoodsTerror3: { - text: t('questTaskwoodsTerror3Text'), - notes: t('questTaskwoodsTerror3Notes'), - group: 'questGroupTaskwoodsTerror', - completion: t('questTaskwoodsTerror3Completion'), - previous: 'taskwoodsTerror2', - value: 4, - goldValue: 400, - category: 'gold', - boss: { - name: t('questTaskwoodsTerror3Boss'), - hp: 1000, - str: 2, - }, - drop: { - items: [ - { - type: 'food', - key: 'Strawberry', - text: t('questTaskwoodsTerror3DropStrawberry'), - }, { - type: 'food', - key: 'Strawberry', - text: t('questTaskwoodsTerror3DropStrawberry'), - }, { - type: 'food', - key: 'Strawberry', - text: t('questTaskwoodsTerror3DropStrawberry'), - }, { - type: 'gear', - key: 'weapon_special_taskwoodsLantern', - text: t('questTaskwoodsTerror3DropWeapon'), - }, - ], - gp: 0, - exp: 650, - }, - }, - ferret: { - text: t('questFerretText'), - notes: t('questFerretNotes'), - completion: t('questFerretCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questFerretBoss'), - hp: 400, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Ferret', - text: t('questFerretDropFerretEgg'), - }, { - type: 'eggs', - key: 'Ferret', - text: t('questFerretDropFerretEgg'), - }, { - type: 'eggs', - key: 'Ferret', - text: t('questFerretDropFerretEgg'), - }, - ], - gp: 31, - exp: 200, - unlock: t('questFerretUnlockText'), - }, - }, - dustbunnies: { - text: t('questDustBunniesText'), - notes: t('questDustBunniesNotes'), - group: 'questGroupEarnable', - completion: t('questDustBunniesCompletion'), - value: 1, - category: 'unlockable', - boss: { - name: t('questDustBunniesBoss'), - hp: 100, - str: 0.5, - }, - drop: { - gp: 8, - exp: 42, - }, - }, - moon1: { - text: t('questMoon1Text'), - notes: t('questMoon1Notes'), - group: 'questGroupMoon', - completion: t('questMoon1Completion'), - value: 4, - category: 'unlockable', - unlockCondition: { - condition: 'login reward', - incentiveThreshold: 7, - text: t('loginReward', { count: 7 }), - }, - collect: { - shard: { - text: t('questMoon1CollectShards'), - count: 20, - }, - }, - drop: { - items: [ - { - type: 'gear', - key: 'head_special_lunarWarriorHelm', - text: t('questMoon1DropHeadgear'), - }, - ], - gp: 7, - exp: 50, - }, - }, - moon2: { - text: t('questMoon2Text'), - notes: t('questMoon2Notes'), - group: 'questGroupMoon', - completion: t('questMoon2Completion'), - previous: 'moon1', - value: 4, - category: 'unlockable', - unlockCondition: { - condition: 'login reward', - incentiveThreshold: 22, - text: t('loginReward', { count: 22 }), - }, - boss: { - name: t('questMoon2Boss'), - hp: 100, - str: 1.5, - }, - drop: { - items: [ - { - type: 'gear', - key: 'armor_special_lunarWarriorArmor', - text: t('questMoon2DropArmor'), - }, - ], - gp: 37, - exp: 275, - }, - }, - moon3: { - text: t('questMoon3Text'), - notes: t('questMoon3Notes'), - group: 'questGroupMoon', - completion: t('questMoon3Completion'), - previous: 'moon2', - value: 4, - category: 'unlockable', - unlockCondition: { - condition: 'login reward', - incentiveThreshold: 40, - text: t('loginReward', { count: 40 }), - }, - boss: { - name: t('questMoon3Boss'), - hp: 1000, - str: 2, - }, - drop: { - items: [ - { - type: 'gear', - key: 'weapon_special_lunarScythe', - text: t('questMoon3DropWeapon'), - }, - ], - gp: 67, - exp: 650, - }, - }, - sloth: { - text: t('questSlothText'), - notes: t('questSlothNotes'), - completion: t('questSlothCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questSlothBoss'), - hp: 400, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Sloth', - text: t('questSlothDropSlothEgg'), - }, { - type: 'eggs', - key: 'Sloth', - text: t('questSlothDropSlothEgg'), - }, { - type: 'eggs', - key: 'Sloth', - text: t('questSlothDropSlothEgg'), - }, - ], - gp: 31, - exp: 200, - unlock: t('questSlothUnlockText'), - }, - }, - triceratops: { - text: t('questTriceratopsText'), - notes: t('questTriceratopsNotes'), - completion: t('questTriceratopsCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questTriceratopsBoss'), - hp: 1200, - str: 2.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Triceratops', - text: t('questTriceratopsDropTriceratopsEgg'), - }, { - type: 'eggs', - key: 'Triceratops', - text: t('questTriceratopsDropTriceratopsEgg'), - }, { - type: 'eggs', - key: 'Triceratops', - text: t('questTriceratopsDropTriceratopsEgg'), - }, - ], - gp: 80, - exp: 800, - unlock: t('questTriceratopsUnlockText'), - }, - }, - stoikalmCalamity1: { - text: t('questStoikalmCalamity1Text'), - notes: t('questStoikalmCalamity1Notes'), - group: 'questGroupStoikalmCalamity', - completion: t('questStoikalmCalamity1Completion'), - value: 4, - goldValue: 200, - category: 'gold', - boss: { - name: t('questStoikalmCalamity1Boss'), - hp: 500, - rage: { - title: t('questStoikalmCalamity1RageTitle'), - description: t('questStoikalmCalamity1RageDescription'), - value: 50, - healing: 0.3, - effect: t('questStoikalmCalamity1RageEffect'), - }, - }, - drop: { - items: [ - { - type: 'hatchingPotions', - key: 'Skeleton', - text: t('questStoikalmCalamity1DropSkeletonPotion'), - }, { - type: 'hatchingPotions', - key: 'Desert', - text: t('questStoikalmCalamity1DropDesertPotion'), - }, { - type: 'gear', - key: 'armor_special_mammothRiderArmor', - text: t('questStoikalmCalamity1DropArmor'), - }, - ], - gp: 0, - exp: 500, - }, - }, - stoikalmCalamity2: { - text: t('questStoikalmCalamity2Text'), - notes: t('questStoikalmCalamity2Notes'), - group: 'questGroupStoikalmCalamity', - completion: t('questStoikalmCalamity2Completion'), - previous: 'stoikalmCalamity1', - value: 4, - goldValue: 300, - category: 'gold', - collect: { - icicleCoin: { - text: t('questStoikalmCalamity2CollectIcicleCoins'), - count: 40, - }, - }, - drop: { - items: [ - { - type: 'gear', - key: 'head_special_mammothRiderHelm', - text: t('questStoikalmCalamity2DropHeadgear'), - }, - ], - gp: 0, - exp: 75, - }, - }, - stoikalmCalamity3: { - text: t('questStoikalmCalamity3Text'), - notes: t('questStoikalmCalamity3Notes'), - group: 'questGroupStoikalmCalamity', - completion: t('questStoikalmCalamity3Completion'), - previous: 'stoikalmCalamity2', - value: 4, - goldValue: 400, - category: 'gold', - boss: { - name: t('questStoikalmCalamity3Boss'), - hp: 1000, - str: 2, - }, - drop: { - items: [ - { - type: 'food', - key: 'CottonCandyBlue', - text: t('questStoikalmCalamity3DropBlueCottonCandy'), - }, { - type: 'food', - key: 'CottonCandyBlue', - text: t('questStoikalmCalamity3DropBlueCottonCandy'), - }, { - type: 'food', - key: 'CottonCandyBlue', - text: t('questStoikalmCalamity3DropBlueCottonCandy'), - }, { - type: 'gear', - key: 'weapon_special_mammothRiderSpear', - text: t('questStoikalmCalamity3DropWeapon'), - }, { - type: 'gear', - key: 'shield_special_mammothRiderHorn', - text: t('questStoikalmCalamity3DropShield'), - }, - ], - gp: 0, - exp: 650, - }, - }, - guineapig: { - text: t('questGuineaPigText'), - notes: t('questGuineaPigNotes'), - completion: t('questGuineaPigCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questGuineaPigBoss'), - hp: 400, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'GuineaPig', - text: t('questGuineaPigDropGuineaPigEgg'), - }, { - type: 'eggs', - key: 'GuineaPig', - text: t('questGuineaPigDropGuineaPigEgg'), - }, { - type: 'eggs', - key: 'GuineaPig', - text: t('questGuineaPigDropGuineaPigEgg'), - }, - ], - gp: 31, - exp: 200, - unlock: t('questGuineaPigUnlockText'), - }, - }, - peacock: { - text: t('questPeacockText'), - notes: t('questPeacockNotes'), - completion: t('questPeacockCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questPeacockBoss'), - hp: 300, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Peacock', - text: t('questPeacockDropPeacockEgg'), - }, { - type: 'eggs', - key: 'Peacock', - text: t('questPeacockDropPeacockEgg'), - }, { - type: 'eggs', - key: 'Peacock', - text: t('questPeacockDropPeacockEgg'), - }, - ], - gp: 25, - exp: 125, - unlock: t('questPeacockUnlockText'), - }, - }, - butterfly: { - text: t('questButterflyText'), - notes: t('questButterflyNotes'), - completion: t('questButterflyCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questButterflyBoss'), - hp: 400, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Butterfly', - text: t('questButterflyDropButterflyEgg'), - }, { - type: 'eggs', - key: 'Butterfly', - text: t('questButterflyDropButterflyEgg'), - }, { - type: 'eggs', - key: 'Butterfly', - text: t('questButterflyDropButterflyEgg'), - }, - ], - gp: 31, - exp: 200, - unlock: t('questButterflyUnlockText'), - }, - }, mayhemMistiflying1: { text: t('questMayhemMistiflying1Text'), notes: t('questMayhemMistiflying1Notes'), @@ -2723,70 +774,227 @@ const quests = { exp: 650, }, }, - nudibranch: { - text: t('questNudibranchText'), - notes: t('questNudibranchNotes'), - completion: t('questNudibranchCompletion'), + stoikalmCalamity1: { + text: t('questStoikalmCalamity1Text'), + notes: t('questStoikalmCalamity1Notes'), + group: 'questGroupStoikalmCalamity', + completion: t('questStoikalmCalamity1Completion'), value: 4, - category: 'pet', + goldValue: 200, + category: 'gold', boss: { - name: t('questNudibranchBoss'), - hp: 400, - str: 1.5, + name: t('questStoikalmCalamity1Boss'), + hp: 500, + rage: { + title: t('questStoikalmCalamity1RageTitle'), + description: t('questStoikalmCalamity1RageDescription'), + value: 50, + healing: 0.3, + effect: t('questStoikalmCalamity1RageEffect'), + }, }, drop: { items: [ { - type: 'eggs', - key: 'Nudibranch', - text: t('questNudibranchDropNudibranchEgg'), + type: 'hatchingPotions', + key: 'Skeleton', + text: t('questStoikalmCalamity1DropSkeletonPotion'), }, { - type: 'eggs', - key: 'Nudibranch', - text: t('questNudibranchDropNudibranchEgg'), + type: 'hatchingPotions', + key: 'Desert', + text: t('questStoikalmCalamity1DropDesertPotion'), }, { - type: 'eggs', - key: 'Nudibranch', - text: t('questNudibranchDropNudibranchEgg'), + type: 'gear', + key: 'armor_special_mammothRiderArmor', + text: t('questStoikalmCalamity1DropArmor'), }, ], - gp: 31, - exp: 200, - unlock: t('questNudibranchUnlockText'), + gp: 0, + exp: 500, }, }, - hippo: { - text: t('questHippoText'), - notes: t('questHippoNotes'), - completion: t('questHippoCompletion'), + stoikalmCalamity2: { + text: t('questStoikalmCalamity2Text'), + notes: t('questStoikalmCalamity2Notes'), + group: 'questGroupStoikalmCalamity', + completion: t('questStoikalmCalamity2Completion'), + previous: 'stoikalmCalamity1', value: 4, - category: 'pet', + goldValue: 300, + category: 'gold', + collect: { + icicleCoin: { + text: t('questStoikalmCalamity2CollectIcicleCoins'), + count: 40, + }, + }, + drop: { + items: [ + { + type: 'gear', + key: 'head_special_mammothRiderHelm', + text: t('questStoikalmCalamity2DropHeadgear'), + }, + ], + gp: 0, + exp: 75, + }, + }, + stoikalmCalamity3: { + text: t('questStoikalmCalamity3Text'), + notes: t('questStoikalmCalamity3Notes'), + group: 'questGroupStoikalmCalamity', + completion: t('questStoikalmCalamity3Completion'), + previous: 'stoikalmCalamity2', + value: 4, + goldValue: 400, + category: 'gold', boss: { - name: t('questHippoBoss'), - hp: 800, + name: t('questStoikalmCalamity3Boss'), + hp: 1000, str: 2, }, drop: { items: [ { - type: 'eggs', - key: 'Hippo', - text: t('questHippoDropHippoEgg'), + type: 'food', + key: 'CottonCandyBlue', + text: t('questStoikalmCalamity3DropBlueCottonCandy'), }, { - type: 'eggs', - key: 'Hippo', - text: t('questHippoDropHippoEgg'), + type: 'food', + key: 'CottonCandyBlue', + text: t('questStoikalmCalamity3DropBlueCottonCandy'), }, { - type: 'eggs', - key: 'Hippo', - text: t('questHippoDropHippoEgg'), + type: 'food', + key: 'CottonCandyBlue', + text: t('questStoikalmCalamity3DropBlueCottonCandy'), + }, { + type: 'gear', + key: 'weapon_special_mammothRiderSpear', + text: t('questStoikalmCalamity3DropWeapon'), + }, { + type: 'gear', + key: 'shield_special_mammothRiderHorn', + text: t('questStoikalmCalamity3DropShield'), }, ], - gp: 55, - exp: 500, - unlock: t('questHippoUnlockText'), + gp: 0, + exp: 650, }, }, + taskwoodsTerror1: { + text: t('questTaskwoodsTerror1Text'), + notes: t('questTaskwoodsTerror1Notes'), + group: 'questGroupTaskwoodsTerror', + completion: t('questTaskwoodsTerror1Completion'), + value: 4, + goldValue: 200, + category: 'gold', + boss: { + name: t('questTaskwoodsTerror1Boss'), + hp: 500, + rage: { + title: t('questTaskwoodsTerror1RageTitle'), + description: t('questTaskwoodsTerror1RageDescription'), + value: 50, + healing: 0.3, + effect: t('questTaskwoodsTerror1RageEffect'), + }, + }, + drop: { + items: [ + { + type: 'hatchingPotions', + key: 'Skeleton', + text: t('questTaskwoodsTerror1DropSkeletonPotion'), + }, { + type: 'hatchingPotions', + key: 'Red', + text: t('questTaskwoodsTerror1DropRedPotion'), + }, { + type: 'gear', + key: 'head_special_pyromancersTurban', + text: t('questTaskwoodsTerror1DropHeadgear'), + }, + ], + gp: 0, + exp: 500, + }, + }, + taskwoodsTerror2: { + text: t('questTaskwoodsTerror2Text'), + notes: t('questTaskwoodsTerror2Notes'), + group: 'questGroupTaskwoodsTerror', + completion: t('questTaskwoodsTerror2Completion'), + previous: 'taskwoodsTerror1', + value: 4, + goldValue: 300, + category: 'gold', + collect: { + pixie: { + text: t('questTaskwoodsTerror2CollectPixies'), + count: 25, + }, + brownie: { + text: t('questTaskwoodsTerror2CollectBrownies'), + count: 15, + }, + dryad: { + text: t('questTaskwoodsTerror2CollectDryads'), + count: 10, + }, + }, + drop: { + items: [ + { + type: 'gear', + key: 'armor_special_pyromancersRobes', + text: t('questTaskwoodsTerror2DropArmor'), + }, + ], + gp: 0, + exp: 75, + }, + }, + taskwoodsTerror3: { + text: t('questTaskwoodsTerror3Text'), + notes: t('questTaskwoodsTerror3Notes'), + group: 'questGroupTaskwoodsTerror', + completion: t('questTaskwoodsTerror3Completion'), + previous: 'taskwoodsTerror2', + value: 4, + goldValue: 400, + category: 'gold', + boss: { + name: t('questTaskwoodsTerror3Boss'), + hp: 1000, + str: 2, + }, + drop: { + items: [ + { + type: 'food', + key: 'Strawberry', + text: t('questTaskwoodsTerror3DropStrawberry'), + }, { + type: 'food', + key: 'Strawberry', + text: t('questTaskwoodsTerror3DropStrawberry'), + }, { + type: 'food', + key: 'Strawberry', + text: t('questTaskwoodsTerror3DropStrawberry'), + }, { + type: 'gear', + key: 'weapon_special_taskwoodsLantern', + text: t('questTaskwoodsTerror3DropWeapon'), + }, + ], + gp: 0, + exp: 650, + }, + }, + // final quest series in Masterclasser lostMasterclasser1: { text: t('questLostMasterclasser1Text'), notes: t('questLostMasterclasser1Notes'), @@ -3009,14 +1217,309 @@ const quests = { exp: 3500, }, }, - yarn: { - text: t('questYarnText'), - notes: t('questYarnNotes'), - completion: t('questYarnCompletion'), + // seasonal quests + // winter + evilsanta: { + event: CURRENT_EVENT && CURRENT_EVENT.season === 'winter' ? CURRENT_EVENT : null, + text: t('questEvilSantaText'), + notes: t('questEvilSantaNotes'), + addlNotes: t('evilSantaAddlNotes'), + completion: t('questEvilSantaCompletion'), value: 4, category: 'pet', boss: { - name: t('questYarnBoss'), + name: t('questEvilSantaBoss'), + hp: 300, + str: 1, + }, + drop: { + items: [ + { + type: 'mounts', + key: 'BearCub-Polar', + text: t('questEvilSantaDropBearCubPolarMount'), + }, + ], + gp: 20, + exp: 100, + }, + }, + evilsanta2: { + event: CURRENT_EVENT && CURRENT_EVENT.season === 'winter' ? CURRENT_EVENT : null, + text: t('questEvilSanta2Text'), + notes: t('questEvilSanta2Notes'), + addlNotes: t('evilSantaAddlNotes'), + completion: t('questEvilSanta2Completion'), + value: 4, + category: 'pet', + collect: { + tracks: { + text: t('questEvilSanta2CollectTracks'), + count: 20, + }, + branches: { + text: t('questEvilSanta2CollectBranches'), + count: 10, + }, + }, + drop: { + items: [ + { + type: 'pets', + key: 'BearCub-Polar', + text: t('questEvilSanta2DropBearCubPolarPet'), + }, + ], + gp: 20, + exp: 100, + }, + }, + // spring + egg: { + text: t('questEggHuntText'), + notes: t('questEggHuntNotes'), + completion: t('questEggHuntCompletion'), + value: 1, + category: 'pet', + event: CURRENT_EVENT && CURRENT_EVENT.season === 'spring' ? CURRENT_EVENT : null, + collect: { + plainEgg: { + text: t('questEggHuntCollectPlainEgg'), + count: 40, + }, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Egg', + text: t('questEggHuntDropPlainEgg'), + }, { + type: 'eggs', + key: 'Egg', + text: t('questEggHuntDropPlainEgg'), + }, { + type: 'eggs', + key: 'Egg', + text: t('questEggHuntDropPlainEgg'), + }, { + type: 'eggs', + key: 'Egg', + text: t('questEggHuntDropPlainEgg'), + }, { + type: 'eggs', + key: 'Egg', + text: t('questEggHuntDropPlainEgg'), + }, { + type: 'eggs', + key: 'Egg', + text: t('questEggHuntDropPlainEgg'), + }, { + type: 'eggs', + key: 'Egg', + text: t('questEggHuntDropPlainEgg'), + }, { + type: 'eggs', + key: 'Egg', + text: t('questEggHuntDropPlainEgg'), + }, { + type: 'eggs', + key: 'Egg', + text: t('questEggHuntDropPlainEgg'), + }, { + type: 'eggs', + key: 'Egg', + text: t('questEggHuntDropPlainEgg'), + }, + ], + gp: 0, + exp: 0, + }, + }, + waffle: { + text: t('questWaffleText'), + notes: t('questWaffleNotes'), + completion: t('questWaffleCompletion'), + value: 4, + category: 'hatchingPotion', + event: CURRENT_EVENT && CURRENT_EVENT.season === 'spring' ? CURRENT_EVENT : null, + boss: { + name: t('questWaffleBoss'), + hp: 500, + str: 2, + rage: { + title: t('questWaffleRageTitle'), + description: t('questWaffleRageDescription'), + value: 50, + progressDrain: 0.5, + effect: t('questWaffleRageEffect'), + }, + }, + drop: { + items: [ + { + type: 'hatchingPotions', + key: 'Dessert', + text: t('questWaffleDropDessertPotion'), + }, { + type: 'hatchingPotions', + key: 'Dessert', + text: t('questWaffleDropDessertPotion'), + }, { + type: 'hatchingPotions', + key: 'Dessert', + text: t('questWaffleDropDessertPotion'), + }, + ], + gp: 40, + exp: 500, + unlock: t('questWaffleUnlockText'), + }, + }, + // pet quests + alligator: { + text: t('questAlligatorText'), + notes: t('questAlligatorNotes'), + completion: t('questAlligatorCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questAlligatorBoss'), + hp: 1100, + str: 2.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Alligator', + text: t('questAlligatorDropAlligatorEgg'), + }, { + type: 'eggs', + key: 'Alligator', + text: t('questAlligatorDropAlligatorEgg'), + }, { + type: 'eggs', + key: 'Alligator', + text: t('questAlligatorDropAlligatorEgg'), + }, + ], + gp: 73, + exp: 725, + unlock: t('questAlligatorUnlockText'), + }, + }, + armadillo: { + text: t('questArmadilloText'), + notes: t('questArmadilloNotes'), + completion: t('questArmadilloCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questArmadilloBoss'), + hp: 600, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Armadillo', + text: t('questArmadilloDropArmadilloEgg'), + }, { + type: 'eggs', + key: 'Armadillo', + text: t('questArmadilloDropArmadilloEgg'), + }, { + type: 'eggs', + key: 'Armadillo', + text: t('questArmadilloDropArmadilloEgg'), + }, + ], + gp: 43, + exp: 350, + unlock: t('questArmadilloUnlockText'), + }, + }, + axolotl: { + text: t('questAxolotlText'), + notes: t('questAxolotlNotes'), + completion: t('questAxolotlCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questAxolotlBoss'), + hp: 500, + str: 1.5, + rage: { + title: t('questAxolotlRageTitle'), + description: t('questAxolotlRageDescription'), + value: 50, + healing: 0.3, + effect: t('questAxolotlRageEffect'), + }, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Axolotl', + text: t('questAxolotlDropAxolotlEgg'), + }, { + type: 'eggs', + key: 'Axolotl', + text: t('questAxolotlDropAxolotlEgg'), + }, { + type: 'eggs', + key: 'Axolotl', + text: t('questAxolotlDropAxolotlEgg'), + }, + ], + gp: 37, + exp: 275, + unlock: t('questAxolotlUnlockText'), + }, + }, + badger: { + text: t('questBadgerText'), + notes: t('questBadgerNotes'), + completion: t('questBadgerCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questBadgerBoss'), + hp: 600, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Badger', + text: t('questBadgerDropBadgerEgg'), + }, { + type: 'eggs', + key: 'Badger', + text: t('questBadgerDropBadgerEgg'), + }, { + type: 'eggs', + key: 'Badger', + text: t('questBadgerDropBadgerEgg'), + }, + ], + gp: 43, + exp: 350, + unlock: t('questBadgerUnlockText'), + }, + }, + beetle: { + text: t('questBeetleText'), + notes: t('questBeetleNotes'), + completion: t('questBeetleCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questBeetleBoss'), hp: 500, str: 1.5, }, @@ -3024,21 +1527,789 @@ const quests = { items: [ { type: 'eggs', - key: 'Yarn', - text: t('questYarnDropYarnEgg'), + key: 'Beetle', + text: t('questBeetleDropBeetleEgg'), }, { type: 'eggs', - key: 'Yarn', - text: t('questYarnDropYarnEgg'), + key: 'Beetle', + text: t('questBeetleDropBeetleEgg'), }, { type: 'eggs', - key: 'Yarn', - text: t('questYarnDropYarnEgg'), + key: 'Beetle', + text: t('questBeetleDropBeetleEgg'), }, ], gp: 37, exp: 275, - unlock: t('questYarnUnlockText'), + unlock: t('questBeetleUnlockText'), + }, + }, + bunny: { + text: t('questBunnyText'), + notes: t('questBunnyNotes'), + completion: t('questBunnyCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questBunnyBoss'), + hp: 300, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Bunny', + text: t('questBunnyDropBunnyEgg'), + }, { + type: 'eggs', + key: 'Bunny', + text: t('questBunnyDropBunnyEgg'), + }, { + type: 'eggs', + key: 'Bunny', + text: t('questBunnyDropBunnyEgg'), + }, + ], + gp: 25, + exp: 125, + unlock: t('questBunnyUnlockText'), + }, + }, + butterfly: { + text: t('questButterflyText'), + notes: t('questButterflyNotes'), + completion: t('questButterflyCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questButterflyBoss'), + hp: 400, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Butterfly', + text: t('questButterflyDropButterflyEgg'), + }, { + type: 'eggs', + key: 'Butterfly', + text: t('questButterflyDropButterflyEgg'), + }, { + type: 'eggs', + key: 'Butterfly', + text: t('questButterflyDropButterflyEgg'), + }, + ], + gp: 31, + exp: 200, + unlock: t('questButterflyUnlockText'), + }, + }, + cheetah: { + text: t('questCheetahText'), + notes: t('questCheetahNotes'), + completion: t('questCheetahCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questCheetahBoss'), + hp: 600, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Cheetah', + text: t('questCheetahDropCheetahEgg'), + }, { + type: 'eggs', + key: 'Cheetah', + text: t('questCheetahDropCheetahEgg'), + }, { + type: 'eggs', + key: 'Cheetah', + text: t('questCheetahDropCheetahEgg'), + }, + ], + gp: 43, + exp: 350, + unlock: t('questCheetahUnlockText'), + }, + }, + cow: { + text: t('questCowText'), + notes: t('questCowNotes'), + completion: t('questCowCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questCowBoss'), + hp: 400, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Cow', + text: t('questCowDropCowEgg'), + }, { + type: 'eggs', + key: 'Cow', + text: t('questCowDropCowEgg'), + }, { + type: 'eggs', + key: 'Cow', + text: t('questCowDropCowEgg'), + }, + ], + gp: 31, + exp: 200, + unlock: t('questCowUnlockText'), + }, + }, + dilatory_derby: { // eslint-disable-line camelcase + text: t('questSeahorseText'), + notes: t('questSeahorseNotes'), + completion: t('questSeahorseCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questSeahorseBoss'), + hp: 300, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Seahorse', + text: t('questSeahorseDropSeahorseEgg'), + }, { + type: 'eggs', + key: 'Seahorse', + text: t('questSeahorseDropSeahorseEgg'), + }, { + type: 'eggs', + key: 'Seahorse', + text: t('questSeahorseDropSeahorseEgg'), + }, + ], + gp: 25, + exp: 125, + unlock: t('questSeahorseUnlockText'), + }, + }, + dolphin: { + text: t('questDolphinText'), + notes: t('questDolphinNotes'), + completion: t('questDolphinCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questDolphinBoss'), + hp: 300, + str: 1.25, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Dolphin', + text: t('questDolphinDropDolphinEgg'), + }, { + type: 'eggs', + key: 'Dolphin', + text: t('questDolphinDropDolphinEgg'), + }, { + type: 'eggs', + key: 'Dolphin', + text: t('questDolphinDropDolphinEgg'), + }, + ], + gp: 22, + exp: 110, + unlock: t('questDolphinUnlockText'), + }, + }, + falcon: { + text: t('questFalconText'), + notes: t('questFalconNotes'), + completion: t('questFalconCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questFalconBoss'), + hp: 700, + str: 2, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Falcon', + text: t('questFalconDropFalconEgg'), + }, { + type: 'eggs', + key: 'Falcon', + text: t('questFalconDropFalconEgg'), + }, { + type: 'eggs', + key: 'Falcon', + text: t('questFalconDropFalconEgg'), + }, + ], + gp: 49, + exp: 425, + unlock: t('questFalconUnlockText'), + }, + }, + ferret: { + text: t('questFerretText'), + notes: t('questFerretNotes'), + completion: t('questFerretCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questFerretBoss'), + hp: 400, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Ferret', + text: t('questFerretDropFerretEgg'), + }, { + type: 'eggs', + key: 'Ferret', + text: t('questFerretDropFerretEgg'), + }, { + type: 'eggs', + key: 'Ferret', + text: t('questFerretDropFerretEgg'), + }, + ], + gp: 31, + exp: 200, + unlock: t('questFerretUnlockText'), + }, + }, + frog: { + text: t('questFrogText'), + notes: t('questFrogNotes'), + completion: t('questFrogCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questFrogBoss'), + hp: 300, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Frog', + text: t('questFrogDropFrogEgg'), + }, { + type: 'eggs', + key: 'Frog', + text: t('questFrogDropFrogEgg'), + }, { + type: 'eggs', + key: 'Frog', + text: t('questFrogDropFrogEgg'), + }, + ], + gp: 25, + exp: 125, + unlock: t('questFrogUnlockText'), + }, + }, + ghost_stag: { // eslint-disable-line camelcase + text: t('questGhostStagText'), + notes: t('questGhostStagNotes'), + completion: t('questGhostStagCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questGhostStagBoss'), + hp: 1200, + str: 2.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Deer', + text: t('questGhostStagDropDeerEgg'), + }, { + type: 'eggs', + key: 'Deer', + text: t('questGhostStagDropDeerEgg'), + }, { + type: 'eggs', + key: 'Deer', + text: t('questGhostStagDropDeerEgg'), + }, + ], + gp: 80, + exp: 800, + unlock: t('questGhostStagUnlockText'), + }, + }, + gryphon: { + text: t('questGryphonText'), + notes: t('questGryphonNotes'), + completion: t('questGryphonCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questGryphonBoss'), + hp: 300, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Gryphon', + text: t('questGryphonDropGryphonEgg'), + }, { + type: 'eggs', + key: 'Gryphon', + text: t('questGryphonDropGryphonEgg'), + }, { + type: 'eggs', + key: 'Gryphon', + text: t('questGryphonDropGryphonEgg'), + }, + ], + gp: 25, + exp: 125, + unlock: t('questGryphonUnlockText'), + }, + }, + guineapig: { + text: t('questGuineaPigText'), + notes: t('questGuineaPigNotes'), + completion: t('questGuineaPigCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questGuineaPigBoss'), + hp: 400, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'GuineaPig', + text: t('questGuineaPigDropGuineaPigEgg'), + }, { + type: 'eggs', + key: 'GuineaPig', + text: t('questGuineaPigDropGuineaPigEgg'), + }, { + type: 'eggs', + key: 'GuineaPig', + text: t('questGuineaPigDropGuineaPigEgg'), + }, + ], + gp: 31, + exp: 200, + unlock: t('questGuineaPigUnlockText'), + }, + }, + harpy: { + text: t('questHarpyText'), + notes: t('questHarpyNotes'), + completion: t('questHarpyCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questHarpyBoss'), + hp: 600, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Parrot', + text: t('questHarpyDropParrotEgg'), + }, { + type: 'eggs', + key: 'Parrot', + text: t('questHarpyDropParrotEgg'), + }, { + type: 'eggs', + key: 'Parrot', + text: t('questHarpyDropParrotEgg'), + }, + ], + gp: 43, + exp: 350, + unlock: t('questHarpyUnlockText'), + }, + }, + hedgehog: { + text: t('questHedgehogText'), + notes: t('questHedgehogNotes'), + completion: t('questHedgehogCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questHedgehogBoss'), + hp: 400, + str: 1.25, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Hedgehog', + text: t('questHedgehogDropHedgehogEgg'), + }, { + type: 'eggs', + key: 'Hedgehog', + text: t('questHedgehogDropHedgehogEgg'), + }, { + type: 'eggs', + key: 'Hedgehog', + text: t('questHedgehogDropHedgehogEgg'), + }, + ], + gp: 30, + exp: 125, + unlock: t('questHedgehogUnlockText'), + }, + }, + hippo: { + text: t('questHippoText'), + notes: t('questHippoNotes'), + completion: t('questHippoCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questHippoBoss'), + hp: 800, + str: 2, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Hippo', + text: t('questHippoDropHippoEgg'), + }, { + type: 'eggs', + key: 'Hippo', + text: t('questHippoDropHippoEgg'), + }, { + type: 'eggs', + key: 'Hippo', + text: t('questHippoDropHippoEgg'), + }, + ], + gp: 55, + exp: 500, + unlock: t('questHippoUnlockText'), + }, + }, + horse: { + text: t('questHorseText'), + notes: t('questHorseNotes'), + completion: t('questHorseCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questHorseBoss'), + hp: 500, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Horse', + text: t('questHorseDropHorseEgg'), + }, { + type: 'eggs', + key: 'Horse', + text: t('questHorseDropHorseEgg'), + }, { + type: 'eggs', + key: 'Horse', + text: t('questHorseDropHorseEgg'), + }, + ], + gp: 37, + exp: 275, + unlock: t('questHorseUnlockText'), + }, + }, + kangaroo: { + text: t('questKangarooText'), + notes: t('questKangarooNotes'), + completion: t('questKangarooCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questKangarooBoss'), + hp: 700, + str: 2, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Kangaroo', + text: t('questKangarooDropKangarooEgg'), + }, { + type: 'eggs', + key: 'Kangaroo', + text: t('questKangarooDropKangarooEgg'), + }, { + type: 'eggs', + key: 'Kangaroo', + text: t('questKangarooDropKangarooEgg'), + }, + ], + gp: 49, + exp: 425, + unlock: t('questKangarooUnlockText'), + }, + }, + kraken: { + text: t('questKrakenText'), + notes: t('questKrakenNotes'), + completion: t('questKrakenCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questKrakenBoss'), + hp: 800, + str: 2, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Cuttlefish', + text: t('questKrakenDropCuttlefishEgg'), + }, { + type: 'eggs', + key: 'Cuttlefish', + text: t('questKrakenDropCuttlefishEgg'), + }, { + type: 'eggs', + key: 'Cuttlefish', + text: t('questKrakenDropCuttlefishEgg'), + }, + ], + gp: 55, + exp: 500, + unlock: t('questKrakenUnlockText'), + }, + }, + monkey: { + text: t('questMonkeyText'), + notes: t('questMonkeyNotes'), + completion: t('questMonkeyCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questMonkeyBoss'), + hp: 400, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Monkey', + text: t('questMonkeyDropMonkeyEgg'), + }, { + type: 'eggs', + key: 'Monkey', + text: t('questMonkeyDropMonkeyEgg'), + }, { + type: 'eggs', + key: 'Monkey', + text: t('questMonkeyDropMonkeyEgg'), + }, + ], + gp: 31, + exp: 200, + unlock: t('questMonkeyUnlockText'), + }, + }, + nudibranch: { + text: t('questNudibranchText'), + notes: t('questNudibranchNotes'), + completion: t('questNudibranchCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questNudibranchBoss'), + hp: 400, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Nudibranch', + text: t('questNudibranchDropNudibranchEgg'), + }, { + type: 'eggs', + key: 'Nudibranch', + text: t('questNudibranchDropNudibranchEgg'), + }, { + type: 'eggs', + key: 'Nudibranch', + text: t('questNudibranchDropNudibranchEgg'), + }, + ], + gp: 31, + exp: 200, + unlock: t('questNudibranchUnlockText'), + }, + }, + octopus: { + text: t('questOctopusText'), + notes: t('questOctopusNotes'), + completion: t('questOctopusCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questOctopusBoss'), + hp: 1200, + str: 2.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Octopus', + text: t('questOctopusDropOctopusEgg'), + }, { + type: 'eggs', + key: 'Octopus', + text: t('questOctopusDropOctopusEgg'), + }, { + type: 'eggs', + key: 'Octopus', + text: t('questOctopusDropOctopusEgg'), + }, + ], + gp: 80, + exp: 800, + unlock: t('questOctopusUnlockText'), + }, + }, + owl: { + text: t('questOwlText'), + notes: t('questOwlNotes'), + completion: t('questOwlCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questOwlBoss'), + hp: 500, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Owl', + text: t('questOwlDropOwlEgg'), + }, { + type: 'eggs', + key: 'Owl', + text: t('questOwlDropOwlEgg'), + }, { + type: 'eggs', + key: 'Owl', + text: t('questOwlDropOwlEgg'), + }, + ], + gp: 37, + exp: 275, + unlock: t('questOwlUnlockText'), + }, + }, + peacock: { + text: t('questPeacockText'), + notes: t('questPeacockNotes'), + completion: t('questPeacockCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questPeacockBoss'), + hp: 300, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Peacock', + text: t('questPeacockDropPeacockEgg'), + }, { + type: 'eggs', + key: 'Peacock', + text: t('questPeacockDropPeacockEgg'), + }, { + type: 'eggs', + key: 'Peacock', + text: t('questPeacockDropPeacockEgg'), + }, + ], + gp: 25, + exp: 125, + unlock: t('questPeacockUnlockText'), + }, + }, + penguin: { + text: t('questPenguinText'), + notes: t('questPenguinNotes'), + completion: t('questPenguinCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questPenguinBoss'), + hp: 400, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Penguin', + text: t('questPenguinDropPenguinEgg'), + }, { + type: 'eggs', + key: 'Penguin', + text: t('questPenguinDropPenguinEgg'), + }, { + type: 'eggs', + key: 'Penguin', + text: t('questPenguinDropPenguinEgg'), + }, + ], + gp: 31, + exp: 200, + unlock: t('questPenguinUnlockText'), }, }, pterodactyl: { @@ -3073,14 +2344,398 @@ const quests = { unlock: t('questPterodactylUnlockText'), }, }, - badger: { - text: t('questBadgerText'), - notes: t('questBadgerNotes'), - completion: t('questBadgerCompletion'), + rat: { + text: t('questRatText'), + notes: t('questRatNotes'), + completion: t('questRatCompletion'), value: 4, category: 'pet', boss: { - name: t('questBadgerBoss'), + name: t('questRatBoss'), + hp: 1200, + str: 2.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Rat', + text: t('questRatDropRatEgg'), + }, { + type: 'eggs', + key: 'Rat', + text: t('questRatDropRatEgg'), + }, { + type: 'eggs', + key: 'Rat', + text: t('questRatDropRatEgg'), + }, + ], + gp: 80, + exp: 800, + unlock: t('questRatUnlockText'), + }, + }, + rock: { + text: t('questRockText'), + notes: t('questRockNotes'), + completion: t('questRockCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questRockBoss'), + hp: 400, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Rock', + text: t('questRockDropRockEgg'), + }, { + type: 'eggs', + key: 'Rock', + text: t('questRockDropRockEgg'), + }, { + type: 'eggs', + key: 'Rock', + text: t('questRockDropRockEgg'), + }, + ], + gp: 31, + exp: 200, + unlock: t('questRockUnlockText'), + }, + }, + rooster: { + text: t('questRoosterText'), + notes: t('questRoosterNotes'), + completion: t('questRoosterCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questRoosterBoss'), + hp: 300, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Rooster', + text: t('questRoosterDropRoosterEgg'), + }, { + type: 'eggs', + key: 'Rooster', + text: t('questRoosterDropRoosterEgg'), + }, { + type: 'eggs', + key: 'Rooster', + text: t('questRoosterDropRoosterEgg'), + }, + ], + gp: 25, + exp: 125, + unlock: t('questRoosterUnlockText'), + }, + }, + sabretooth: { + text: t('questSabretoothText'), + notes: t('questSabretoothNotes'), + completion: t('questSabretoothCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questSabretoothBoss'), + hp: 1000, + str: 2, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Sabretooth', + text: t('questSabretoothDropSabretoothEgg'), + }, { + type: 'eggs', + key: 'Sabretooth', + text: t('questSabretoothDropSabretoothEgg'), + }, { + type: 'eggs', + key: 'Sabretooth', + text: t('questSabretoothDropSabretoothEgg'), + }, + ], + gp: 67, + exp: 650, + unlock: t('questSabretoothUnlockText'), + }, + }, + seaserpent: { + text: t('questSeaSerpentText'), + notes: t('questSeaSerpentNotes'), + completion: t('questSeaSerpentCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questSeaSerpentBoss'), + hp: 1200, + str: 2.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'SeaSerpent', + text: t('questSeaSerpentDropSeaSerpentEgg'), + }, { + type: 'eggs', + key: 'SeaSerpent', + text: t('questSeaSerpentDropSeaSerpentEgg'), + }, { + type: 'eggs', + key: 'SeaSerpent', + text: t('questSeaSerpentDropSeaSerpentEgg'), + }, + ], + gp: 80, + exp: 800, + unlock: t('questSeaSerpentUnlockText'), + }, + }, + sheep: { + text: t('questSheepText'), + notes: t('questSheepNotes'), + completion: t('questSheepCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questSheepBoss'), + hp: 300, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Sheep', + text: t('questSheepDropSheepEgg'), + }, { + type: 'eggs', + key: 'Sheep', + text: t('questSheepDropSheepEgg'), + }, { + type: 'eggs', + key: 'Sheep', + text: t('questSheepDropSheepEgg'), + }, + ], + gp: 25, + exp: 125, + unlock: t('questSheepUnlockText'), + }, + }, + slime: { + text: t('questSlimeText'), + notes: t('questSlimeNotes'), + completion: t('questSlimeCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questSlimeBoss'), + hp: 400, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Slime', + text: t('questSlimeDropSlimeEgg'), + }, { + type: 'eggs', + key: 'Slime', + text: t('questSlimeDropSlimeEgg'), + }, { + type: 'eggs', + key: 'Slime', + text: t('questSlimeDropSlimeEgg'), + }, + ], + gp: 31, + exp: 200, + unlock: t('questSlimeUnlockText'), + }, + }, + sloth: { + text: t('questSlothText'), + notes: t('questSlothNotes'), + completion: t('questSlothCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questSlothBoss'), + hp: 400, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Sloth', + text: t('questSlothDropSlothEgg'), + }, { + type: 'eggs', + key: 'Sloth', + text: t('questSlothDropSlothEgg'), + }, { + type: 'eggs', + key: 'Sloth', + text: t('questSlothDropSlothEgg'), + }, + ], + gp: 31, + exp: 200, + unlock: t('questSlothUnlockText'), + }, + }, + snail: { + text: t('questSnailText'), + notes: t('questSnailNotes'), + completion: t('questSnailCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questSnailBoss'), + hp: 500, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Snail', + text: t('questSnailDropSnailEgg'), + }, { + type: 'eggs', + key: 'Snail', + text: t('questSnailDropSnailEgg'), + }, { + type: 'eggs', + key: 'Snail', + text: t('questSnailDropSnailEgg'), + }, + ], + gp: 37, + exp: 275, + unlock: t('questSnailUnlockText'), + }, + }, + snake: { + text: t('questSnakeText'), + notes: t('questSnakeNotes'), + completion: t('questSnakeCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questSnakeBoss'), + hp: 1100, + str: 2.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Snake', + text: t('questSnakeDropSnakeEgg'), + }, { + type: 'eggs', + key: 'Snake', + text: t('questSnakeDropSnakeEgg'), + }, { + type: 'eggs', + key: 'Snake', + text: t('questSnakeDropSnakeEgg'), + }, + ], + gp: 73, + exp: 725, + unlock: t('questSnakeUnlockText'), + }, + }, + spider: { + text: t('questSpiderText'), + notes: t('questSpiderNotes'), + completion: t('questSpiderCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questSpiderBoss'), + hp: 400, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Spider', + text: t('questSpiderDropSpiderEgg'), + }, { + type: 'eggs', + key: 'Spider', + text: t('questSpiderDropSpiderEgg'), + }, { + type: 'eggs', + key: 'Spider', + text: t('questSpiderDropSpiderEgg'), + }, + ], + gp: 31, + exp: 200, + unlock: t('questSpiderUnlockText'), + }, + }, + squirrel: { + text: t('questSquirrelText'), + notes: t('questSquirrelNotes'), + completion: t('questSquirrelCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questSquirrelBoss'), + hp: 700, + str: 2, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Squirrel', + text: t('questSquirrelDropSquirrelEgg'), + }, { + type: 'eggs', + key: 'Squirrel', + text: t('questSquirrelDropSquirrelEgg'), + }, { + type: 'eggs', + key: 'Squirrel', + text: t('questSquirrelDropSquirrelEgg'), + }, + ], + gp: 49, + exp: 425, + unlock: t('questSquirrelUnlockText'), + }, + }, + treeling: { + text: t('questTreelingText'), + notes: t('questTreelingNotes'), + completion: t('questTreelingCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questTreelingBoss'), hp: 600, str: 1.5, }, @@ -3088,21 +2743,973 @@ const quests = { items: [ { type: 'eggs', - key: 'Badger', - text: t('questBadgerDropBadgerEgg'), + key: 'Treeling', + text: t('questTreelingDropTreelingEgg'), }, { type: 'eggs', - key: 'Badger', - text: t('questBadgerDropBadgerEgg'), + key: 'Treeling', + text: t('questTreelingDropTreelingEgg'), }, { type: 'eggs', - key: 'Badger', - text: t('questBadgerDropBadgerEgg'), + key: 'Treeling', + text: t('questTreelingDropTreelingEgg'), }, ], gp: 43, exp: 350, - unlock: t('questBadgerUnlockText'), + unlock: t('questTreelingUnlockText'), + }, + }, + trex: { + text: t('questTRexText'), + notes: t('questTRexNotes'), + completion: t('questTRexCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questTRexBoss'), + hp: 800, + str: 2, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'TRex', + text: t('questTRexDropTRexEgg'), + }, { + type: 'eggs', + key: 'TRex', + text: t('questTRexDropTRexEgg'), + }, { + type: 'eggs', + key: 'TRex', + text: t('questTRexDropTRexEgg'), + }, + ], + gp: 55, + exp: 500, + unlock: t('questTRexUnlockText'), + }, + }, + trex_undead: { // eslint-disable-line camelcase + text: t('questTRexUndeadText'), + notes: t('questTRexUndeadNotes'), + completion: t('questTRexUndeadCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questTRexUndeadBoss'), + hp: 500, + str: 2, + rage: { + title: t('questTRexUndeadRageTitle'), + description: t('questTRexUndeadRageDescription'), + value: 50, + healing: 0.3, + effect: t('questTRexUndeadRageEffect'), + }, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'TRex', + text: t('questTRexDropTRexEgg'), + }, { + type: 'eggs', + key: 'TRex', + text: t('questTRexDropTRexEgg'), + }, { + type: 'eggs', + key: 'TRex', + text: t('questTRexDropTRexEgg'), + }, + ], + gp: 55, + exp: 500, + unlock: t('questTRexUnlockText'), + }, + }, + triceratops: { + text: t('questTriceratopsText'), + notes: t('questTriceratopsNotes'), + completion: t('questTriceratopsCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questTriceratopsBoss'), + hp: 1200, + str: 2.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Triceratops', + text: t('questTriceratopsDropTriceratopsEgg'), + }, { + type: 'eggs', + key: 'Triceratops', + text: t('questTriceratopsDropTriceratopsEgg'), + }, { + type: 'eggs', + key: 'Triceratops', + text: t('questTriceratopsDropTriceratopsEgg'), + }, + ], + gp: 80, + exp: 800, + unlock: t('questTriceratopsUnlockText'), + }, + }, + turtle: { + text: t('questTurtleText'), + notes: t('questTurtleNotes'), + completion: t('questTurtleCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questTurtleBoss'), + hp: 300, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Turtle', + text: t('questTurtleDropTurtleEgg'), + }, { + type: 'eggs', + key: 'Turtle', + text: t('questTurtleDropTurtleEgg'), + }, { + type: 'eggs', + key: 'Turtle', + text: t('questTurtleDropTurtleEgg'), + }, + ], + gp: 25, + exp: 125, + unlock: t('questTurtleUnlockText'), + }, + }, + unicorn: { + text: t('questUnicornText'), + notes: t('questUnicornNotes'), + completion: t('questUnicornCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questUnicornBoss'), + hp: 600, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Unicorn', + text: t('questUnicornDropUnicornEgg'), + }, { + type: 'eggs', + key: 'Unicorn', + text: t('questUnicornDropUnicornEgg'), + }, { + type: 'eggs', + key: 'Unicorn', + text: t('questUnicornDropUnicornEgg'), + }, + ], + gp: 43, + exp: 350, + unlock: t('questUnicornUnlockText'), + }, + }, + velociraptor: { + text: t('questVelociraptorText'), + notes: t('questVelociraptorNotes'), + completion: t('questVelociraptorCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questVelociraptorBoss'), + hp: 900, + str: 2, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Velociraptor', + text: t('questVelociraptorDropVelociraptorEgg'), + }, { + type: 'eggs', + key: 'Velociraptor', + text: t('questVelociraptorDropVelociraptorEgg'), + }, { + type: 'eggs', + key: 'Velociraptor', + text: t('questVelociraptorDropVelociraptorEgg'), + }, + ], + gp: 63, + exp: 575, + unlock: t('questVelociraptorUnlockText'), + }, + }, + whale: { + text: t('questWhaleText'), + notes: t('questWhaleNotes'), + completion: t('questWhaleCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questWhaleBoss'), + hp: 500, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Whale', + text: t('questWhaleDropWhaleEgg'), + }, { + type: 'eggs', + key: 'Whale', + text: t('questWhaleDropWhaleEgg'), + }, { + type: 'eggs', + key: 'Whale', + text: t('questWhaleDropWhaleEgg'), + }, + ], + gp: 37, + exp: 275, + unlock: t('questWhaleUnlockText'), + }, + }, + yarn: { + text: t('questYarnText'), + notes: t('questYarnNotes'), + completion: t('questYarnCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questYarnBoss'), + hp: 500, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Yarn', + text: t('questYarnDropYarnEgg'), + }, { + type: 'eggs', + key: 'Yarn', + text: t('questYarnDropYarnEgg'), + }, { + type: 'eggs', + key: 'Yarn', + text: t('questYarnDropYarnEgg'), + }, + ], + gp: 37, + exp: 275, + unlock: t('questYarnUnlockText'), + }, + }, + // potion quests + amber: { + text: t('questAmberText'), + notes: t('questAmberNotes'), + completion: t('questAmberCompletion'), + value: 4, + category: 'hatchingPotion', + boss: { + name: t('questAmberBoss'), + hp: 300, + str: 1.25, + }, + drop: { + items: [ + { + type: 'hatchingPotions', + key: 'Amber', + text: t('questAmberDropAmberPotion'), + }, { + type: 'hatchingPotions', + key: 'Amber', + text: t('questAmberDropAmberPotion'), + }, { + type: 'hatchingPotions', + key: 'Amber', + text: t('questAmberDropAmberPotion'), + }, + ], + gp: 50, + exp: 100, + unlock: t('questAmberUnlockText'), + }, + }, + blackPearl: { + text: t('questBlackPearlText'), + notes: t('questBlackPearlNotes'), + completion: t('questBlackPearlCompletion'), + value: 4, + category: 'hatchingPotion', + boss: { + name: t('questBlackPearlBoss'), + hp: 725, + str: 1.75, + }, + drop: { + items: [ + { + type: 'hatchingPotions', + key: 'BlackPearl', + text: t('questBlackPearlDropBlackPearlPotion'), + }, { + type: 'hatchingPotions', + key: 'BlackPearl', + text: t('questBlackPearlDropBlackPearlPotion'), + }, { + type: 'hatchingPotions', + key: 'BlackPearl', + text: t('questBlackPearlDropBlackPearlPotion'), + }, + ], + gp: 50, + exp: 450, + unlock: t('questBlackPearlUnlockText'), + }, + }, + bronze: { + text: t('questBronzeText'), + notes: t('questBronzeNotes'), + completion: t('questBronzeCompletion'), + value: 4, + category: 'hatchingPotion', + boss: { + name: t('questBronzeBoss'), + hp: 800, + str: 2, + }, + drop: { + items: [ + { + type: 'hatchingPotions', + key: 'Bronze', + text: t('questBronzeDropBronzePotion'), + }, { + type: 'hatchingPotions', + key: 'Bronze', + text: t('questBronzeDropBronzePotion'), + }, { + type: 'hatchingPotions', + key: 'Bronze', + text: t('questBronzeDropBronzePotion'), + }, + ], + gp: 63, + exp: 575, + unlock: t('questBronzeUnlockText'), + }, + }, + fluorite: { + text: t('questFluoriteText'), + notes: t('questFluoriteNotes'), + completion: t('questFluoriteCompletion'), + value: 4, + category: 'hatchingPotion', + boss: { + name: t('questFluoriteBoss'), + hp: 1200, + str: 2, + }, + drop: { + items: [ + { + type: 'hatchingPotions', + key: 'Fluorite', + text: t('questFluoriteDropFluoritePotion'), + }, { + type: 'hatchingPotions', + key: 'Fluorite', + text: t('questFluoriteDropFluoritePotion'), + }, { + type: 'hatchingPotions', + key: 'Fluorite', + text: t('questFluoriteDropFluoritePotion'), + }, + ], + gp: 70, + exp: 750, + unlock: t('questFluoriteUnlockText'), + }, + }, + onyx: { + text: t('questOnyxText'), + notes: t('questOnyxNotes'), + completion: t('questOnyxCompletion'), + value: 4, + category: 'hatchingPotion', + collect: { + onyxStone: { + text: t('questOnyxCollectOnyxStones'), + count: 25, + }, + plutoRune: { + text: t('questOnyxCollectPlutoRunes'), + count: 10, + }, + leoRune: { + text: t('questOnyxCollectLeoRunes'), + count: 10, + }, + }, + drop: { + items: [ + { + type: 'hatchingPotions', + key: 'Onyx', + text: t('questOnyxDropOnyxPotion'), + }, { + type: 'hatchingPotions', + key: 'Onyx', + text: t('questOnyxDropOnyxPotion'), + }, { + type: 'hatchingPotions', + key: 'Onyx', + text: t('questOnyxDropOnyxPotion'), + }, + ], + gp: 50, + exp: 100, + unlock: t('questOnyxUnlockText'), + }, + }, + ruby: { + text: t('questRubyText'), + notes: t('questRubyNotes'), + completion: t('questRubyCompletion'), + value: 4, + category: 'hatchingPotion', + collect: { + rubyGem: { + text: t('questRubyCollectRubyGems'), + count: 25, + }, + venusRune: { + text: t('questRubyCollectVenusRunes'), + count: 10, + }, + aquariusRune: { + text: t('questRubyCollectAquariusRunes'), + count: 10, + }, + }, + drop: { + items: [ + { + type: 'hatchingPotions', + key: 'Ruby', + text: t('questRubyDropRubyPotion'), + }, { + type: 'hatchingPotions', + key: 'Ruby', + text: t('questRubyDropRubyPotion'), + }, { + type: 'hatchingPotions', + key: 'Ruby', + text: t('questRubyDropRubyPotion'), + }, + ], + gp: 50, + exp: 100, + unlock: t('questRubyUnlockText'), + }, + }, + silver: { + text: t('questSilverText'), + notes: t('questSilverNotes'), + completion: t('questSilverCompletion'), + value: 4, + category: 'hatchingPotion', + collect: { + silverIngot: { + text: t('questSilverCollectSilverIngots'), + count: 20, + }, + moonRune: { + text: t('questSilverCollectMoonRunes'), + count: 15, + }, + cancerRune: { + text: t('questSilverCollectCancerRunes'), + count: 15, + }, + }, + drop: { + items: [ + { + type: 'hatchingPotions', + key: 'Silver', + text: t('questSilverDropSilverPotion'), + }, { + type: 'hatchingPotions', + key: 'Silver', + text: t('questSilverDropSilverPotion'), + }, { + type: 'hatchingPotions', + key: 'Silver', + text: t('questSilverDropSilverPotion'), + }, + ], + gp: 50, + exp: 100, + unlock: t('questSilverUnlockText'), + }, + }, + stone: { + text: t('questStoneText'), + notes: t('questStoneNotes'), + completion: t('questStoneCompletion'), + value: 4, + category: 'hatchingPotion', + collect: { + mossyStone: { + text: t('questStoneCollectMossyStones'), + count: 25, + }, + marsRune: { + text: t('questStoneCollectMarsRunes'), + count: 10, + }, + capricornRune: { + text: t('questStoneCollectCapricornRunes'), + count: 10, + }, + }, + drop: { + items: [ + { + type: 'hatchingPotions', + key: 'MossyStone', + text: t('questStoneDropMossyStonePotion'), + }, { + type: 'hatchingPotions', + key: 'MossyStone', + text: t('questStoneDropMossyStonePotion'), + }, { + type: 'hatchingPotions', + key: 'MossyStone', + text: t('questStoneDropMossyStonePotion'), + }, + ], + gp: 50, + exp: 100, + unlock: t('questStoneUnlockText'), + }, + }, + turquoise: { + text: t('questTurquoiseText'), + notes: t('questTurquoiseNotes'), + completion: t('questTurquoiseCompletion'), + value: 4, + category: 'hatchingPotion', + collect: { + turquoiseGem: { + text: t('questTurquoiseCollectTurquoiseGems'), + count: 25, + }, + sagittariusRune: { + text: t('questTurquoiseCollectSagittariusRunes'), + count: 10, + }, + neptuneRune: { + text: t('questTurquoiseCollectNeptuneRunes'), + count: 10, + }, + }, + drop: { + items: [ + { + type: 'hatchingPotions', + key: 'Turquoise', + text: t('questTurquoiseDropTurquoisePotion'), + }, { + type: 'hatchingPotions', + key: 'Turquoise', + text: t('questTurquoiseDropTurquoisePotion'), + }, { + type: 'hatchingPotions', + key: 'Turquoise', + text: t('questTurquoiseDropTurquoisePotion'), + }, + ], + gp: 50, + exp: 100, + unlock: t('questTurquoiseUnlockText'), + }, + }, + // time travelers quests + robot: { + text: t('questRobotText'), + notes: t('questRobotNotes'), + completion: t('questRobotCompletion'), + value: 1, + category: 'timeTravelers', + canBuy () { + return false; + }, + collect: { + bolt: { + text: t('questRobotCollectBolts'), + count: 15, + }, + gear: { + text: t('questRobotCollectGears'), + count: 10, + }, + spring: { + text: t('questRobotCollectSprings'), + count: 10, + }, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Robot', + text: t('questRobotDropRobotEgg'), + }, { + type: 'eggs', + key: 'Robot', + text: t('questRobotDropRobotEgg'), + }, { + type: 'eggs', + key: 'Robot', + text: t('questRobotDropRobotEgg'), + }, + ], + gp: 40, + exp: 75, + unlock: t('questRobotUnlockText'), + }, + }, + solarSystem: { + text: t('questSolarSystemText'), + notes: t('questSolarSystemNotes'), + completion: t('questSolarSystemCompletion'), + value: 1, + category: 'timeTravelers', + canBuy () { + return false; + }, + boss: { + name: t('questSolarSystemBoss'), + hp: 1500, + str: 2.5, + }, + drop: { + items: [ + { + type: 'hatchingPotions', + key: 'SolarSystem', + text: t('questSolarSystemDropSolarSystemPotion'), + }, { + type: 'hatchingPotions', + key: 'SolarSystem', + text: t('questSolarSystemDropSolarSystemPotion'), + }, { + type: 'hatchingPotions', + key: 'SolarSystem', + text: t('questSolarSystemDropSolarSystemPotion'), + }, + ], + gp: 90, + exp: 900, + unlock: t('questSolarSystemUnlockText'), + }, + }, + windup: { + text: t('questWindupText'), + notes: t('questWindupNotes'), + completion: t('questWindupCompletion'), + value: 1, + category: 'timeTravelers', + canBuy () { + return false; + }, + boss: { + name: t('questWindupBoss'), + hp: 1000, + str: 1, + }, + drop: { + items: [ + { + type: 'hatchingPotions', + key: 'Windup', + text: t('questWindupDropWindupPotion'), + }, { + type: 'hatchingPotions', + key: 'Windup', + text: t('questWindupDropWindupPotion'), + }, { + type: 'hatchingPotions', + key: 'Windup', + text: t('questWindupDropWindupPotion'), + }, + ], + gp: 50, + exp: 425, + unlock: t('questWindupUnlockText'), + }, + }, + // world quests + bewilder: { + text: t('questBewilderText'), + notes: t('questBewilderNotes'), + completion: t('questBewilderCompletion'), + completionChat: t('questBewilderCompletionChat'), + value: 0, + canBuy () { + return false; + }, + category: 'world', + boss: { + name: t('questBewilderText'), + hp: 20000000, + str: 1, + def: 1, + rage: { + title: t('questBewilderBossRageTitle'), + description: t('questBewilderBossRageDescription'), + value: 800000, + bailey: t('questBewilderBossRageBailey'), + stables: t('questBewilderBossRageStables'), + market: t('questBewilderBossRageMarket'), + }, + }, + drop: { + items: [ + { + type: 'pets', + key: 'MagicalBee-Base', + text: t('questBewilderDropBumblebeePet'), + }, { + type: 'mounts', + key: 'MagicalBee-Base', + text: t('questBewilderDropBumblebeeMount'), + }, { + type: 'food', + key: 'Meat', + text: t('foodMeat'), + }, { + type: 'food', + key: 'Milk', + text: t('foodMilk'), + }, { + type: 'food', + key: 'Potatoe', + text: t('foodPotatoe'), + }, { + type: 'food', + key: 'Strawberry', + text: t('foodStrawberry'), + }, { + type: 'food', + key: 'Chocolate', + text: t('foodChocolate'), + }, { + type: 'food', + key: 'Fish', + text: t('foodFish'), + }, { + type: 'food', + key: 'RottenMeat', + text: t('foodRottenMeat'), + }, { + type: 'food', + key: 'CottonCandyPink', + text: t('foodCottonCandyPink'), + }, { + type: 'food', + key: 'CottonCandyBlue', + text: t('foodCottonCandyBlue'), + }, { + type: 'food', + key: 'Honey', + text: t('foodHoney'), + }, + ], + gp: 0, + exp: 0, + }, + }, + burnout: { + text: t('questBurnoutText'), + notes: t('questBurnoutNotes'), + completion: t('questBurnoutCompletion'), + completionChat: t('questBurnoutCompletionChat'), + value: 0, + canBuy () { + return false; + }, + category: 'world', + boss: { + name: t('questBurnoutBoss'), + hp: 11000000, + str: 2.5, + def: 1, + rage: { + title: t('questBurnoutBossRageTitle'), + description: t('questBurnoutBossRageDescription'), + value: 1000000, + quests: t('questBurnoutBossRageQuests'), + seasonalShop: t('questBurnoutBossRageSeasonalShop'), + tavern: t('questBurnoutBossRageTavern'), + }, + }, + drop: { + items: [ + { + type: 'pets', + key: 'Phoenix-Base', + text: t('questBurnoutDropPhoenixPet'), + }, { + type: 'mounts', + key: 'Phoenix-Base', + text: t('questBurnoutDropPhoenixMount'), + }, { + type: 'food', + key: 'Candy_Base', + text: t('foodCandyBase'), + }, { + type: 'food', + key: 'Candy_White', + text: t('foodCandyWhite'), + }, { + type: 'food', + key: 'Candy_Desert', + text: t('foodCandyDesert'), + }, { + type: 'food', + key: 'Candy_Red', + text: t('foodCandyRed'), + }, { + type: 'food', + key: 'Candy_Shade', + text: t('foodCandyShade'), + }, { + type: 'food', + key: 'Candy_Skeleton', + text: t('foodCandySkeleton'), + }, { + type: 'food', + key: 'Candy_Zombie', + text: t('foodCandyZombie'), + }, { + type: 'food', + key: 'Candy_CottonCandyPink', + text: t('foodCandyCottonCandyPink'), + }, { + type: 'food', + key: 'Candy_CottonCandyBlue', + text: t('foodCandyCottonCandyBlue'), + }, { + type: 'food', + key: 'Candy_Golden', + text: t('foodCandyGolden'), + }, + ], + gp: 0, + exp: 0, + }, + }, + dilatory: { + text: t('questDilatoryText'), + notes: t('questDilatoryNotes'), + completion: t('questDilatoryCompletion'), + value: 0, + canBuy () { + return false; + }, + category: 'world', + boss: { + name: t('questDilatoryBoss'), + hp: 5000000, + str: 1, + def: 1, + rage: { + title: t('questDilatoryBossRageTitle'), + description: t('questDilatoryBossRageDescription'), + value: 4000000, + tavern: t('questDilatoryBossRageTavern'), + stables: t('questDilatoryBossRageStables'), + market: t('questDilatoryBossRageMarket'), + }, + }, + drop: { + items: [ + { + type: 'pets', + key: 'MantisShrimp-Base', + text: t('questDilatoryDropMantisShrimpPet'), + }, { + type: 'mounts', + key: 'MantisShrimp-Base', + text: t('questDilatoryDropMantisShrimpMount'), + }, { + type: 'food', + key: 'Meat', + text: t('foodMeat'), + }, { + type: 'food', + key: 'Milk', + text: t('foodMilk'), + }, { + type: 'food', + key: 'Potatoe', + text: t('foodPotatoe'), + }, { + type: 'food', + key: 'Strawberry', + text: t('foodStrawberry'), + }, { + type: 'food', + key: 'Chocolate', + text: t('foodChocolate'), + }, { + type: 'food', + key: 'Fish', + text: t('foodFish'), + }, { + type: 'food', + key: 'RottenMeat', + text: t('foodRottenMeat'), + }, { + type: 'food', + key: 'CottonCandyPink', + text: t('foodCottonCandyPink'), + }, { + type: 'food', + key: 'CottonCandyBlue', + text: t('foodCottonCandyBlue'), + }, { + type: 'food', + key: 'Honey', + text: t('foodHoney'), + }, + ], + gp: 0, + exp: 0, }, }, dysheartener: { @@ -3191,683 +3798,91 @@ const quests = { exp: 0, }, }, - squirrel: { - text: t('questSquirrelText'), - notes: t('questSquirrelNotes'), - completion: t('questSquirrelCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questSquirrelBoss'), - hp: 700, - str: 2, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Squirrel', - text: t('questSquirrelDropSquirrelEgg'), - }, { - type: 'eggs', - key: 'Squirrel', - text: t('questSquirrelDropSquirrelEgg'), - }, { - type: 'eggs', - key: 'Squirrel', - text: t('questSquirrelDropSquirrelEgg'), - }, - ], - gp: 49, - exp: 425, - unlock: t('questSquirrelUnlockText'), - }, - }, - seaserpent: { - text: t('questSeaSerpentText'), - notes: t('questSeaSerpentNotes'), - completion: t('questSeaSerpentCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questSeaSerpentBoss'), - hp: 1200, - str: 2.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'SeaSerpent', - text: t('questSeaSerpentDropSeaSerpentEgg'), - }, { - type: 'eggs', - key: 'SeaSerpent', - text: t('questSeaSerpentDropSeaSerpentEgg'), - }, { - type: 'eggs', - key: 'SeaSerpent', - text: t('questSeaSerpentDropSeaSerpentEgg'), - }, - ], - gp: 80, - exp: 800, - unlock: t('questSeaSerpentUnlockText'), - }, - }, - kangaroo: { - text: t('questKangarooText'), - notes: t('questKangarooNotes'), - completion: t('questKangarooCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questKangarooBoss'), - hp: 700, - str: 2, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Kangaroo', - text: t('questKangarooDropKangarooEgg'), - }, { - type: 'eggs', - key: 'Kangaroo', - text: t('questKangarooDropKangarooEgg'), - }, { - type: 'eggs', - key: 'Kangaroo', - text: t('questKangarooDropKangarooEgg'), - }, - ], - gp: 49, - exp: 425, - unlock: t('questKangarooUnlockText'), - }, - }, - alligator: { - text: t('questAlligatorText'), - notes: t('questAlligatorNotes'), - completion: t('questAlligatorCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questAlligatorBoss'), - hp: 1100, - str: 2.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Alligator', - text: t('questAlligatorDropAlligatorEgg'), - }, { - type: 'eggs', - key: 'Alligator', - text: t('questAlligatorDropAlligatorEgg'), - }, { - type: 'eggs', - key: 'Alligator', - text: t('questAlligatorDropAlligatorEgg'), - }, - ], - gp: 73, - exp: 725, - unlock: t('questAlligatorUnlockText'), - }, - }, - velociraptor: { - text: t('questVelociraptorText'), - notes: t('questVelociraptorNotes'), - completion: t('questVelociraptorCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questVelociraptorBoss'), - hp: 900, - str: 2, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Velociraptor', - text: t('questVelociraptorDropVelociraptorEgg'), - }, { - type: 'eggs', - key: 'Velociraptor', - text: t('questVelociraptorDropVelociraptorEgg'), - }, { - type: 'eggs', - key: 'Velociraptor', - text: t('questVelociraptorDropVelociraptorEgg'), - }, - ], - gp: 63, - exp: 575, - unlock: t('questVelociraptorUnlockText'), - }, - }, - bronze: { - text: t('questBronzeText'), - notes: t('questBronzeNotes'), - completion: t('questBronzeCompletion'), - value: 4, - category: 'hatchingPotion', - boss: { - name: t('questBronzeBoss'), - hp: 800, - str: 2, - }, - drop: { - items: [ - { - type: 'hatchingPotions', - key: 'Bronze', - text: t('questBronzeDropBronzePotion'), - }, { - type: 'hatchingPotions', - key: 'Bronze', - text: t('questBronzeDropBronzePotion'), - }, { - type: 'hatchingPotions', - key: 'Bronze', - text: t('questBronzeDropBronzePotion'), - }, - ], - gp: 63, - exp: 575, - unlock: t('questBronzeUnlockText'), - }, - }, - dolphin: { - text: t('questDolphinText'), - notes: t('questDolphinNotes'), - completion: t('questDolphinCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questDolphinBoss'), - hp: 300, - str: 1.25, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Dolphin', - text: t('questDolphinDropDolphinEgg'), - }, { - type: 'eggs', - key: 'Dolphin', - text: t('questDolphinDropDolphinEgg'), - }, { - type: 'eggs', - key: 'Dolphin', - text: t('questDolphinDropDolphinEgg'), - }, - ], - gp: 22, - exp: 110, - unlock: t('questDolphinUnlockText'), - }, - }, - silver: { - text: t('questSilverText'), - notes: t('questSilverNotes'), - completion: t('questSilverCompletion'), - value: 4, - category: 'hatchingPotion', - collect: { - silverIngot: { - text: t('questSilverCollectSilverIngots'), - count: 20, - }, - moonRune: { - text: t('questSilverCollectMoonRunes'), - count: 15, - }, - cancerRune: { - text: t('questSilverCollectCancerRunes'), - count: 15, - }, - }, - drop: { - items: [ - { - type: 'hatchingPotions', - key: 'Silver', - text: t('questSilverDropSilverPotion'), - }, { - type: 'hatchingPotions', - key: 'Silver', - text: t('questSilverDropSilverPotion'), - }, { - type: 'hatchingPotions', - key: 'Silver', - text: t('questSilverDropSilverPotion'), - }, - ], - gp: 50, - exp: 100, - unlock: t('questSilverUnlockText'), - }, - }, - robot: { - text: t('questRobotText'), - notes: t('questRobotNotes'), - completion: t('questRobotCompletion'), - value: 1, - category: 'timeTravelers', + stressbeast: { + text: t('questStressbeastText'), + notes: t('questStressbeastNotes'), + completion: t('questStressbeastCompletion'), + completionChat: t('questStressbeastCompletionChat'), + value: 0, canBuy () { return false; }, - collect: { - bolt: { - text: t('questRobotCollectBolts'), - count: 15, - }, - gear: { - text: t('questRobotCollectGears'), - count: 10, - }, - spring: { - text: t('questRobotCollectSprings'), - count: 10, - }, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Robot', - text: t('questRobotDropRobotEgg'), - }, { - type: 'eggs', - key: 'Robot', - text: t('questRobotDropRobotEgg'), - }, { - type: 'eggs', - key: 'Robot', - text: t('questRobotDropRobotEgg'), - }, - ], - gp: 40, - exp: 75, - unlock: t('questRobotUnlockText'), - }, - }, - amber: { - text: t('questAmberText'), - notes: t('questAmberNotes'), - completion: t('questAmberCompletion'), - value: 4, - category: 'hatchingPotion', + category: 'world', boss: { - name: t('questAmberBoss'), - hp: 300, - str: 1.25, - }, - drop: { - items: [ - { - type: 'hatchingPotions', - key: 'Amber', - text: t('questAmberDropAmberPotion'), - }, { - type: 'hatchingPotions', - key: 'Amber', - text: t('questAmberDropAmberPotion'), - }, { - type: 'hatchingPotions', - key: 'Amber', - text: t('questAmberDropAmberPotion'), - }, - ], - gp: 50, - exp: 100, - unlock: t('questAmberUnlockText'), - }, - }, - ruby: { - text: t('questRubyText'), - notes: t('questRubyNotes'), - completion: t('questRubyCompletion'), - value: 4, - category: 'hatchingPotion', - collect: { - rubyGem: { - text: t('questRubyCollectRubyGems'), - count: 25, - }, - venusRune: { - text: t('questRubyCollectVenusRunes'), - count: 10, - }, - aquariusRune: { - text: t('questRubyCollectAquariusRunes'), - count: 10, - }, - }, - drop: { - items: [ - { - type: 'hatchingPotions', - key: 'Ruby', - text: t('questRubyDropRubyPotion'), - }, { - type: 'hatchingPotions', - key: 'Ruby', - text: t('questRubyDropRubyPotion'), - }, { - type: 'hatchingPotions', - key: 'Ruby', - text: t('questRubyDropRubyPotion'), - }, - ], - gp: 50, - exp: 100, - unlock: t('questRubyUnlockText'), - }, - }, - waffle: { - text: t('questWaffleText'), - notes: t('questWaffleNotes'), - completion: t('questWaffleCompletion'), - value: 4, - category: 'hatchingPotion', - event: CURRENT_EVENT && CURRENT_EVENT.season === 'spring' ? CURRENT_EVENT : null, - boss: { - name: t('questWaffleBoss'), - hp: 500, - str: 2, - rage: { - title: t('questWaffleRageTitle'), - description: t('questWaffleRageDescription'), - value: 50, - progressDrain: 0.5, - effect: t('questWaffleRageEffect'), - }, - }, - drop: { - items: [ - { - type: 'hatchingPotions', - key: 'Dessert', - text: t('questWaffleDropDessertPotion'), - }, { - type: 'hatchingPotions', - key: 'Dessert', - text: t('questWaffleDropDessertPotion'), - }, { - type: 'hatchingPotions', - key: 'Dessert', - text: t('questWaffleDropDessertPotion'), - }, - ], - gp: 40, - exp: 500, - unlock: t('questWaffleUnlockText'), - }, - }, - fluorite: { - text: t('questFluoriteText'), - notes: t('questFluoriteNotes'), - completion: t('questFluoriteCompletion'), - value: 4, - category: 'hatchingPotion', - boss: { - name: t('questFluoriteBoss'), - hp: 1200, - str: 2, - }, - drop: { - items: [ - { - type: 'hatchingPotions', - key: 'Fluorite', - text: t('questFluoriteDropFluoritePotion'), - }, { - type: 'hatchingPotions', - key: 'Fluorite', - text: t('questFluoriteDropFluoritePotion'), - }, { - type: 'hatchingPotions', - key: 'Fluorite', - text: t('questFluoriteDropFluoritePotion'), - }, - ], - gp: 70, - exp: 750, - unlock: t('questFluoriteUnlockText'), - }, - }, - windup: { - text: t('questWindupText'), - notes: t('questWindupNotes'), - completion: t('questWindupCompletion'), - value: 1, - category: 'timeTravelers', - canBuy () { - return false; - }, - boss: { - name: t('questWindupBoss'), - hp: 1000, + name: t('questStressbeastBoss'), + hp: 2750000, str: 1, - }, - drop: { - items: [ - { - type: 'hatchingPotions', - key: 'Windup', - text: t('questWindupDropWindupPotion'), - }, { - type: 'hatchingPotions', - key: 'Windup', - text: t('questWindupDropWindupPotion'), - }, { - type: 'hatchingPotions', - key: 'Windup', - text: t('questWindupDropWindupPotion'), - }, - ], - gp: 50, - exp: 425, - unlock: t('questWindupUnlockText'), - }, - }, - turquoise: { - text: t('questTurquoiseText'), - notes: t('questTurquoiseNotes'), - completion: t('questTurquoiseCompletion'), - value: 4, - category: 'hatchingPotion', - collect: { - turquoiseGem: { - text: t('questTurquoiseCollectTurquoiseGems'), - count: 25, + def: 1, + rage: { + title: t('questStressbeastBossRageTitle'), + description: t('questStressbeastBossRageDescription'), + value: 1450000, + healing: 0.3, + stables: t('questStressbeastBossRageStables'), + bailey: t('questStressbeastBossRageBailey'), + guide: t('questStressbeastBossRageGuide'), }, - sagittariusRune: { - text: t('questTurquoiseCollectSagittariusRunes'), - count: 10, - }, - neptuneRune: { - text: t('questTurquoiseCollectNeptuneRunes'), - count: 10, + desperation: { + threshold: 500000, + str: 3.5, + def: 2, + text: t('questStressbeastDesperation'), }, }, drop: { items: [ { - type: 'hatchingPotions', - key: 'Turquoise', - text: t('questTurquoiseDropTurquoisePotion'), + type: 'pets', + key: 'Mammoth-Base', + text: t('questStressbeastDropMammothPet'), }, { - type: 'hatchingPotions', - key: 'Turquoise', - text: t('questTurquoiseDropTurquoisePotion'), + type: 'mounts', + key: 'Mammoth-Base', + text: t('questStressbeastDropMammothMount'), }, { - type: 'hatchingPotions', - key: 'Turquoise', - text: t('questTurquoiseDropTurquoisePotion'), + type: 'food', + key: 'Meat', + text: t('foodMeat'), + }, { + type: 'food', + key: 'Milk', + text: t('foodMilk'), + }, { + type: 'food', + key: 'Potatoe', + text: t('foodPotatoe'), + }, { + type: 'food', + key: 'Strawberry', + text: t('foodStrawberry'), + }, { + type: 'food', + key: 'Chocolate', + text: t('foodChocolate'), + }, { + type: 'food', + key: 'Fish', + text: t('foodFish'), + }, { + type: 'food', + key: 'RottenMeat', + text: t('foodRottenMeat'), + }, { + type: 'food', + key: 'CottonCandyPink', + text: t('foodCottonCandyPink'), + }, { + type: 'food', + key: 'CottonCandyBlue', + text: t('foodCottonCandyBlue'), + }, { + type: 'food', + key: 'Honey', + text: t('foodHoney'), }, ], - gp: 50, - exp: 100, - unlock: t('questTurquoiseUnlockText'), - }, - }, - blackPearl: { - text: t('questBlackPearlText'), - notes: t('questBlackPearlNotes'), - completion: t('questBlackPearlCompletion'), - value: 4, - category: 'hatchingPotion', - boss: { - name: t('questBlackPearlBoss'), - hp: 725, - str: 1.75, - }, - drop: { - items: [ - { - type: 'hatchingPotions', - key: 'BlackPearl', - text: t('questBlackPearlDropBlackPearlPotion'), - }, { - type: 'hatchingPotions', - key: 'BlackPearl', - text: t('questBlackPearlDropBlackPearlPotion'), - }, { - type: 'hatchingPotions', - key: 'BlackPearl', - text: t('questBlackPearlDropBlackPearlPotion'), - }, - ], - gp: 50, - exp: 450, - unlock: t('questBlackPearlUnlockText'), - }, - }, - stone: { - text: t('questStoneText'), - notes: t('questStoneNotes'), - completion: t('questStoneCompletion'), - value: 4, - category: 'hatchingPotion', - collect: { - mossyStone: { - text: t('questStoneCollectMossyStones'), - count: 25, - }, - marsRune: { - text: t('questStoneCollectMarsRunes'), - count: 10, - }, - capricornRune: { - text: t('questStoneCollectCapricornRunes'), - count: 10, - }, - }, - drop: { - items: [ - { - type: 'hatchingPotions', - key: 'MossyStone', - text: t('questStoneDropMossyStonePotion'), - }, { - type: 'hatchingPotions', - key: 'MossyStone', - text: t('questStoneDropMossyStonePotion'), - }, { - type: 'hatchingPotions', - key: 'MossyStone', - text: t('questStoneDropMossyStonePotion'), - }, - ], - gp: 50, - exp: 100, - unlock: t('questStoneUnlockText'), - }, - }, - solarSystem: { - text: t('questSolarSystemText'), - notes: t('questSolarSystemNotes'), - completion: t('questSolarSystemCompletion'), - value: 1, - category: 'timeTravelers', - canBuy () { - return false; - }, - boss: { - name: t('questSolarSystemBoss'), - hp: 1500, - str: 2.5, - }, - drop: { - items: [ - { - type: 'hatchingPotions', - key: 'SolarSystem', - text: t('questSolarSystemDropSolarSystemPotion'), - }, { - type: 'hatchingPotions', - key: 'SolarSystem', - text: t('questSolarSystemDropSolarSystemPotion'), - }, { - type: 'hatchingPotions', - key: 'SolarSystem', - text: t('questSolarSystemDropSolarSystemPotion'), - }, - ], - gp: 90, - exp: 900, - unlock: t('questSolarSystemUnlockText'), - }, - }, - onyx: { - text: t('questOnyxText'), - notes: t('questOnyxNotes'), - completion: t('questOnyxCompletion'), - value: 4, - category: 'hatchingPotion', - collect: { - onyxStone: { - text: t('questOnyxCollectOnyxStones'), - count: 25, - }, - plutoRune: { - text: t('questOnyxCollectPlutoRunes'), - count: 10, - }, - leoRune: { - text: t('questOnyxCollectLeoRunes'), - count: 10, - }, - }, - drop: { - items: [ - { - type: 'hatchingPotions', - key: 'Onyx', - text: t('questOnyxDropOnyxPotion'), - }, { - type: 'hatchingPotions', - key: 'Onyx', - text: t('questOnyxDropOnyxPotion'), - }, { - type: 'hatchingPotions', - key: 'Onyx', - text: t('questOnyxDropOnyxPotion'), - }, - ], - gp: 50, - exp: 100, - unlock: t('questOnyxUnlockText'), + gp: 0, + exp: 0, }, }, }; From 55ec42678ec1bc6fffecc53ed629193237bfcd3c Mon Sep 17 00:00:00 2001 From: CuriousMagpie Date: Fri, 31 Dec 2021 16:28:04 -0500 Subject: [PATCH 03/23] quest series refactor started --- .../common/script/content/constants/index.js | 1 + .../script/content/constants/questSeries.js | 504 ++++++++++++++++++ website/common/script/content/quests.js | 21 +- website/common/script/libs/getItemInfo.js | 14 +- 4 files changed, 538 insertions(+), 2 deletions(-) create mode 100644 website/common/script/content/constants/questSeries.js diff --git a/website/common/script/content/constants/index.js b/website/common/script/content/constants/index.js index 3db080382a..2983db0abb 100644 --- a/website/common/script/content/constants/index.js +++ b/website/common/script/content/constants/index.js @@ -33,3 +33,4 @@ export { default as ANIMAL_COLOR_ACHIEVEMENTS } from './animalColorAchievements' export { default as ANIMAL_SET_ACHIEVEMENTS } from './animalSetAchievements'; export { default as QUEST_SERIES_ACHIEVEMENTS } from './questSeriesAchievements'; export { default as ITEM_LIST } from './itemList'; +export { default as QUEST_SERIES } from './questSeries'; diff --git a/website/common/script/content/constants/questSeries.js b/website/common/script/content/constants/questSeries.js new file mode 100644 index 0000000000..0dc75d650a --- /dev/null +++ b/website/common/script/content/constants/questSeries.js @@ -0,0 +1,504 @@ +import t from '../translation'; + +const QUEST_SERIES = { + atom1: { + text: t('questAtom1Text'), + notes: t('questAtom1Notes'), + completion: t('questAtom1Completion'), + group: 'questGroupAtom', + prerequisite: { + lvl: 15, + }, + value: 4, + lvl: 15, + category: 'unlockable', + collect: { + soapBars: { + text: t('questAtom1CollectSoapBars'), + count: 20, + }, + }, + drop: { + items: [ + { + type: 'quests', + key: 'atom2', + text: t('questAtom1Drop'), + onlyOwner: true, + }, + ], + gp: 7, + exp: 50, + }, + }, + atom2: { + text: t('questAtom2Text'), + notes: t('questAtom2Notes'), + completion: t('questAtom2Completion'), + group: 'questGroupAtom', + prerequisite: { + lvl: 15, + atom1: true, + }, + previous: 'atom1', + value: 4, + lvl: 15, + category: 'unlockable', + boss: { + name: t('questAtom2Boss'), + hp: 300, + str: 1, + }, + drop: { + items: [ + { + type: 'quests', + key: 'atom3', + text: t('questAtom2Drop'), + onlyOwner: true, + }, + ], + gp: 20, + exp: 100, + }, + }, + atom3: { + text: t('questAtom3Text'), + notes: t('questAtom3Notes'), + group: 'questGroupAtom', + previous: 'atom2', + completion: t('questAtom3Completion'), + prerequisite: { + lvl: 15, + atom1: true, + atom2: true, + }, + value: 4, + lvl: 15, + category: 'unlockable', + boss: { + name: t('questAtom3Boss'), + hp: 800, + str: 1.5, + }, + drop: { + items: [ + { + type: 'gear', + key: 'head_special_2', + text: t('headSpecial2Text'), + }, { + type: 'hatchingPotions', + key: 'Base', + text: t('questAtom3DropPotion'), + }, { + type: 'hatchingPotions', + key: 'Base', + text: t('questAtom3DropPotion'), + }, + ], + gp: 25, + exp: 125, + }, + }, + goldenknight1: { + text: t('questGoldenknight1Text'), + notes: t('questGoldenknight1Notes'), + completion: t('questGoldenknight1Completion'), + group: 'questGroupGoldenknight', + value: 4, + lvl: 40, + category: 'unlockable', + collect: { + testimony: { + text: t('questGoldenknight1CollectTestimony'), + count: 60, + }, + }, + drop: { + items: [ + { + type: 'quests', + key: 'goldenknight2', + text: t('questGoldenknight1DropGoldenknight2Quest'), + onlyOwner: true, + }, + ], + gp: 15, + exp: 120, + }, + }, + goldenknight2: { + text: t('questGoldenknight2Text'), + notes: t('questGoldenknight2Notes'), + completion: t('questGoldenknight2Completion'), + group: 'questGroupGoldenknight', + value: 4, + previous: 'goldenknight1', + lvl: 40, + category: 'unlockable', + boss: { + name: t('questGoldenknight2Boss'), + hp: 1000, + str: 3, + }, + drop: { + items: [ + { + type: 'quests', + key: 'goldenknight3', + text: t('questGoldenknight2DropGoldenknight3Quest'), + onlyOwner: true, + }, + ], + gp: 75, + exp: 750, + }, + }, + goldenknight3: { + text: t('questGoldenknight3Text'), + notes: t('questGoldenknight3Notes'), + group: 'questGroupGoldenknight', + completion: t('questGoldenknight3Completion'), + previous: 'goldenknight2', + value: 4, + lvl: 40, + category: 'unlockable', + boss: { + name: t('questGoldenknight3Boss'), + hp: 1700, + str: 3.5, + }, + drop: { + items: [ + { + type: 'food', + key: 'Honey', + text: t('questGoldenknight3DropHoney'), + }, { + type: 'food', + key: 'Honey', + text: t('questGoldenknight3DropHoney'), + }, { + type: 'food', + key: 'Honey', + text: t('questGoldenknight3DropHoney'), + }, { + type: 'hatchingPotions', + key: 'Golden', + text: t('questGoldenknight3DropGoldenPotion'), + }, { + type: 'hatchingPotions', + key: 'Golden', + text: t('questGoldenknight3DropGoldenPotion'), + }, { + type: 'gear', + key: 'shield_special_goldenknight', + text: t('questGoldenknight3DropWeapon'), + }, + ], + gp: 900, + exp: 1500, + }, + }, + moon1: { + text: t('questMoon1Text'), + notes: t('questMoon1Notes'), + group: 'questGroupMoon', + completion: t('questMoon1Completion'), + value: 4, + category: 'unlockable', + unlockCondition: { + condition: 'login reward', + incentiveThreshold: 7, + text: t('loginReward', { count: 7 }), + }, + collect: { + shard: { + text: t('questMoon1CollectShards'), + count: 20, + }, + }, + drop: { + items: [ + { + type: 'gear', + key: 'head_special_lunarWarriorHelm', + text: t('questMoon1DropHeadgear'), + }, + ], + gp: 7, + exp: 50, + }, + }, + moon2: { + text: t('questMoon2Text'), + notes: t('questMoon2Notes'), + group: 'questGroupMoon', + completion: t('questMoon2Completion'), + previous: 'moon1', + value: 4, + category: 'unlockable', + unlockCondition: { + condition: 'login reward', + incentiveThreshold: 22, + text: t('loginReward', { count: 22 }), + }, + boss: { + name: t('questMoon2Boss'), + hp: 100, + str: 1.5, + }, + drop: { + items: [ + { + type: 'gear', + key: 'armor_special_lunarWarriorArmor', + text: t('questMoon2DropArmor'), + }, + ], + gp: 37, + exp: 275, + }, + }, + moon3: { + text: t('questMoon3Text'), + notes: t('questMoon3Notes'), + group: 'questGroupMoon', + completion: t('questMoon3Completion'), + previous: 'moon2', + value: 4, + category: 'unlockable', + unlockCondition: { + condition: 'login reward', + incentiveThreshold: 40, + text: t('loginReward', { count: 40 }), + }, + boss: { + name: t('questMoon3Boss'), + hp: 1000, + str: 2, + }, + drop: { + items: [ + { + type: 'gear', + key: 'weapon_special_lunarScythe', + text: t('questMoon3DropWeapon'), + }, + ], + gp: 67, + exp: 650, + }, + }, + moonstone1: { + text: t('questMoonstone1Text'), + notes: t('questMoonstone1Notes'), + completion: t('questMoonstone1Completion'), + group: 'questGroupMoonstone', + value: 4, + lvl: 60, + category: 'unlockable', + collect: { + moonstone: { + text: t('questMoonstone1CollectMoonstone'), + count: 100, + }, + }, + drop: { + items: [ + { + type: 'quests', + key: 'moonstone2', + text: t('questMoonstone1DropMoonstone2Quest'), + onlyOwner: true, + }, + ], + gp: 50, + exp: 100, + }, + }, + moonstone2: { + text: t('questMoonstone2Text'), + notes: t('questMoonstone2Notes'), + completion: t('questMoonstone2Completion'), + group: 'questGroupMoonstone', + value: 4, + lvl: 60, + previous: 'moonstone1', + category: 'unlockable', + boss: { + name: t('questMoonstone2Boss'), + hp: 1500, + str: 3, + }, + drop: { + items: [ + { + type: 'quests', + key: 'moonstone3', + text: t('questMoonstone2DropMoonstone3Quest'), + onlyOwner: true, + }, + ], + gp: 500, + exp: 1000, + }, + }, + moonstone3: { + text: t('questMoonstone3Text'), + notes: t('questMoonstone3Notes'), + group: 'questGroupMoonstone', + completion: t('questMoonstone3Completion'), + previous: 'moonstone2', + value: 4, + lvl: 60, + category: 'unlockable', + boss: { + name: t('questMoonstone3Boss'), + hp: 2000, + str: 3.5, + }, + drop: { + items: [ + { + type: 'gear', + key: 'armor_special_2', + text: t('armorSpecial2Text'), + }, { + type: 'food', + key: 'RottenMeat', + text: t('questMoonstone3DropRottenMeat'), + }, { + type: 'food', + key: 'RottenMeat', + text: t('questMoonstone3DropRottenMeat'), + }, { + type: 'food', + key: 'RottenMeat', + text: t('questMoonstone3DropRottenMeat'), + }, { + type: 'food', + key: 'RottenMeat', + text: t('questMoonstone3DropRottenMeat'), + }, { + type: 'food', + key: 'RottenMeat', + text: t('questMoonstone3DropRottenMeat'), + }, { + type: 'hatchingPotions', + key: 'Zombie', + text: t('questMoonstone3DropZombiePotion'), + }, { + type: 'hatchingPotions', + key: 'Zombie', + text: t('questMoonstone3DropZombiePotion'), + }, { + type: 'hatchingPotions', + key: 'Zombie', + text: t('questMoonstone3DropZombiePotion'), + }, + ], + gp: 900, + exp: 1500, + }, + }, + vice1: { + text: t('questVice1Text'), + notes: t('questVice1Notes'), + completion: t('questVice1Completion'), + group: 'questGroupVice', + value: 4, + lvl: 30, + category: 'unlockable', + boss: { + name: t('questVice1Boss'), + hp: 750, + str: 1.5, + }, + drop: { + items: [ + { + type: 'quests', + key: 'vice2', + text: t('questVice1DropVice2Quest'), + onlyOwner: true, + }, + ], + gp: 20, + exp: 100, + }, + }, + vice2: { + text: t('questVice2Text'), + notes: t('questVice2Notes'), + completion: t('questVice2Completion'), + group: 'questGroupVice', + value: 4, + lvl: 30, + category: 'unlockable', + previous: 'vice1', + collect: { + lightCrystal: { + text: t('questVice2CollectLightCrystal'), + count: 30, + }, + }, + drop: { + items: [ + { + type: 'quests', + key: 'vice3', + text: t('questVice2DropVice3Quest'), + onlyOwner: true, + }, + ], + gp: 20, + exp: 75, + }, + }, + vice3: { + text: t('questVice3Text'), + notes: t('questVice3Notes'), + group: 'questGroupVice', + completion: t('questVice3Completion'), + previous: 'vice2', + value: 4, + lvl: 30, + category: 'unlockable', + boss: { + name: t('questVice3Boss'), + hp: 1500, + str: 3, + }, + drop: { + items: [ + { + type: 'gear', + key: 'weapon_special_2', + text: t('questVice3DropWeaponSpecial2'), + }, { + type: 'eggs', + key: 'Dragon', + text: t('questVice3DropDragonEgg'), + }, { + type: 'eggs', + key: 'Dragon', + text: t('questVice3DropDragonEgg'), + }, { + type: 'hatchingPotions', + key: 'Shade', + text: t('questVice3DropShadeHatchingPotion'), + }, { + type: 'hatchingPotions', + key: 'Shade', + text: t('questVice3DropShadeHatchingPotion'), + }, + ], + gp: 100, + exp: 1000, + }, + }, +}; + +export default QUEST_SERIES; diff --git a/website/common/script/content/quests.js b/website/common/script/content/quests.js index e08019d8ec..23539cbd25 100644 --- a/website/common/script/content/quests.js +++ b/website/common/script/content/quests.js @@ -7,6 +7,13 @@ import t from './translation'; import { EVENTS, USER_CAN_OWN_QUEST_CATEGORIES, + // future constants for quest variable + // QUEST_GENERIC + // QUEST_SERIES, + // QUEST_MASTERCLASSER, + // QUEST_PETS, + // QUESTS_HATCHING_POTIONS, + // QUESTS_TIME_TRAVELERS } from './constants'; const CURRENT_EVENT = find( @@ -58,11 +65,14 @@ const quests = { exp: 42, }, }, - // chain quests + // series quests atom1: { text: t('questAtom1Text'), notes: t('questAtom1Notes'), completion: t('questAtom1Completion'), + // prerequisite: { + // lvl: 15, + // }, group: 'questGroupAtom', value: 4, lvl: 15, @@ -91,6 +101,10 @@ const quests = { notes: t('questAtom2Notes'), completion: t('questAtom2Completion'), group: 'questGroupAtom', + // prerequisite: { + // lvl: 15, + // atom1: true, + // }, previous: 'atom1', value: 4, lvl: 15, @@ -117,6 +131,11 @@ const quests = { text: t('questAtom3Text'), notes: t('questAtom3Notes'), group: 'questGroupAtom', + // prerequisite: { + // lvl: 15, + // atom1: true, + // atom2: true, + // }, previous: 'atom2', completion: t('questAtom3Completion'), value: 4, diff --git a/website/common/script/libs/getItemInfo.js b/website/common/script/libs/getItemInfo.js index 4bd5e5fdcf..a790f67e3b 100644 --- a/website/common/script/libs/getItemInfo.js +++ b/website/common/script/libs/getItemInfo.js @@ -16,16 +16,28 @@ function userAbleToStartMasterclasser (user) { } function lockQuest (quest, user) { + // masterclasser requirement if (quest.key === 'lostMasterclasser1') return !userAbleToStartMasterclasser(user); if (quest.key === 'lostMasterclasser2' || quest.key === 'lostMasterclasser3' || quest.key === 'lostMasterclasser4') { return !(userAbleToStartMasterclasser(user) && user.achievements.quests[quest.previous]); } if (quest.key === 'lostMasterclasser1') return !(user.achievements.quests.dilatoryDistress3 && user.achievements.quests.mayhemMistiflying3 && user.achievements.quests.stoikalmCalamity3 && user.achievements.quests.taskwoodsTerror3); + + // checks for multiple prerequisites + // if (quest.prerequisite === true) return true; + + // level requirements if (quest.lvl && user.stats.lvl < quest.lvl) return true; + + // unlockCondition requirements if (quest.unlockCondition && (quest.key === 'moon1' || quest.key === 'moon2' || quest.key === 'moon3')) { return user.loginIncentives < quest.unlockCondition.incentiveThreshold; } - if (user.achievements.quests) return quest.previous && !user.achievements.quests[quest.previous]; + + // checks to make sure that previous quest has been completed + if (user.achievements.quests) { + return quest.previous && !user.achievements.quests[quest.previous]; + } return quest.previous; } From 9b849e095c8a6c52a1f324d766129fbb546fca4a Mon Sep 17 00:00:00 2001 From: CuriousMagpie Date: Fri, 7 Jan 2022 15:20:21 -0500 Subject: [PATCH 04/23] working on quest logic --- website/common/script/content/quests.js | 25 +++++++++---------- website/common/script/libs/getItemInfo.js | 20 +++++++++++---- website/common/script/ops/buy/buyQuestGold.js | 3 ++- 3 files changed, 29 insertions(+), 19 deletions(-) diff --git a/website/common/script/content/quests.js b/website/common/script/content/quests.js index 23539cbd25..9c99fa7ad8 100644 --- a/website/common/script/content/quests.js +++ b/website/common/script/content/quests.js @@ -70,9 +70,6 @@ const quests = { text: t('questAtom1Text'), notes: t('questAtom1Notes'), completion: t('questAtom1Completion'), - // prerequisite: { - // lvl: 15, - // }, group: 'questGroupAtom', value: 4, lvl: 15, @@ -101,10 +98,6 @@ const quests = { notes: t('questAtom2Notes'), completion: t('questAtom2Completion'), group: 'questGroupAtom', - // prerequisite: { - // lvl: 15, - // atom1: true, - // }, previous: 'atom1', value: 4, lvl: 15, @@ -131,11 +124,6 @@ const quests = { text: t('questAtom3Text'), notes: t('questAtom3Notes'), group: 'questGroupAtom', - // prerequisite: { - // lvl: 15, - // atom1: true, - // atom2: true, - // }, previous: 'atom2', completion: t('questAtom3Completion'), value: 4, @@ -364,6 +352,9 @@ const quests = { value: 4, lvl: 60, category: 'unlockable', + unlockCondition: { + lvl: 60, + }, collect: { moonstone: { text: t('questMoonstone1CollectMoonstone'), @@ -389,9 +380,13 @@ const quests = { completion: t('questMoonstone2Completion'), group: 'questGroupMoonstone', value: 4, - lvl: 60, + // lvl: 60, previous: 'moonstone1', category: 'unlockable', + unlockCondition: { + lvl: 60, + previous: 'moonstone1', + }, boss: { name: t('questMoonstone2Boss'), hp: 1500, @@ -419,6 +414,10 @@ const quests = { value: 4, lvl: 60, category: 'unlockable', + unlockCondition: { + lvl: 60, + previous: 'moonstone2', + }, boss: { name: t('questMoonstone3Boss'), hp: 2000, diff --git a/website/common/script/libs/getItemInfo.js b/website/common/script/libs/getItemInfo.js index a790f67e3b..ac96b7a988 100644 --- a/website/common/script/libs/getItemInfo.js +++ b/website/common/script/libs/getItemInfo.js @@ -18,10 +18,18 @@ function userAbleToStartMasterclasser (user) { function lockQuest (quest, user) { // masterclasser requirement if (quest.key === 'lostMasterclasser1') return !userAbleToStartMasterclasser(user); - if (quest.key === 'lostMasterclasser2' || quest.key === 'lostMasterclasser3' || quest.key === 'lostMasterclasser4') { - return !(userAbleToStartMasterclasser(user) && user.achievements.quests[quest.previous]); + if (quest.key === 'lostMasterclasser2' + || quest.key === 'lostMasterclasser3' + || quest.key === 'lostMasterclasser4') { + return !(userAbleToStartMasterclasser(user) + && user.achievements.quests[quest.previous]); + } + if (quest.key === 'lostMasterclasser1') { + return !(user.achievements.quests.dilatoryDistress3 + && user.achievements.quests.mayhemMistiflying3 + && user.achievements.quests.stoikalmCalamity3 + && user.achievements.quests.taskwoodsTerror3); } - if (quest.key === 'lostMasterclasser1') return !(user.achievements.quests.dilatoryDistress3 && user.achievements.quests.mayhemMistiflying3 && user.achievements.quests.stoikalmCalamity3 && user.achievements.quests.taskwoodsTerror3); // checks for multiple prerequisites // if (quest.prerequisite === true) return true; @@ -30,13 +38,15 @@ function lockQuest (quest, user) { if (quest.lvl && user.stats.lvl < quest.lvl) return true; // unlockCondition requirements - if (quest.unlockCondition && (quest.key === 'moon1' || quest.key === 'moon2' || quest.key === 'moon3')) { + if (quest.unlockCondition + && (quest.key === 'moon1' || quest.key === 'moon2' || quest.key === 'moon3')) { return user.loginIncentives < quest.unlockCondition.incentiveThreshold; } // checks to make sure that previous quest has been completed if (user.achievements.quests) { - return quest.previous && !user.achievements.quests[quest.previous]; + return quest.previous + && !user.achievements.quests[quest.previous]; } return quest.previous; } diff --git a/website/common/script/ops/buy/buyQuestGold.js b/website/common/script/ops/buy/buyQuestGold.js index 0fa1ce492b..a2ae6a674a 100644 --- a/website/common/script/ops/buy/buyQuestGold.js +++ b/website/common/script/ops/buy/buyQuestGold.js @@ -53,7 +53,8 @@ export class BuyQuestWithGoldOperation extends AbstractGoldItemOperation { // es checkPrerequisites (user, questKey) { const item = content.quests[questKey]; - if (questKey.startsWith('lostMasterclasser') && !this.userAbleToStartMasterClasser(user)) { + if (questKey.startsWith('lostMasterclasser') + && !this.userAbleToStartMasterClasser(user)) { throw new NotAuthorized(this.i18n('questUnlockLostMasterclasser')); } From d45122ce06a4991d2e9e12badcd9abf9e88fda26 Mon Sep 17 00:00:00 2001 From: CuriousMagpie Date: Fri, 7 Jan 2022 16:25:31 -0500 Subject: [PATCH 05/23] lockQuest logic updates --- website/common/script/content/quests.js | 108 +++++++--------------- website/common/script/libs/getItemInfo.js | 28 ++++-- 2 files changed, 54 insertions(+), 82 deletions(-) diff --git a/website/common/script/content/quests.js b/website/common/script/content/quests.js index 18ce2ebead..c72d941b2c 100644 --- a/website/common/script/content/quests.js +++ b/website/common/script/content/quests.js @@ -98,7 +98,7 @@ const quests = { notes: t('questAtom2Notes'), completion: t('questAtom2Completion'), group: 'questGroupAtom', - previous: 'atom1', + previous1: 'atom1', value: 4, lvl: 15, category: 'unlockable', @@ -124,7 +124,8 @@ const quests = { text: t('questAtom3Text'), notes: t('questAtom3Notes'), group: 'questGroupAtom', - previous: 'atom2', + previous1: 'atom1', + previous2: 'atom2', completion: t('questAtom3Completion'), value: 4, lvl: 15, @@ -187,7 +188,7 @@ const quests = { completion: t('questGoldenknight2Completion'), group: 'questGroupGoldenknight', value: 4, - previous: 'goldenknight1', + previous1: 'goldenknight1', lvl: 40, category: 'unlockable', boss: { @@ -208,13 +209,13 @@ const quests = { exp: 750, }, }, -<<<<<<< HEAD goldenknight3: { text: t('questGoldenknight3Text'), notes: t('questGoldenknight3Notes'), group: 'questGroupGoldenknight', completion: t('questGoldenknight3Completion'), - previous: 'goldenknight2', + previous1: 'goldenknight1', + previous2: 'goldenknight2', value: 4, lvl: 40, category: 'unlockable', @@ -222,23 +223,6 @@ const quests = { name: t('questGoldenknight3Boss'), hp: 1700, str: 3.5, -======= - egg: { - text: t('questEggHuntText'), - notes: t('questEggHuntNotes'), - completion: t('questEggHuntCompletion'), - value: 1, - category: 'pet', - canBuy () { - return CURRENT_EVENT && CURRENT_EVENT.season === 'spring'; - }, - event: CURRENT_EVENT && CURRENT_EVENT.season === 'spring' ? CURRENT_EVENT : null, - collect: { - plainEgg: { - text: t('questEggHuntCollectPlainEgg'), - count: 40, - }, ->>>>>>> upstream/develop }, drop: { items: [ @@ -307,7 +291,7 @@ const quests = { notes: t('questMoon2Notes'), group: 'questGroupMoon', completion: t('questMoon2Completion'), - previous: 'moon1', + previous1: 'moon1', value: 4, category: 'unlockable', unlockCondition: { @@ -337,7 +321,8 @@ const quests = { notes: t('questMoon3Notes'), group: 'questGroupMoon', completion: t('questMoon3Completion'), - previous: 'moon2', + previous1: 'moon1', + previous2: 'moon2', value: 4, category: 'unlockable', unlockCondition: { @@ -370,9 +355,6 @@ const quests = { value: 4, lvl: 60, category: 'unlockable', - unlockCondition: { - lvl: 60, - }, collect: { moonstone: { text: t('questMoonstone1CollectMoonstone'), @@ -398,13 +380,9 @@ const quests = { completion: t('questMoonstone2Completion'), group: 'questGroupMoonstone', value: 4, - // lvl: 60, - previous: 'moonstone1', + lvl: 60, + previous1: 'moonstone1', category: 'unlockable', - unlockCondition: { - lvl: 60, - previous: 'moonstone1', - }, boss: { name: t('questMoonstone2Boss'), hp: 1500, @@ -428,14 +406,11 @@ const quests = { notes: t('questMoonstone3Notes'), group: 'questGroupMoonstone', completion: t('questMoonstone3Completion'), - previous: 'moonstone2', + previous1: 'moonstone1', + previous2: 'moonstone2', value: 4, lvl: 60, category: 'unlockable', - unlockCondition: { - lvl: 60, - previous: 'moonstone2', - }, boss: { name: t('questMoonstone3Boss'), hp: 2000, @@ -519,7 +494,7 @@ const quests = { value: 4, lvl: 30, category: 'unlockable', - previous: 'vice1', + previous1: 'vice1', collect: { lightCrystal: { text: t('questVice2CollectLightCrystal'), @@ -544,7 +519,8 @@ const quests = { notes: t('questVice3Notes'), group: 'questGroupVice', completion: t('questVice3Completion'), - previous: 'vice2', + previous1: 'vice1', + previous2: 'vice2', value: 4, lvl: 30, category: 'unlockable', @@ -617,7 +593,7 @@ const quests = { notes: t('questDilatoryDistress2Notes'), group: 'questGroupDilatoryDistress', completion: t('questDilatoryDistress2Completion'), - previous: 'dilatoryDistress1', + previous1: 'dilatoryDistress1', value: 4, goldValue: 300, category: 'gold', @@ -657,7 +633,8 @@ const quests = { notes: t('questDilatoryDistress3Notes'), group: 'questGroupDilatoryDistress', completion: t('questDilatoryDistress3Completion'), - previous: 'dilatoryDistress2', + previous1: 'dilatoryDistress1', + previous2: 'dilatoryDistress2', value: 4, goldValue: 400, category: 'gold', @@ -738,7 +715,7 @@ const quests = { notes: t('questMayhemMistiflying2Notes'), group: 'questGroupMayhemMistiflying', completion: t('questMayhemMistiflying2Completion'), - previous: 'mayhemMistiflying1', + previous1: 'mayhemMistiflying1', value: 4, goldValue: 300, category: 'gold', @@ -773,7 +750,8 @@ const quests = { notes: t('questMayhemMistiflying3Notes'), group: 'questGroupMayhemMistiflying', completion: t('questMayhemMistiflying3Completion'), - previous: 'mayhemMistiflying2', + previous1: 'mayhemMistiflying1', + previous2: 'mayhemMistiflying2', value: 4, goldValue: 400, category: 'gold', @@ -854,7 +832,7 @@ const quests = { notes: t('questStoikalmCalamity2Notes'), group: 'questGroupStoikalmCalamity', completion: t('questStoikalmCalamity2Completion'), - previous: 'stoikalmCalamity1', + previous1: 'stoikalmCalamity1', value: 4, goldValue: 300, category: 'gold', @@ -881,7 +859,8 @@ const quests = { notes: t('questStoikalmCalamity3Notes'), group: 'questGroupStoikalmCalamity', completion: t('questStoikalmCalamity3Completion'), - previous: 'stoikalmCalamity2', + previous1: 'stoikalmCalamity1', + previous2: 'stoikalmCalamity2', value: 4, goldValue: 400, category: 'gold', @@ -962,7 +941,7 @@ const quests = { notes: t('questTaskwoodsTerror2Notes'), group: 'questGroupTaskwoodsTerror', completion: t('questTaskwoodsTerror2Completion'), - previous: 'taskwoodsTerror1', + previous1: 'taskwoodsTerror1', value: 4, goldValue: 300, category: 'gold', @@ -997,7 +976,8 @@ const quests = { notes: t('questTaskwoodsTerror3Notes'), group: 'questGroupTaskwoodsTerror', completion: t('questTaskwoodsTerror3Completion'), - previous: 'taskwoodsTerror2', + previous1: 'taskwoodsTerror1', + previous2: 'taskwoodsTerror2', value: 4, goldValue: 400, category: 'gold', @@ -1101,7 +1081,7 @@ const quests = { text: t('questLostMasterclasser2Text'), notes: t('questLostMasterclasser2Notes'), group: 'questGroupLostMasterclasser', - previous: 'lostMasterclasser1', + previous1: 'lostMasterclasser1', completion: t('questLostMasterclasser2Completion'), value: 4, goldValue: 500, @@ -1164,7 +1144,8 @@ const quests = { notes: t('questLostMasterclasser3Notes'), group: 'questGroupLostMasterclasser', completion: t('questLostMasterclasser3Completion'), - previous: 'lostMasterclasser2', + previous1: 'lostMasterclasser1', + previous2: 'lostMasterclasser2', value: 4, goldValue: 600, category: 'gold', @@ -1217,7 +1198,9 @@ const quests = { notes: t('questLostMasterclasser4Notes'), group: 'questGroupLostMasterclasser', completion: t('questLostMasterclasser4Completion'), - previous: 'lostMasterclasser3', + previous1: 'lostMasterclasser1', + previous2: 'lostMasterclasser2', + previous3: 'lostMasterclasser3', value: 4, goldValue: 700, category: 'gold', @@ -3393,7 +3376,6 @@ const quests = { unlock: t('questTurquoiseUnlockText'), }, }, -<<<<<<< HEAD // time travelers quests robot: { text: t('questRobotText'), @@ -3416,28 +3398,6 @@ const quests = { spring: { text: t('questRobotCollectSprings'), count: 10, -======= - waffle: { - text: t('questWaffleText'), - notes: t('questWaffleNotes'), - completion: t('questWaffleCompletion'), - value: 4, - category: 'hatchingPotion', - canBuy () { - return CURRENT_EVENT && CURRENT_EVENT.season === 'spring'; - }, - event: CURRENT_EVENT && CURRENT_EVENT.season === 'spring' ? CURRENT_EVENT : null, - boss: { - name: t('questWaffleBoss'), - hp: 500, - str: 2, - rage: { - title: t('questWaffleRageTitle'), - description: t('questWaffleRageDescription'), - value: 50, - progressDrain: 0.5, - effect: t('questWaffleRageEffect'), ->>>>>>> upstream/develop }, }, drop: { diff --git a/website/common/script/libs/getItemInfo.js b/website/common/script/libs/getItemInfo.js index ac96b7a988..fa53c24c21 100644 --- a/website/common/script/libs/getItemInfo.js +++ b/website/common/script/libs/getItemInfo.js @@ -31,24 +31,36 @@ function lockQuest (quest, user) { && user.achievements.quests.taskwoodsTerror3); } - // checks for multiple prerequisites - // if (quest.prerequisite === true) return true; - // level requirements if (quest.lvl && user.stats.lvl < quest.lvl) return true; - // unlockCondition requirements + // unlockCondition requirements for Lunar Battle if (quest.unlockCondition && (quest.key === 'moon1' || quest.key === 'moon2' || quest.key === 'moon3')) { return user.loginIncentives < quest.unlockCondition.incentiveThreshold; } - // checks to make sure that previous quest has been completed + // checks to make sure 1st quest completed (previous1) if (user.achievements.quests) { - return quest.previous - && !user.achievements.quests[quest.previous]; + return quest.previous1 + && !user.achievements.quests[quest.previous1]; } - return quest.previous; + + // checks to make sure 1st and 2nd quests completed (previous1 and previous2) + if (user.achievements.quests) { + return quest.previous1 + && !user.achievements.quests[quest.previous1] + && !user.achievements.quests[quest.previous2]; + } + + // checks to make sure 1st, 2nd, & 3rd quests completed (previous1, previous2, previous3) + if (user.achievements.quests) { + return quest.previous1 + && !user.achievements.quests[quest.previous1] + && !user.achievements.quests[quest.previous2] + && !user.achievements.quests[quest.previous3]; + } + return quest.previous1; } function isItemSuggested (officialPinnedItems, itemInfo) { From d0e9339d3b19d8c1f323b052d7146979193dddfd Mon Sep 17 00:00:00 2001 From: CuriousMagpie Date: Fri, 7 Jan 2022 17:29:27 -0500 Subject: [PATCH 06/23] more quest logic --- website/common/script/content/quests.js | 60 +++++++++++++++++------ website/common/script/libs/getItemInfo.js | 38 +++++++------- 2 files changed, 66 insertions(+), 32 deletions(-) diff --git a/website/common/script/content/quests.js b/website/common/script/content/quests.js index c72d941b2c..0c41b5e002 100644 --- a/website/common/script/content/quests.js +++ b/website/common/script/content/quests.js @@ -98,7 +98,10 @@ const quests = { notes: t('questAtom2Notes'), completion: t('questAtom2Completion'), group: 'questGroupAtom', - previous1: 'atom1', + previous: 'atom1', + prereqQuests: [ + 'atom1', + ], value: 4, lvl: 15, category: 'unlockable', @@ -124,8 +127,11 @@ const quests = { text: t('questAtom3Text'), notes: t('questAtom3Notes'), group: 'questGroupAtom', - previous1: 'atom1', - previous2: 'atom2', + previous: 'atom1', + prereqQuests: [ + 'atom1', + 'atom2', + ], completion: t('questAtom3Completion'), value: 4, lvl: 15, @@ -188,7 +194,10 @@ const quests = { completion: t('questGoldenknight2Completion'), group: 'questGroupGoldenknight', value: 4, - previous1: 'goldenknight1', + previous: 'goldenknight1', + prereqQuests: [ + 'goldenknight1', + ], lvl: 40, category: 'unlockable', boss: { @@ -214,8 +223,11 @@ const quests = { notes: t('questGoldenknight3Notes'), group: 'questGroupGoldenknight', completion: t('questGoldenknight3Completion'), - previous1: 'goldenknight1', - previous2: 'goldenknight2', + previous: 'goldenknight2', + prereqQuests: [ + 'goldenknight1', + 'goldenknight2', + ], value: 4, lvl: 40, category: 'unlockable', @@ -291,7 +303,10 @@ const quests = { notes: t('questMoon2Notes'), group: 'questGroupMoon', completion: t('questMoon2Completion'), - previous1: 'moon1', + previous: 'moon1', + prereqQuests: [ + 'moon1', + ], value: 4, category: 'unlockable', unlockCondition: { @@ -321,8 +336,11 @@ const quests = { notes: t('questMoon3Notes'), group: 'questGroupMoon', completion: t('questMoon3Completion'), - previous1: 'moon1', - previous2: 'moon2', + previous1: 'moon2', + prereqQuests: [ + 'moon1', + 'moon2', + ], value: 4, category: 'unlockable', unlockCondition: { @@ -381,7 +399,10 @@ const quests = { group: 'questGroupMoonstone', value: 4, lvl: 60, - previous1: 'moonstone1', + previous: 'moonstone1', + prereqQuests: [ + 'moonstone1', + ], category: 'unlockable', boss: { name: t('questMoonstone2Boss'), @@ -406,8 +427,11 @@ const quests = { notes: t('questMoonstone3Notes'), group: 'questGroupMoonstone', completion: t('questMoonstone3Completion'), - previous1: 'moonstone1', - previous2: 'moonstone2', + previous: 'moonstone2', + prereqQuests: [ + 'moonstone1', + 'moonstone2', + ], value: 4, lvl: 60, category: 'unlockable', @@ -494,7 +518,10 @@ const quests = { value: 4, lvl: 30, category: 'unlockable', - previous1: 'vice1', + previous: 'vice1', + prereqQuests: [ + 'vice1', + ], collect: { lightCrystal: { text: t('questVice2CollectLightCrystal'), @@ -519,8 +546,11 @@ const quests = { notes: t('questVice3Notes'), group: 'questGroupVice', completion: t('questVice3Completion'), - previous1: 'vice1', - previous2: 'vice2', + previous: 'vice2', + prereqQuests: [ + 'vice1', + 'vice2', + ], value: 4, lvl: 30, category: 'unlockable', diff --git a/website/common/script/libs/getItemInfo.js b/website/common/script/libs/getItemInfo.js index fa53c24c21..ed6c0e6769 100644 --- a/website/common/script/libs/getItemInfo.js +++ b/website/common/script/libs/getItemInfo.js @@ -1,4 +1,6 @@ import _mapValues from 'lodash/mapValues'; +import intersection from 'lodash/intersection'; // there's probably other ways to do this, but, quick way to hit what I'm thinking of +import keys from 'lodash/keys'; import i18n from '../i18n'; import content from '../content/index'; import { BadRequest } from './errors'; @@ -17,7 +19,9 @@ function userAbleToStartMasterclasser (user) { function lockQuest (quest, user) { // masterclasser requirement - if (quest.key === 'lostMasterclasser1') return !userAbleToStartMasterclasser(user); + if (quest.key === 'lostMasterclasser1') { + return !userAbleToStartMasterclasser(user); + } if (quest.key === 'lostMasterclasser2' || quest.key === 'lostMasterclasser3' || quest.key === 'lostMasterclasser4') { @@ -40,27 +44,27 @@ function lockQuest (quest, user) { return user.loginIncentives < quest.unlockCondition.incentiveThreshold; } - // checks to make sure 1st quest completed (previous1) + // checks to make sure previous quest in chain is completed if (user.achievements.quests) { - return quest.previous1 - && !user.achievements.quests[quest.previous1]; + return quest.previous + && !user.achievements.quests[quest.previous]; } - // checks to make sure 1st and 2nd quests completed (previous1 and previous2) - if (user.achievements.quests) { - return quest.previous1 - && !user.achievements.quests[quest.previous1] - && !user.achievements.quests[quest.previous2]; + // TEST THIS ON MONDAYYYY + if (quest.lvl && user.stats.lvl < quest.lvl) return true; + if (quest.unlockCondition + && quest.unlockCondition.incentiveThreshold + && user.loginIncentives < quest.unlockCondition.incentiveThreshold) return true; + if (quest.prereqQuests) { + if (!user.achievements.quests) return true; + const achievedQuestKeys = keys(user.achievements.quests); + if (intersection(quest.prereqQuests, achievedQuestKeys) !== quest.prereqQuests) return true; } - // checks to make sure 1st, 2nd, & 3rd quests completed (previous1, previous2, previous3) - if (user.achievements.quests) { - return quest.previous1 - && !user.achievements.quests[quest.previous1] - && !user.achievements.quests[quest.previous2] - && !user.achievements.quests[quest.previous3]; - } - return quest.previous1; + // then if we've passed all the checks, at the end + return false; + + // return quest.previous; //what was at the end of the function before } function isItemSuggested (officialPinnedItems, itemInfo) { From 7bd190930ffc2bd5a21bd0732d2d39ab73e06140 Mon Sep 17 00:00:00 2001 From: CuriousMagpie Date: Fri, 7 Jan 2022 17:33:37 -0500 Subject: [PATCH 07/23] more quest logic --- website/common/script/content/quests.js | 60 +++++++++++++++++------ website/common/script/libs/getItemInfo.js | 43 +++++++++------- 2 files changed, 71 insertions(+), 32 deletions(-) diff --git a/website/common/script/content/quests.js b/website/common/script/content/quests.js index c72d941b2c..0c41b5e002 100644 --- a/website/common/script/content/quests.js +++ b/website/common/script/content/quests.js @@ -98,7 +98,10 @@ const quests = { notes: t('questAtom2Notes'), completion: t('questAtom2Completion'), group: 'questGroupAtom', - previous1: 'atom1', + previous: 'atom1', + prereqQuests: [ + 'atom1', + ], value: 4, lvl: 15, category: 'unlockable', @@ -124,8 +127,11 @@ const quests = { text: t('questAtom3Text'), notes: t('questAtom3Notes'), group: 'questGroupAtom', - previous1: 'atom1', - previous2: 'atom2', + previous: 'atom1', + prereqQuests: [ + 'atom1', + 'atom2', + ], completion: t('questAtom3Completion'), value: 4, lvl: 15, @@ -188,7 +194,10 @@ const quests = { completion: t('questGoldenknight2Completion'), group: 'questGroupGoldenknight', value: 4, - previous1: 'goldenknight1', + previous: 'goldenknight1', + prereqQuests: [ + 'goldenknight1', + ], lvl: 40, category: 'unlockable', boss: { @@ -214,8 +223,11 @@ const quests = { notes: t('questGoldenknight3Notes'), group: 'questGroupGoldenknight', completion: t('questGoldenknight3Completion'), - previous1: 'goldenknight1', - previous2: 'goldenknight2', + previous: 'goldenknight2', + prereqQuests: [ + 'goldenknight1', + 'goldenknight2', + ], value: 4, lvl: 40, category: 'unlockable', @@ -291,7 +303,10 @@ const quests = { notes: t('questMoon2Notes'), group: 'questGroupMoon', completion: t('questMoon2Completion'), - previous1: 'moon1', + previous: 'moon1', + prereqQuests: [ + 'moon1', + ], value: 4, category: 'unlockable', unlockCondition: { @@ -321,8 +336,11 @@ const quests = { notes: t('questMoon3Notes'), group: 'questGroupMoon', completion: t('questMoon3Completion'), - previous1: 'moon1', - previous2: 'moon2', + previous1: 'moon2', + prereqQuests: [ + 'moon1', + 'moon2', + ], value: 4, category: 'unlockable', unlockCondition: { @@ -381,7 +399,10 @@ const quests = { group: 'questGroupMoonstone', value: 4, lvl: 60, - previous1: 'moonstone1', + previous: 'moonstone1', + prereqQuests: [ + 'moonstone1', + ], category: 'unlockable', boss: { name: t('questMoonstone2Boss'), @@ -406,8 +427,11 @@ const quests = { notes: t('questMoonstone3Notes'), group: 'questGroupMoonstone', completion: t('questMoonstone3Completion'), - previous1: 'moonstone1', - previous2: 'moonstone2', + previous: 'moonstone2', + prereqQuests: [ + 'moonstone1', + 'moonstone2', + ], value: 4, lvl: 60, category: 'unlockable', @@ -494,7 +518,10 @@ const quests = { value: 4, lvl: 30, category: 'unlockable', - previous1: 'vice1', + previous: 'vice1', + prereqQuests: [ + 'vice1', + ], collect: { lightCrystal: { text: t('questVice2CollectLightCrystal'), @@ -519,8 +546,11 @@ const quests = { notes: t('questVice3Notes'), group: 'questGroupVice', completion: t('questVice3Completion'), - previous1: 'vice1', - previous2: 'vice2', + previous: 'vice2', + prereqQuests: [ + 'vice1', + 'vice2', + ], value: 4, lvl: 30, category: 'unlockable', diff --git a/website/common/script/libs/getItemInfo.js b/website/common/script/libs/getItemInfo.js index fa53c24c21..58dfcb0b56 100644 --- a/website/common/script/libs/getItemInfo.js +++ b/website/common/script/libs/getItemInfo.js @@ -1,4 +1,6 @@ import _mapValues from 'lodash/mapValues'; +import intersection from 'lodash/intersection'; // there's probably other ways to do this, but, quick way to hit what I'm thinking of +import keys from 'lodash/keys'; import i18n from '../i18n'; import content from '../content/index'; import { BadRequest } from './errors'; @@ -17,7 +19,9 @@ function userAbleToStartMasterclasser (user) { function lockQuest (quest, user) { // masterclasser requirement - if (quest.key === 'lostMasterclasser1') return !userAbleToStartMasterclasser(user); + if (quest.key === 'lostMasterclasser1') { + return !userAbleToStartMasterclasser(user); + } if (quest.key === 'lostMasterclasser2' || quest.key === 'lostMasterclasser3' || quest.key === 'lostMasterclasser4') { @@ -40,27 +44,32 @@ function lockQuest (quest, user) { return user.loginIncentives < quest.unlockCondition.incentiveThreshold; } - // checks to make sure 1st quest completed (previous1) + // checks to make sure previous quest in chain is completed if (user.achievements.quests) { - return quest.previous1 - && !user.achievements.quests[quest.previous1]; + return quest.previous + && !user.achievements.quests[quest.previous]; } - // checks to make sure 1st and 2nd quests completed (previous1 and previous2) - if (user.achievements.quests) { - return quest.previous1 - && !user.achievements.quests[quest.previous1] - && !user.achievements.quests[quest.previous2]; + // TEST THIS ON MONDAYYYY + if (quest.lvl && user.stats.lvl < quest.lvl) return true; + if (quest.unlockCondition + && quest.unlockCondition.incentiveThreshold + && user.loginIncentives < quest.unlockCondition.incentiveThreshold) return true; + if (quest.prereqQuests) { + if (!user.achievements.quests) return true; + const achievedQuestKeys = keys(user.achievements.quests); + if (intersection(quest.prereqQuests, achievedQuestKeys) !== quest.prereqQuests) return true; } - // checks to make sure 1st, 2nd, & 3rd quests completed (previous1, previous2, previous3) - if (user.achievements.quests) { - return quest.previous1 - && !user.achievements.quests[quest.previous1] - && !user.achievements.quests[quest.previous2] - && !user.achievements.quests[quest.previous3]; - } - return quest.previous1; + // OR THIS + // if (intersection(quest.prereqQuests, keys(user.quest.achievements)) !== quest.prereqQuests) { + // return true; + // } + + // then if we've passed all the checks, at the end + return false; + + // return quest.previous; //what was at the end of the function before } function isItemSuggested (officialPinnedItems, itemInfo) { From 3eb9225b8b0553d85e2551ed5cb5ee4aa67e93cd Mon Sep 17 00:00:00 2001 From: CuriousMagpie Date: Fri, 7 Jan 2022 17:36:47 -0500 Subject: [PATCH 08/23] and more quest logic things to try --- website/common/script/libs/getItemInfo.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/website/common/script/libs/getItemInfo.js b/website/common/script/libs/getItemInfo.js index 6e1723d9af..58dfcb0b56 100644 --- a/website/common/script/libs/getItemInfo.js +++ b/website/common/script/libs/getItemInfo.js @@ -61,14 +61,11 @@ function lockQuest (quest, user) { if (intersection(quest.prereqQuests, achievedQuestKeys) !== quest.prereqQuests) return true; } -<<<<<<< HEAD // OR THIS // if (intersection(quest.prereqQuests, keys(user.quest.achievements)) !== quest.prereqQuests) { // return true; // } -======= ->>>>>>> d0e9339d3b19d8c1f323b052d7146979193dddfd // then if we've passed all the checks, at the end return false; From 1eb8ee4dc6a56626184d979578c03a4ffa8063b8 Mon Sep 17 00:00:00 2001 From: CuriousMagpie Date: Fri, 7 Jan 2022 21:44:57 -0500 Subject: [PATCH 09/23] added a comment re Masterclasser --- website/common/script/libs/getItemInfo.js | 51 ++++++++++++++--------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/website/common/script/libs/getItemInfo.js b/website/common/script/libs/getItemInfo.js index 58dfcb0b56..c34b591023 100644 --- a/website/common/script/libs/getItemInfo.js +++ b/website/common/script/libs/getItemInfo.js @@ -11,50 +11,59 @@ import isFreeRebirth from './isFreeRebirth'; import getOfficialPinnedItems from './getOfficialPinnedItems'; function userAbleToStartMasterclasser (user) { - return user.achievements.quests.dilatoryDistress3 + return ( + user.achievements.quests.dilatoryDistress3 && user.achievements.quests.mayhemMistiflying3 && user.achievements.quests.stoikalmCalamity3 - && user.achievements.quests.taskwoodsTerror3; + && user.achievements.quests.taskwoodsTerror3 + ); } function lockQuest (quest, user) { // masterclasser requirement + // roll this into other series checks if (quest.key === 'lostMasterclasser1') { return !userAbleToStartMasterclasser(user); } - if (quest.key === 'lostMasterclasser2' - || quest.key === 'lostMasterclasser3' - || quest.key === 'lostMasterclasser4') { - return !(userAbleToStartMasterclasser(user) - && user.achievements.quests[quest.previous]); + if ( + quest.key === 'lostMasterclasser2' + || quest.key === 'lostMasterclasser3' + || quest.key === 'lostMasterclasser4' + ) { + return !(userAbleToStartMasterclasser(user) && user.achievements.quests[quest.previous]); } if (quest.key === 'lostMasterclasser1') { - return !(user.achievements.quests.dilatoryDistress3 - && user.achievements.quests.mayhemMistiflying3 - && user.achievements.quests.stoikalmCalamity3 - && user.achievements.quests.taskwoodsTerror3); + return !( + user.achievements.quests.dilatoryDistress3 + && user.achievements.quests.mayhemMistiflying3 + && user.achievements.quests.stoikalmCalamity3 + && user.achievements.quests.taskwoodsTerror3 + ); } // level requirements if (quest.lvl && user.stats.lvl < quest.lvl) return true; // unlockCondition requirements for Lunar Battle - if (quest.unlockCondition - && (quest.key === 'moon1' || quest.key === 'moon2' || quest.key === 'moon3')) { + if ( + quest.unlockCondition + && (quest.key === 'moon1' || quest.key === 'moon2' || quest.key === 'moon3') + ) { return user.loginIncentives < quest.unlockCondition.incentiveThreshold; } // checks to make sure previous quest in chain is completed if (user.achievements.quests) { - return quest.previous - && !user.achievements.quests[quest.previous]; + return quest.previous && !user.achievements.quests[quest.previous]; } // TEST THIS ON MONDAYYYY if (quest.lvl && user.stats.lvl < quest.lvl) return true; - if (quest.unlockCondition + if ( + quest.unlockCondition && quest.unlockCondition.incentiveThreshold - && user.loginIncentives < quest.unlockCondition.incentiveThreshold) return true; + && user.loginIncentives < quest.unlockCondition.incentiveThreshold + ) return true; if (quest.prereqQuests) { if (!user.achievements.quests) return true; const achievedQuestKeys = keys(user.achievements.quests); @@ -106,7 +115,9 @@ export default function getItemInfo (user, type, item, officialPinnedItems, lang let itemInfo; - switch (type) { // eslint-disable-line default-case + switch ( + type // eslint-disable-line default-case + ) { case 'eggs': itemInfo = { key: item.key, @@ -145,7 +156,9 @@ export default function getItemInfo (user, type, item, officialPinnedItems, lang locked: false, currency: 'gems', purchaseType: 'hatchingPotions', - path: item.wacky ? `wackyHatchingPotions.${item.key}` : `premiumHatchingPotions.${item.key}`, + path: item.wacky + ? `wackyHatchingPotions.${item.key}` + : `premiumHatchingPotions.${item.key}`, pinType: 'premiumHatchingPotion', event: item.event, }; From 29ab8856ca6ae7c3385a691ce5b67d9286d3a5b2 Mon Sep 17 00:00:00 2001 From: CuriousMagpie Date: Mon, 10 Jan 2022 15:21:17 -0500 Subject: [PATCH 10/23] linter fix --- website/common/script/libs/getItemInfo.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/website/common/script/libs/getItemInfo.js b/website/common/script/libs/getItemInfo.js index c34b591023..318e37054f 100644 --- a/website/common/script/libs/getItemInfo.js +++ b/website/common/script/libs/getItemInfo.js @@ -115,8 +115,8 @@ export default function getItemInfo (user, type, item, officialPinnedItems, lang let itemInfo; - switch ( - type // eslint-disable-line default-case + switch ( // eslint-disable-line default-case + type ) { case 'eggs': itemInfo = { From 7d00fe1ecbf3381253edc6f4ae474ddfef1a45e9 Mon Sep 17 00:00:00 2001 From: CuriousMagpie Date: Tue, 11 Jan 2022 15:42:48 -0500 Subject: [PATCH 11/23] more quest logic attempts --- website/common/script/content/quests.js | 81 ++++++++++++++++++----- website/common/script/libs/getItemInfo.js | 81 ++++++++++++----------- 2 files changed, 108 insertions(+), 54 deletions(-) diff --git a/website/common/script/content/quests.js b/website/common/script/content/quests.js index 0c41b5e002..715a7d3af2 100644 --- a/website/common/script/content/quests.js +++ b/website/common/script/content/quests.js @@ -623,7 +623,10 @@ const quests = { notes: t('questDilatoryDistress2Notes'), group: 'questGroupDilatoryDistress', completion: t('questDilatoryDistress2Completion'), - previous1: 'dilatoryDistress1', + previous: 'dilatoryDistress1', + prereqQuests: [ + 'dilatoryDistress1', + ], value: 4, goldValue: 300, category: 'gold', @@ -663,8 +666,11 @@ const quests = { notes: t('questDilatoryDistress3Notes'), group: 'questGroupDilatoryDistress', completion: t('questDilatoryDistress3Completion'), - previous1: 'dilatoryDistress1', - previous2: 'dilatoryDistress2', + previous: 'dilatoryDistress2', + prereqQuests: [ + 'dilatoryDistress1', + 'dilatoryDistress2', + ], value: 4, goldValue: 400, category: 'gold', @@ -745,7 +751,10 @@ const quests = { notes: t('questMayhemMistiflying2Notes'), group: 'questGroupMayhemMistiflying', completion: t('questMayhemMistiflying2Completion'), - previous1: 'mayhemMistiflying1', + previous: 'mayhemMistiflying1', + prereqQuests: [ + 'mayhemMistiflying1', + ], value: 4, goldValue: 300, category: 'gold', @@ -780,8 +789,11 @@ const quests = { notes: t('questMayhemMistiflying3Notes'), group: 'questGroupMayhemMistiflying', completion: t('questMayhemMistiflying3Completion'), - previous1: 'mayhemMistiflying1', - previous2: 'mayhemMistiflying2', + previous: 'mayhemMistiflying2', + prereqQuests: [ + 'mayhemMistiflying1', + 'mayhemMistiflying2', + ], value: 4, goldValue: 400, category: 'gold', @@ -862,7 +874,10 @@ const quests = { notes: t('questStoikalmCalamity2Notes'), group: 'questGroupStoikalmCalamity', completion: t('questStoikalmCalamity2Completion'), - previous1: 'stoikalmCalamity1', + previous: 'stoikalmCalamity1', + prereqQuests: [ + 'stoikalmCalamity1', + ], value: 4, goldValue: 300, category: 'gold', @@ -889,8 +904,11 @@ const quests = { notes: t('questStoikalmCalamity3Notes'), group: 'questGroupStoikalmCalamity', completion: t('questStoikalmCalamity3Completion'), - previous1: 'stoikalmCalamity1', - previous2: 'stoikalmCalamity2', + previous: 'stoikalmCalamity2', + prereqQuests: [ + 'stoikalmCalamity1', + 'stoikalmCalamity2', + ], value: 4, goldValue: 400, category: 'gold', @@ -971,7 +989,10 @@ const quests = { notes: t('questTaskwoodsTerror2Notes'), group: 'questGroupTaskwoodsTerror', completion: t('questTaskwoodsTerror2Completion'), - previous1: 'taskwoodsTerror1', + previous: 'taskwoodsTerror1', + prereqQuests: [ + 'taskwoodsTerror1', + ], value: 4, goldValue: 300, category: 'gold', @@ -1006,8 +1027,11 @@ const quests = { notes: t('questTaskwoodsTerror3Notes'), group: 'questGroupTaskwoodsTerror', completion: t('questTaskwoodsTerror3Completion'), - previous1: 'taskwoodsTerror1', - previous2: 'taskwoodsTerror2', + previous: 'taskwoodsTerror2', + prereqQuests: [ + 'taskwoodsTerror1', + 'taskwoodsTerror2', + ], value: 4, goldValue: 400, category: 'gold', @@ -1047,6 +1071,20 @@ const quests = { group: 'questGroupLostMasterclasser', completion: t('questLostMasterclasser1Completion'), value: 4, + prereqQuests: [ + 'dilatoryDistress1', + 'dilatoryDistress2', + 'dilatoryDistress3', + 'mayhemMistiflying1', + 'mayhemMistiflying2', + 'mayhemMistiflying3', + 'stoikalmCalamity1', + 'stoikalmCalamity2', + 'stoikalmCalamity3', + 'taskwoodsTerror1', + 'taskwoodsTerror2', + 'taskwoodsTerror3', + ], goldValue: 400, category: 'gold', collect: { @@ -1113,6 +1151,9 @@ const quests = { group: 'questGroupLostMasterclasser', previous1: 'lostMasterclasser1', completion: t('questLostMasterclasser2Completion'), + prereqQuests: [ + 'lostMasterclasser1', + ], value: 4, goldValue: 500, category: 'gold', @@ -1174,8 +1215,11 @@ const quests = { notes: t('questLostMasterclasser3Notes'), group: 'questGroupLostMasterclasser', completion: t('questLostMasterclasser3Completion'), - previous1: 'lostMasterclasser1', - previous2: 'lostMasterclasser2', + previous: 'lostMasterclasser2', + prereqQuests: [ + 'lostMasterclasser1', + 'lostMasterclasser2', + ], value: 4, goldValue: 600, category: 'gold', @@ -1228,9 +1272,12 @@ const quests = { notes: t('questLostMasterclasser4Notes'), group: 'questGroupLostMasterclasser', completion: t('questLostMasterclasser4Completion'), - previous1: 'lostMasterclasser1', - previous2: 'lostMasterclasser2', - previous3: 'lostMasterclasser3', + previous: 'lostMasterclasser3', + prereqQuests: [ + 'lostMasterclasser1', + 'lostMasterclasser2', + 'lostMasterclasser3', + ], value: 4, goldValue: 700, category: 'gold', diff --git a/website/common/script/libs/getItemInfo.js b/website/common/script/libs/getItemInfo.js index 318e37054f..483afb9a8f 100644 --- a/website/common/script/libs/getItemInfo.js +++ b/website/common/script/libs/getItemInfo.js @@ -10,63 +10,70 @@ import isPinned from './isPinned'; import isFreeRebirth from './isFreeRebirth'; import getOfficialPinnedItems from './getOfficialPinnedItems'; -function userAbleToStartMasterclasser (user) { - return ( - user.achievements.quests.dilatoryDistress3 - && user.achievements.quests.mayhemMistiflying3 - && user.achievements.quests.stoikalmCalamity3 - && user.achievements.quests.taskwoodsTerror3 - ); -} +// function userAbleToStartMasterclasser (user) { +// return ( +// user.achievements.quests.dilatoryDistress3 +// && user.achievements.quests.mayhemMistiflying3 +// && user.achievements.quests.stoikalmCalamity3 +// && user.achievements.quests.taskwoodsTerror3 +// ); +// } function lockQuest (quest, user) { // masterclasser requirement // roll this into other series checks - if (quest.key === 'lostMasterclasser1') { - return !userAbleToStartMasterclasser(user); - } - if ( - quest.key === 'lostMasterclasser2' - || quest.key === 'lostMasterclasser3' - || quest.key === 'lostMasterclasser4' - ) { - return !(userAbleToStartMasterclasser(user) && user.achievements.quests[quest.previous]); - } - if (quest.key === 'lostMasterclasser1') { - return !( - user.achievements.quests.dilatoryDistress3 - && user.achievements.quests.mayhemMistiflying3 - && user.achievements.quests.stoikalmCalamity3 - && user.achievements.quests.taskwoodsTerror3 - ); - } + // if (quest.key === 'lostMasterclasser1') { + // return !userAbleToStartMasterclasser(user); + // } + // if ( + // quest.key === 'lostMasterclasser2' + // || quest.key === 'lostMasterclasser3' + // || quest.key === 'lostMasterclasser4' + // ) { + // return !(userAbleToStartMasterclasser(user) && user.achievements.quests[quest.previous]); + // } + // if (quest.key === 'lostMasterclasser1') { + // return !( + // user.achievements.quests.dilatoryDistress3 + // && user.achievements.quests.mayhemMistiflying3 + // && user.achievements.quests.stoikalmCalamity3 + // && user.achievements.quests.taskwoodsTerror3 + // ); + // } // level requirements - if (quest.lvl && user.stats.lvl < quest.lvl) return true; + // if (quest.lvl && user.stats.lvl < quest.lvl) return true; // unlockCondition requirements for Lunar Battle - if ( - quest.unlockCondition - && (quest.key === 'moon1' || quest.key === 'moon2' || quest.key === 'moon3') - ) { - return user.loginIncentives < quest.unlockCondition.incentiveThreshold; - } + // fix this bc we shouldn't be hard coding in specific quests + // if ( + // quest.unlockCondition + // && (quest.key === 'moon1' || quest.key === 'moon2' || quest.key === 'moon3') + // ) { + // return user.loginIncentives < quest.unlockCondition.incentiveThreshold; + // } // checks to make sure previous quest in chain is completed - if (user.achievements.quests) { - return quest.previous && !user.achievements.quests[quest.previous]; - } + // if (user.achievements.quests) { + // return quest.previous && !user.achievements.quests[quest.previous]; + // } - // TEST THIS ON MONDAYYYY + // checks quest & user level against quest level if (quest.lvl && user.stats.lvl < quest.lvl) return true; + + // checks unlockCondition.incentiveThreshold if ( quest.unlockCondition && quest.unlockCondition.incentiveThreshold && user.loginIncentives < quest.unlockCondition.incentiveThreshold ) return true; + + // checks series quests, including Masterclasser if (quest.prereqQuests) { if (!user.achievements.quests) return true; + const achievedQuestKeys = keys(user.achievements.quests); + // console.log(achievedQuestKeys); // this is returning all quests in array even if value = 0 if (intersection(quest.prereqQuests, achievedQuestKeys) !== quest.prereqQuests) return true; } From 120b2e9ade85c71d2204e04d59c84c7c563765f5 Mon Sep 17 00:00:00 2001 From: CuriousMagpie Date: Wed, 12 Jan 2022 17:07:49 -0500 Subject: [PATCH 12/23] removed a bunch of commented code --- website/common/script/content/quests.js | 2 +- website/common/script/libs/getItemInfo.js | 72 ++++------------------- 2 files changed, 13 insertions(+), 61 deletions(-) diff --git a/website/common/script/content/quests.js b/website/common/script/content/quests.js index 715a7d3af2..b72ac82754 100644 --- a/website/common/script/content/quests.js +++ b/website/common/script/content/quests.js @@ -127,7 +127,7 @@ const quests = { text: t('questAtom3Text'), notes: t('questAtom3Notes'), group: 'questGroupAtom', - previous: 'atom1', + previous: 'atom2', prereqQuests: [ 'atom1', 'atom2', diff --git a/website/common/script/libs/getItemInfo.js b/website/common/script/libs/getItemInfo.js index 483afb9a8f..a9f875d1e0 100644 --- a/website/common/script/libs/getItemInfo.js +++ b/website/common/script/libs/getItemInfo.js @@ -1,5 +1,5 @@ import _mapValues from 'lodash/mapValues'; -import intersection from 'lodash/intersection'; // there's probably other ways to do this, but, quick way to hit what I'm thinking of +import intersection from 'lodash/intersection'; import keys from 'lodash/keys'; import i18n from '../i18n'; import content from '../content/index'; @@ -10,53 +10,16 @@ import isPinned from './isPinned'; import isFreeRebirth from './isFreeRebirth'; import getOfficialPinnedItems from './getOfficialPinnedItems'; -// function userAbleToStartMasterclasser (user) { -// return ( -// user.achievements.quests.dilatoryDistress3 -// && user.achievements.quests.mayhemMistiflying3 -// && user.achievements.quests.stoikalmCalamity3 -// && user.achievements.quests.taskwoodsTerror3 -// ); -// } - function lockQuest (quest, user) { - // masterclasser requirement - // roll this into other series checks - // if (quest.key === 'lostMasterclasser1') { - // return !userAbleToStartMasterclasser(user); - // } - // if ( - // quest.key === 'lostMasterclasser2' - // || quest.key === 'lostMasterclasser3' - // || quest.key === 'lostMasterclasser4' - // ) { - // return !(userAbleToStartMasterclasser(user) && user.achievements.quests[quest.previous]); - // } - // if (quest.key === 'lostMasterclasser1') { - // return !( - // user.achievements.quests.dilatoryDistress3 - // && user.achievements.quests.mayhemMistiflying3 - // && user.achievements.quests.stoikalmCalamity3 - // && user.achievements.quests.taskwoodsTerror3 - // ); - // } + // checks series quests, including Masterclasser - // level requirements - // if (quest.lvl && user.stats.lvl < quest.lvl) return true; - - // unlockCondition requirements for Lunar Battle - // fix this bc we shouldn't be hard coding in specific quests - // if ( - // quest.unlockCondition - // && (quest.key === 'moon1' || quest.key === 'moon2' || quest.key === 'moon3') - // ) { - // return user.loginIncentives < quest.unlockCondition.incentiveThreshold; - // } - - // checks to make sure previous quest in chain is completed - // if (user.achievements.quests) { - // return quest.previous && !user.achievements.quests[quest.previous]; - // } + if (quest.prereqQuests) { + if (!user.achievements.quests) return true; + const achievedQuestKeys = keys(user.achievements.quests); + if (intersection(quest.prereqQuests, achievedQuestKeys) !== quest.prereqQuests) { + return true; + } + } // checks quest & user level against quest level if (quest.lvl && user.stats.lvl < quest.lvl) return true; @@ -68,24 +31,13 @@ function lockQuest (quest, user) { && user.loginIncentives < quest.unlockCondition.incentiveThreshold ) return true; - // checks series quests, including Masterclasser - if (quest.prereqQuests) { - if (!user.achievements.quests) return true; - - const achievedQuestKeys = keys(user.achievements.quests); - // console.log(achievedQuestKeys); // this is returning all quests in array even if value = 0 - if (intersection(quest.prereqQuests, achievedQuestKeys) !== quest.prereqQuests) return true; + if (user.achievements.quests) { + return quest.previous + && !user.achievements.quests[quest.previous]; } - // OR THIS - // if (intersection(quest.prereqQuests, keys(user.quest.achievements)) !== quest.prereqQuests) { - // return true; - // } - // then if we've passed all the checks, at the end return false; - - // return quest.previous; //what was at the end of the function before } function isItemSuggested (officialPinnedItems, itemInfo) { From 874954b16bc9115bae83902c79ea570359da700b Mon Sep 17 00:00:00 2001 From: CuriousMagpie Date: Thu, 13 Jan 2022 16:36:43 -0500 Subject: [PATCH 13/23] quest unlock logic updates, starting on actually locking quests in shop --- website/common/script/libs/getItemInfo.js | 17 +++++------------ website/common/script/ops/buy/buyQuestGem.js | 6 ++++++ 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/website/common/script/libs/getItemInfo.js b/website/common/script/libs/getItemInfo.js index a9f875d1e0..85906604f5 100644 --- a/website/common/script/libs/getItemInfo.js +++ b/website/common/script/libs/getItemInfo.js @@ -1,6 +1,4 @@ import _mapValues from 'lodash/mapValues'; -import intersection from 'lodash/intersection'; -import keys from 'lodash/keys'; import i18n from '../i18n'; import content from '../content/index'; import { BadRequest } from './errors'; @@ -11,16 +9,13 @@ import isFreeRebirth from './isFreeRebirth'; import getOfficialPinnedItems from './getOfficialPinnedItems'; function lockQuest (quest, user) { - // checks series quests, including Masterclasser - + // checks series quests, including Masterclasser? if (quest.prereqQuests) { if (!user.achievements.quests) return true; - const achievedQuestKeys = keys(user.achievements.quests); - if (intersection(quest.prereqQuests, achievedQuestKeys) !== quest.prereqQuests) { - return true; + for (const prereq of quest.prereqQuests) { + if (!user.achievements.quests[prereq]) return true; } } - // checks quest & user level against quest level if (quest.lvl && user.stats.lvl < quest.lvl) return true; @@ -30,14 +25,12 @@ function lockQuest (quest, user) { && quest.unlockCondition.incentiveThreshold && user.loginIncentives < quest.unlockCondition.incentiveThreshold ) return true; - if (user.achievements.quests) { return quest.previous && !user.achievements.quests[quest.previous]; } - - // then if we've passed all the checks, at the end - return false; + // then if we've passed all the checks + return quest.previous; } function isItemSuggested (officialPinnedItems, itemInfo) { diff --git a/website/common/script/ops/buy/buyQuestGem.js b/website/common/script/ops/buy/buyQuestGem.js index 91f60ad6df..b4835269d4 100644 --- a/website/common/script/ops/buy/buyQuestGem.js +++ b/website/common/script/ops/buy/buyQuestGem.js @@ -8,6 +8,7 @@ import content from '../../content/index'; import errorMessage from '../../libs/errorMessage'; import { AbstractGemItemOperation } from './abstractBuyOperation'; +import getItemInfo from '../../libs/getItemInfo'; export class BuyQuestWithGemOperation extends AbstractGemItemOperation { // eslint-disable-line import/prefer-default-export, max-len multiplePurchaseAllowed () { // eslint-disable-line class-methods-use-this @@ -33,6 +34,11 @@ export class BuyQuestWithGemOperation extends AbstractGemItemOperation { // esli const item = content.quests[key]; + if (getItemInfo.locked) { + throw new + BadRequest(errorMessage(`Prerequisites for ${getItemInfo.text} not met.`)); + } + if (!item) throw new NotFound(errorMessage('questNotFound', { key })); if (item.category === 'gold') { From b4f699b7c44c168ef869e5841cb4da31f8e4b549 Mon Sep 17 00:00:00 2001 From: CuriousMagpie Date: Fri, 14 Jan 2022 13:54:41 -0500 Subject: [PATCH 14/23] added item.locked to buy functions --- .../script/ops/buy/abstractBuyOperation.js | 17 +++++++++++++++++ website/common/script/ops/buy/buyQuestGem.js | 14 +++++++++----- website/common/script/ops/buy/buyQuestGold.js | 16 ++++++++++------ 3 files changed, 36 insertions(+), 11 deletions(-) diff --git a/website/common/script/ops/buy/abstractBuyOperation.js b/website/common/script/ops/buy/abstractBuyOperation.js index 947e453964..27f12750ee 100644 --- a/website/common/script/ops/buy/abstractBuyOperation.js +++ b/website/common/script/ops/buy/abstractBuyOperation.js @@ -54,6 +54,15 @@ export class AbstractBuyOperation { return item.type; } + /** + * Returns the item lock status + * @param item + * @returns {String} + */ + getItemLock (item) { // eslint-disable-line class-methods-use-this + return item.locked; + } + /** * Shortcut to get the translated string without passing `req.language` * @param {String} key - translation key @@ -139,6 +148,10 @@ export class AbstractGoldItemOperation extends AbstractBuyOperation { if (item && item.canOwn && !item.canOwn(user)) { throw new NotAuthorized(this.i18n('cannotBuyItem')); } + + if (item.locked === 'locked') { + throw new NotAuthorized(this.i18n('cannotBuyItem')); + } } subtractCurrency (user, item) { @@ -169,6 +182,10 @@ export class AbstractGemItemOperation extends AbstractBuyOperation { if (!user.balance || user.balance < itemValue * this.quantity) { throw new NotAuthorized(this.i18n('notEnoughGems')); } + + if (item.locked === 'locked') { + throw new NotAuthorized(this.i18n('cannotBuyItem')); + } } subtractCurrency (user, item) { diff --git a/website/common/script/ops/buy/buyQuestGem.js b/website/common/script/ops/buy/buyQuestGem.js index b4835269d4..d15b1edaf6 100644 --- a/website/common/script/ops/buy/buyQuestGem.js +++ b/website/common/script/ops/buy/buyQuestGem.js @@ -8,7 +8,7 @@ import content from '../../content/index'; import errorMessage from '../../libs/errorMessage'; import { AbstractGemItemOperation } from './abstractBuyOperation'; -import getItemInfo from '../../libs/getItemInfo'; +// import itemInfo from '../../libs/getItemInfo'; export class BuyQuestWithGemOperation extends AbstractGemItemOperation { // eslint-disable-line import/prefer-default-export, max-len multiplePurchaseAllowed () { // eslint-disable-line class-methods-use-this @@ -27,6 +27,10 @@ export class BuyQuestWithGemOperation extends AbstractGemItemOperation { // esli return 'quest'; } + getItemLock (item) { // eslint-disable-line class-methods-use-this + return item.locked; + } + extractAndValidateParams (user, req) { this.key = get(req, 'params.key'); const { key } = this; @@ -34,10 +38,10 @@ export class BuyQuestWithGemOperation extends AbstractGemItemOperation { // esli const item = content.quests[key]; - if (getItemInfo.locked) { - throw new - BadRequest(errorMessage(`Prerequisites for ${getItemInfo.text} not met.`)); - } + // if (quest.locked) { + // throw new + // BadRequest(errorMessage(`Prerequisites for ${itemInfo.text} not met.`)); + // } if (!item) throw new NotFound(errorMessage('questNotFound', { key })); diff --git a/website/common/script/ops/buy/buyQuestGold.js b/website/common/script/ops/buy/buyQuestGold.js index a2ae6a674a..bef8987ed3 100644 --- a/website/common/script/ops/buy/buyQuestGold.js +++ b/website/common/script/ops/buy/buyQuestGold.js @@ -14,12 +14,12 @@ export class BuyQuestWithGoldOperation extends AbstractGoldItemOperation { // es return true; } - userAbleToStartMasterClasser (user) { // eslint-disable-line class-methods-use-this - return user.achievements.quests.dilatoryDistress3 - && user.achievements.quests.mayhemMistiflying3 - && user.achievements.quests.stoikalmCalamity3 - && user.achievements.quests.taskwoodsTerror3; - } + // userAbleToStartMasterClasser (user) { // eslint-disable-line class-methods-use-this + // return user.achievements.quests.dilatoryDistress3 + // && user.achievements.quests.mayhemMistiflying3 + // && user.achievements.quests.stoikalmCalamity3 + // && user.achievements.quests.taskwoodsTerror3; + // } getItemKey () { return this.key; @@ -33,6 +33,10 @@ export class BuyQuestWithGoldOperation extends AbstractGoldItemOperation { // es return 'quest'; } + getItemLock (item) { // eslint-disable-line class-methods-use-this + return item.locked; + } + extractAndValidateParams (user, req) { this.key = get(req, 'params.key'); const { key } = this; From a0b0d1d855000623901a62a9f307056550dfdd62 Mon Sep 17 00:00:00 2001 From: CuriousMagpie Date: Thu, 27 Jan 2022 14:53:52 -0500 Subject: [PATCH 15/23] submodule commit --- habitica-images | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/habitica-images b/habitica-images index 4ab9833a58..e8343fc85f 160000 --- a/habitica-images +++ b/habitica-images @@ -1 +1 @@ -Subproject commit 4ab9833a58bbc85b7b0ad8dff1ee01535270dcfe +Subproject commit e8343fc85fde6563e9897714250a3a210bd88521 From 006aad76d2793013dd5548595bb90f0d6ed2fe28 Mon Sep 17 00:00:00 2001 From: CuriousMagpie Date: Thu, 27 Jan 2022 16:59:29 -0500 Subject: [PATCH 16/23] first pass on refactoring --- .../common/script/content/constants/index.js | 7 + .../script/content/constants/questGeneric.js | 44 + .../content/constants/questMasterclasser.js | 731 +++ .../script/content/constants/questPets.js | 1652 +++++++ .../script/content/constants/questPotions.js | 339 ++ .../script/content/constants/questSeasonal.js | 171 + .../content/constants/questTimeTravel.js | 120 + .../script/content/constants/questWorld.js | 418 ++ website/common/script/content/quests.js | 4007 +---------------- 9 files changed, 3515 insertions(+), 3974 deletions(-) create mode 100644 website/common/script/content/constants/questGeneric.js create mode 100644 website/common/script/content/constants/questMasterclasser.js create mode 100644 website/common/script/content/constants/questPets.js create mode 100644 website/common/script/content/constants/questPotions.js create mode 100644 website/common/script/content/constants/questSeasonal.js create mode 100644 website/common/script/content/constants/questTimeTravel.js create mode 100644 website/common/script/content/constants/questWorld.js diff --git a/website/common/script/content/constants/index.js b/website/common/script/content/constants/index.js index 2983db0abb..6e37ade3e4 100644 --- a/website/common/script/content/constants/index.js +++ b/website/common/script/content/constants/index.js @@ -34,3 +34,10 @@ export { default as ANIMAL_SET_ACHIEVEMENTS } from './animalSetAchievements'; export { default as QUEST_SERIES_ACHIEVEMENTS } from './questSeriesAchievements'; export { default as ITEM_LIST } from './itemList'; export { default as QUEST_SERIES } from './questSeries'; +export { default as QUEST_MASTERCLASSER } from './questMasterclasser'; +export { default as QUEST_GENERIC } from './questGeneric'; +export { default as QUEST_SEASONAL } from './questSeasonal'; +export { default as QUEST_PETS } from './questPets'; +export { default as QUEST_POTIONS } from './questPotions'; +export { default as QUEST_TIME_TRAVEL } from './questTimeTravel'; +export { default as QUEST_WORLD } from './questWorld'; diff --git a/website/common/script/content/constants/questGeneric.js b/website/common/script/content/constants/questGeneric.js new file mode 100644 index 0000000000..1cb2648473 --- /dev/null +++ b/website/common/script/content/constants/questGeneric.js @@ -0,0 +1,44 @@ +import t from '../translation'; + +const QUEST_GENERIC = { + basilist: { + text: t('questBasilistText'), + notes: t('questBasilistNotes'), + group: 'questGroupEarnable', + completion: t('questBasilistCompletion'), + goldValue: 100, + category: 'unlockable', + unlockCondition: { + condition: 'party invite', + text: t('inviteFriends'), + }, + boss: { + name: t('questBasilistBoss'), + hp: 100, + str: 0.5, + }, + drop: { + gp: 8, + exp: 42, + }, + }, + dustbunnies: { + text: t('questDustBunniesText'), + notes: t('questDustBunniesNotes'), + group: 'questGroupEarnable', + completion: t('questDustBunniesCompletion'), + value: 1, + category: 'unlockable', + boss: { + name: t('questDustBunniesBoss'), + hp: 100, + str: 0.5, + }, + drop: { + gp: 8, + exp: 42, + }, + }, +}; + +export default QUEST_GENERIC; diff --git a/website/common/script/content/constants/questMasterclasser.js b/website/common/script/content/constants/questMasterclasser.js new file mode 100644 index 0000000000..b3b56bbc6f --- /dev/null +++ b/website/common/script/content/constants/questMasterclasser.js @@ -0,0 +1,731 @@ +import t from '../translation'; + +const QUEST_MASTERCLASSER = { + dilatoryDistress1: { + text: t('questDilatoryDistress1Text'), + notes: t('questDilatoryDistress1Notes'), + group: 'questGroupDilatoryDistress', + completion: t('questDilatoryDistress1Completion'), + value: 4, + goldValue: 200, + category: 'gold', + collect: { + fireCoral: { + text: t('questDilatoryDistress1CollectFireCoral'), + count: 20, + }, + blueFins: { + text: t('questDilatoryDistress1CollectBlueFins'), + count: 20, + }, + }, + drop: { + items: [ + { + type: 'gear', + key: 'armor_special_finnedOceanicArmor', + text: t('questDilatoryDistress1DropArmor'), + }, + ], + gp: 0, + exp: 75, + }, + }, + dilatoryDistress2: { + text: t('questDilatoryDistress2Text'), + notes: t('questDilatoryDistress2Notes'), + group: 'questGroupDilatoryDistress', + completion: t('questDilatoryDistress2Completion'), + previous: 'dilatoryDistress1', + prereqQuests: [ + 'dilatoryDistress1', + ], + value: 4, + goldValue: 300, + category: 'gold', + boss: { + name: t('questDilatoryDistress2Boss'), + hp: 500, + rage: { + title: t('questDilatoryDistress2RageTitle'), + description: t('questDilatoryDistress2RageDescription'), + value: 50, + healing: 0.3, + effect: t('questDilatoryDistress2RageEffect'), + }, + }, + drop: { + items: [ + { + type: 'hatchingPotions', + key: 'Skeleton', + text: t('questDilatoryDistress2DropSkeletonPotion'), + }, { + type: 'hatchingPotions', + key: 'CottonCandyBlue', + text: t('questDilatoryDistress2DropCottonCandyBluePotion'), + }, { + type: 'gear', + key: 'head_special_fireCoralCirclet', + text: t('questDilatoryDistress2DropHeadgear'), + }, + ], + gp: 0, + exp: 500, + }, + }, + dilatoryDistress3: { + text: t('questDilatoryDistress3Text'), + notes: t('questDilatoryDistress3Notes'), + group: 'questGroupDilatoryDistress', + completion: t('questDilatoryDistress3Completion'), + previous: 'dilatoryDistress2', + prereqQuests: [ + 'dilatoryDistress1', + 'dilatoryDistress2', + ], + value: 4, + goldValue: 400, + category: 'gold', + boss: { + name: t('questDilatoryDistress3Boss'), + hp: 1000, + str: 2, + }, + drop: { + items: [ + { + type: 'food', + key: 'Fish', + text: t('questDilatoryDistress3DropFish'), + }, { + type: 'food', + key: 'Fish', + text: t('questDilatoryDistress3DropFish'), + }, { + type: 'food', + key: 'Fish', + text: t('questDilatoryDistress3DropFish'), + }, { + type: 'gear', + key: 'weapon_special_tridentOfCrashingTides', + text: t('questDilatoryDistress3DropWeapon'), + }, { + type: 'gear', + key: 'shield_special_moonpearlShield', + text: t('questDilatoryDistress3DropShield'), + }, + ], + gp: 0, + exp: 650, + }, + }, + mayhemMistiflying1: { + text: t('questMayhemMistiflying1Text'), + notes: t('questMayhemMistiflying1Notes'), + group: 'questGroupMayhemMistiflying', + completion: t('questMayhemMistiflying1Completion'), + value: 4, + goldValue: 200, + category: 'gold', + boss: { + name: t('questMayhemMistiflying1Boss'), + hp: 500, + rage: { + title: t('questMayhemMistiflying1RageTitle'), + description: t('questMayhemMistiflying1RageDescription'), + value: 50, + healing: 0.3, + effect: t('questMayhemMistiflying1RageEffect'), + }, + }, + drop: { + items: [ + { + type: 'hatchingPotions', + key: 'Skeleton', + text: t('questMayhemMistiflying1DropSkeletonPotion'), + }, { + type: 'hatchingPotions', + key: 'White', + text: t('questMayhemMistiflying1DropWhitePotion'), + }, { + type: 'gear', + key: 'armor_special_roguishRainbowMessengerRobes', + text: t('questMayhemMistiflying1DropArmor'), + }, + ], + gp: 0, + exp: 500, + }, + }, + mayhemMistiflying2: { + text: t('questMayhemMistiflying2Text'), + notes: t('questMayhemMistiflying2Notes'), + group: 'questGroupMayhemMistiflying', + completion: t('questMayhemMistiflying2Completion'), + previous: 'mayhemMistiflying1', + prereqQuests: [ + 'mayhemMistiflying1', + ], + value: 4, + goldValue: 300, + category: 'gold', + collect: { + mistifly1: { + text: t('questMayhemMistiflying2CollectRedMistiflies'), + count: 25, + }, + mistifly2: { + text: t('questMayhemMistiflying2CollectBlueMistiflies'), + count: 15, + }, + mistifly3: { + text: t('questMayhemMistiflying2CollectGreenMistiflies'), + count: 10, + }, + }, + drop: { + items: [ + { + type: 'gear', + key: 'head_special_roguishRainbowMessengerHood', + text: t('questMayhemMistiflying2DropHeadgear'), + }, + ], + gp: 0, + exp: 75, + }, + }, + mayhemMistiflying3: { + text: t('questMayhemMistiflying3Text'), + notes: t('questMayhemMistiflying3Notes'), + group: 'questGroupMayhemMistiflying', + completion: t('questMayhemMistiflying3Completion'), + previous: 'mayhemMistiflying2', + prereqQuests: [ + 'mayhemMistiflying1', + 'mayhemMistiflying2', + ], + value: 4, + goldValue: 400, + category: 'gold', + boss: { + name: t('questMayhemMistiflying3Boss'), + hp: 1000, + str: 2, + }, + drop: { + items: [ + { + type: 'food', + key: 'CottonCandyPink', + text: t('questMayhemMistiflying3DropPinkCottonCandy'), + }, { + type: 'food', + key: 'CottonCandyPink', + text: t('questMayhemMistiflying3DropPinkCottonCandy'), + }, { + type: 'food', + key: 'CottonCandyPink', + text: t('questMayhemMistiflying3DropPinkCottonCandy'), + }, { + type: 'gear', + key: 'weapon_special_roguishRainbowMessage', + text: t('questMayhemMistiflying3DropWeapon'), + }, { + type: 'gear', + key: 'shield_special_roguishRainbowMessage', + text: t('questMayhemMistiflying3DropShield'), + }, + ], + gp: 0, + exp: 650, + }, + }, + stoikalmCalamity1: { + text: t('questStoikalmCalamity1Text'), + notes: t('questStoikalmCalamity1Notes'), + group: 'questGroupStoikalmCalamity', + completion: t('questStoikalmCalamity1Completion'), + value: 4, + goldValue: 200, + category: 'gold', + boss: { + name: t('questStoikalmCalamity1Boss'), + hp: 500, + rage: { + title: t('questStoikalmCalamity1RageTitle'), + description: t('questStoikalmCalamity1RageDescription'), + value: 50, + healing: 0.3, + effect: t('questStoikalmCalamity1RageEffect'), + }, + }, + drop: { + items: [ + { + type: 'hatchingPotions', + key: 'Skeleton', + text: t('questStoikalmCalamity1DropSkeletonPotion'), + }, { + type: 'hatchingPotions', + key: 'Desert', + text: t('questStoikalmCalamity1DropDesertPotion'), + }, { + type: 'gear', + key: 'armor_special_mammothRiderArmor', + text: t('questStoikalmCalamity1DropArmor'), + }, + ], + gp: 0, + exp: 500, + }, + }, + stoikalmCalamity2: { + text: t('questStoikalmCalamity2Text'), + notes: t('questStoikalmCalamity2Notes'), + group: 'questGroupStoikalmCalamity', + completion: t('questStoikalmCalamity2Completion'), + previous: 'stoikalmCalamity1', + prereqQuests: [ + 'stoikalmCalamity1', + ], + value: 4, + goldValue: 300, + category: 'gold', + collect: { + icicleCoin: { + text: t('questStoikalmCalamity2CollectIcicleCoins'), + count: 40, + }, + }, + drop: { + items: [ + { + type: 'gear', + key: 'head_special_mammothRiderHelm', + text: t('questStoikalmCalamity2DropHeadgear'), + }, + ], + gp: 0, + exp: 75, + }, + }, + stoikalmCalamity3: { + text: t('questStoikalmCalamity3Text'), + notes: t('questStoikalmCalamity3Notes'), + group: 'questGroupStoikalmCalamity', + completion: t('questStoikalmCalamity3Completion'), + previous: 'stoikalmCalamity2', + prereqQuests: [ + 'stoikalmCalamity1', + 'stoikalmCalamity2', + ], + value: 4, + goldValue: 400, + category: 'gold', + boss: { + name: t('questStoikalmCalamity3Boss'), + hp: 1000, + str: 2, + }, + drop: { + items: [ + { + type: 'food', + key: 'CottonCandyBlue', + text: t('questStoikalmCalamity3DropBlueCottonCandy'), + }, { + type: 'food', + key: 'CottonCandyBlue', + text: t('questStoikalmCalamity3DropBlueCottonCandy'), + }, { + type: 'food', + key: 'CottonCandyBlue', + text: t('questStoikalmCalamity3DropBlueCottonCandy'), + }, { + type: 'gear', + key: 'weapon_special_mammothRiderSpear', + text: t('questStoikalmCalamity3DropWeapon'), + }, { + type: 'gear', + key: 'shield_special_mammothRiderHorn', + text: t('questStoikalmCalamity3DropShield'), + }, + ], + gp: 0, + exp: 650, + }, + }, + taskwoodsTerror1: { + text: t('questTaskwoodsTerror1Text'), + notes: t('questTaskwoodsTerror1Notes'), + group: 'questGroupTaskwoodsTerror', + completion: t('questTaskwoodsTerror1Completion'), + value: 4, + goldValue: 200, + category: 'gold', + boss: { + name: t('questTaskwoodsTerror1Boss'), + hp: 500, + rage: { + title: t('questTaskwoodsTerror1RageTitle'), + description: t('questTaskwoodsTerror1RageDescription'), + value: 50, + healing: 0.3, + effect: t('questTaskwoodsTerror1RageEffect'), + }, + }, + drop: { + items: [ + { + type: 'hatchingPotions', + key: 'Skeleton', + text: t('questTaskwoodsTerror1DropSkeletonPotion'), + }, { + type: 'hatchingPotions', + key: 'Red', + text: t('questTaskwoodsTerror1DropRedPotion'), + }, { + type: 'gear', + key: 'head_special_pyromancersTurban', + text: t('questTaskwoodsTerror1DropHeadgear'), + }, + ], + gp: 0, + exp: 500, + }, + }, + taskwoodsTerror2: { + text: t('questTaskwoodsTerror2Text'), + notes: t('questTaskwoodsTerror2Notes'), + group: 'questGroupTaskwoodsTerror', + completion: t('questTaskwoodsTerror2Completion'), + previous: 'taskwoodsTerror1', + prereqQuests: [ + 'taskwoodsTerror1', + ], + value: 4, + goldValue: 300, + category: 'gold', + collect: { + pixie: { + text: t('questTaskwoodsTerror2CollectPixies'), + count: 25, + }, + brownie: { + text: t('questTaskwoodsTerror2CollectBrownies'), + count: 15, + }, + dryad: { + text: t('questTaskwoodsTerror2CollectDryads'), + count: 10, + }, + }, + drop: { + items: [ + { + type: 'gear', + key: 'armor_special_pyromancersRobes', + text: t('questTaskwoodsTerror2DropArmor'), + }, + ], + gp: 0, + exp: 75, + }, + }, + taskwoodsTerror3: { + text: t('questTaskwoodsTerror3Text'), + notes: t('questTaskwoodsTerror3Notes'), + group: 'questGroupTaskwoodsTerror', + completion: t('questTaskwoodsTerror3Completion'), + previous: 'taskwoodsTerror2', + prereqQuests: [ + 'taskwoodsTerror1', + 'taskwoodsTerror2', + ], + value: 4, + goldValue: 400, + category: 'gold', + boss: { + name: t('questTaskwoodsTerror3Boss'), + hp: 1000, + str: 2, + }, + drop: { + items: [ + { + type: 'food', + key: 'Strawberry', + text: t('questTaskwoodsTerror3DropStrawberry'), + }, { + type: 'food', + key: 'Strawberry', + text: t('questTaskwoodsTerror3DropStrawberry'), + }, { + type: 'food', + key: 'Strawberry', + text: t('questTaskwoodsTerror3DropStrawberry'), + }, { + type: 'gear', + key: 'weapon_special_taskwoodsLantern', + text: t('questTaskwoodsTerror3DropWeapon'), + }, + ], + gp: 0, + exp: 650, + }, + }, + // final quest series in Masterclasser + lostMasterclasser1: { + text: t('questLostMasterclasser1Text'), + notes: t('questLostMasterclasser1Notes'), + group: 'questGroupLostMasterclasser', + completion: t('questLostMasterclasser1Completion'), + value: 4, + prereqQuests: [ + 'dilatoryDistress1', + 'dilatoryDistress2', + 'dilatoryDistress3', + 'mayhemMistiflying1', + 'mayhemMistiflying2', + 'mayhemMistiflying3', + 'stoikalmCalamity1', + 'stoikalmCalamity2', + 'stoikalmCalamity3', + 'taskwoodsTerror1', + 'taskwoodsTerror2', + 'taskwoodsTerror3', + ], + goldValue: 400, + category: 'gold', + collect: { + ancientTome: { + text: t('questLostMasterclasser1CollectAncientTomes'), + count: 40, + }, + forbiddenTome: { + text: t('questLostMasterclasser1CollectForbiddenTomes'), + count: 40, + }, + hiddenTome: { + text: t('questLostMasterclasser1CollectHiddenTomes'), + count: 40, + }, + }, + drop: { + items: [ + { + type: 'food', + key: 'Potatoe', + text: t('foodPotatoe'), + }, { + type: 'food', + key: 'Potatoe', + text: t('foodPotatoe'), + }, { + type: 'food', + key: 'Potatoe', + text: t('foodPotatoe'), + }, { + type: 'food', + key: 'Meat', + text: t('foodMeat'), + }, { + type: 'food', + key: 'Meat', + text: t('foodMeat'), + }, { + type: 'food', + key: 'Meat', + text: t('foodMeat'), + }, { + type: 'food', + key: 'Milk', + text: t('foodMilk'), + }, { + type: 'food', + key: 'Milk', + text: t('foodMilk'), + }, { + type: 'food', + key: 'Milk', + text: t('foodMilk'), + }, + ], + gp: 0, + exp: 200, + }, + }, + lostMasterclasser2: { + text: t('questLostMasterclasser2Text'), + notes: t('questLostMasterclasser2Notes'), + group: 'questGroupLostMasterclasser', + previous1: 'lostMasterclasser1', + completion: t('questLostMasterclasser2Completion'), + prereqQuests: [ + 'lostMasterclasser1', + ], + value: 4, + goldValue: 500, + category: 'gold', + boss: { + name: t('questLostMasterclasser2Boss'), + hp: 1500, + str: 2.5, + }, + drop: { + items: [ + { + type: 'food', + key: 'Chocolate', + text: t('foodChocolate'), + }, { + type: 'food', + key: 'Chocolate', + text: t('foodChocolate'), + }, { + type: 'food', + key: 'Chocolate', + text: t('foodChocolate'), + }, { + type: 'food', + key: 'Honey', + text: t('foodHoney'), + }, { + type: 'food', + key: 'Honey', + text: t('foodHoney'), + }, { + type: 'food', + key: 'Honey', + text: t('foodHoney'), + }, { + type: 'food', + key: 'RottenMeat', + text: t('foodRottenMeat'), + }, { + type: 'food', + key: 'RottenMeat', + text: t('foodRottenMeat'), + }, { + type: 'food', + key: 'RottenMeat', + text: t('foodRottenMeat'), + }, { + type: 'gear', + key: 'eyewear_special_aetherMask', + text: t('questLostMasterclasser2DropEyewear'), + }, + ], + gp: 0, + exp: 1500, + }, + }, + lostMasterclasser3: { + text: t('questLostMasterclasser3Text'), + notes: t('questLostMasterclasser3Notes'), + group: 'questGroupLostMasterclasser', + completion: t('questLostMasterclasser3Completion'), + previous: 'lostMasterclasser2', + prereqQuests: [ + 'lostMasterclasser1', + 'lostMasterclasser2', + ], + value: 4, + goldValue: 600, + category: 'gold', + boss: { + name: t('questLostMasterclasser3Boss'), + hp: 2000, + str: 3, + rage: { + title: t('questLostMasterclasser3RageTitle'), + description: t('questLostMasterclasser3RageDescription'), + value: 25, + healing: 0.3, + effect: t('questLostMasterclasser3RageEffect'), + }, + }, + drop: { + items: [ + { + type: 'hatchingPotions', + key: 'Base', + text: t('questLostMasterclasser3DropBasePotion'), + }, { + type: 'hatchingPotions', + key: 'CottonCandyPink', + text: t('questLostMasterclasser3DropPinkPotion'), + }, { + type: 'hatchingPotions', + key: 'Golden', + text: t('questLostMasterclasser3DropGoldenPotion'), + }, { + type: 'hatchingPotions', + key: 'Shade', + text: t('questLostMasterclasser3DropShadePotion'), + }, { + type: 'hatchingPotions', + key: 'Zombie', + text: t('questLostMasterclasser3DropZombiePotion'), + }, { + type: 'gear', + key: 'body_special_aetherAmulet', + text: t('questLostMasterclasser3DropBodyAccessory'), + }, + ], + gp: 0, + exp: 2000, + }, + }, + lostMasterclasser4: { + text: t('questLostMasterclasser4Text'), + notes: t('questLostMasterclasser4Notes'), + group: 'questGroupLostMasterclasser', + completion: t('questLostMasterclasser4Completion'), + previous: 'lostMasterclasser3', + prereqQuests: [ + 'lostMasterclasser1', + 'lostMasterclasser2', + 'lostMasterclasser3', + ], + value: 4, + goldValue: 700, + category: 'gold', + boss: { + name: t('questLostMasterclasser4Boss'), + hp: 3000, + str: 4, + rage: { + title: t('questLostMasterclasser4RageTitle'), + description: t('questLostMasterclasser4RageDescription'), + value: 15, + mpDrain: true, + effect: t('questLostMasterclasser4RageEffect'), + }, + }, + drop: { + items: [ + { + type: 'mounts', + key: 'Aether-Invisible', + text: t('questLostMasterclasser4DropMount'), + }, { + type: 'gear', + key: 'back_special_aetherCloak', + text: t('questLostMasterclasser4DropBackAccessory'), + }, { + type: 'gear', + key: 'weapon_special_aetherCrystals', + text: t('questLostMasterclasser4DropWeapon'), + }, + ], + gp: 0, + exp: 3500, + }, + }, +}; + +export default QUEST_MASTERCLASSER; diff --git a/website/common/script/content/constants/questPets.js b/website/common/script/content/constants/questPets.js new file mode 100644 index 0000000000..e4b42da25e --- /dev/null +++ b/website/common/script/content/constants/questPets.js @@ -0,0 +1,1652 @@ +import t from '../translation'; + +const QUEST_PETS = { + alligator: { + text: t('questAlligatorText'), + notes: t('questAlligatorNotes'), + completion: t('questAlligatorCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questAlligatorBoss'), + hp: 1100, + str: 2.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Alligator', + text: t('questAlligatorDropAlligatorEgg'), + }, { + type: 'eggs', + key: 'Alligator', + text: t('questAlligatorDropAlligatorEgg'), + }, { + type: 'eggs', + key: 'Alligator', + text: t('questAlligatorDropAlligatorEgg'), + }, + ], + gp: 73, + exp: 725, + unlock: t('questAlligatorUnlockText'), + }, + }, + armadillo: { + text: t('questArmadilloText'), + notes: t('questArmadilloNotes'), + completion: t('questArmadilloCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questArmadilloBoss'), + hp: 600, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Armadillo', + text: t('questArmadilloDropArmadilloEgg'), + }, { + type: 'eggs', + key: 'Armadillo', + text: t('questArmadilloDropArmadilloEgg'), + }, { + type: 'eggs', + key: 'Armadillo', + text: t('questArmadilloDropArmadilloEgg'), + }, + ], + gp: 43, + exp: 350, + unlock: t('questArmadilloUnlockText'), + }, + }, + axolotl: { + text: t('questAxolotlText'), + notes: t('questAxolotlNotes'), + completion: t('questAxolotlCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questAxolotlBoss'), + hp: 500, + str: 1.5, + rage: { + title: t('questAxolotlRageTitle'), + description: t('questAxolotlRageDescription'), + value: 50, + healing: 0.3, + effect: t('questAxolotlRageEffect'), + }, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Axolotl', + text: t('questAxolotlDropAxolotlEgg'), + }, { + type: 'eggs', + key: 'Axolotl', + text: t('questAxolotlDropAxolotlEgg'), + }, { + type: 'eggs', + key: 'Axolotl', + text: t('questAxolotlDropAxolotlEgg'), + }, + ], + gp: 37, + exp: 275, + unlock: t('questAxolotlUnlockText'), + }, + }, + badger: { + text: t('questBadgerText'), + notes: t('questBadgerNotes'), + completion: t('questBadgerCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questBadgerBoss'), + hp: 600, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Badger', + text: t('questBadgerDropBadgerEgg'), + }, { + type: 'eggs', + key: 'Badger', + text: t('questBadgerDropBadgerEgg'), + }, { + type: 'eggs', + key: 'Badger', + text: t('questBadgerDropBadgerEgg'), + }, + ], + gp: 43, + exp: 350, + unlock: t('questBadgerUnlockText'), + }, + }, + beetle: { + text: t('questBeetleText'), + notes: t('questBeetleNotes'), + completion: t('questBeetleCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questBeetleBoss'), + hp: 500, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Beetle', + text: t('questBeetleDropBeetleEgg'), + }, { + type: 'eggs', + key: 'Beetle', + text: t('questBeetleDropBeetleEgg'), + }, { + type: 'eggs', + key: 'Beetle', + text: t('questBeetleDropBeetleEgg'), + }, + ], + gp: 37, + exp: 275, + unlock: t('questBeetleUnlockText'), + }, + }, + bunny: { + text: t('questBunnyText'), + notes: t('questBunnyNotes'), + completion: t('questBunnyCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questBunnyBoss'), + hp: 300, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Bunny', + text: t('questBunnyDropBunnyEgg'), + }, { + type: 'eggs', + key: 'Bunny', + text: t('questBunnyDropBunnyEgg'), + }, { + type: 'eggs', + key: 'Bunny', + text: t('questBunnyDropBunnyEgg'), + }, + ], + gp: 25, + exp: 125, + unlock: t('questBunnyUnlockText'), + }, + }, + butterfly: { + text: t('questButterflyText'), + notes: t('questButterflyNotes'), + completion: t('questButterflyCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questButterflyBoss'), + hp: 400, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Butterfly', + text: t('questButterflyDropButterflyEgg'), + }, { + type: 'eggs', + key: 'Butterfly', + text: t('questButterflyDropButterflyEgg'), + }, { + type: 'eggs', + key: 'Butterfly', + text: t('questButterflyDropButterflyEgg'), + }, + ], + gp: 31, + exp: 200, + unlock: t('questButterflyUnlockText'), + }, + }, + cheetah: { + text: t('questCheetahText'), + notes: t('questCheetahNotes'), + completion: t('questCheetahCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questCheetahBoss'), + hp: 600, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Cheetah', + text: t('questCheetahDropCheetahEgg'), + }, { + type: 'eggs', + key: 'Cheetah', + text: t('questCheetahDropCheetahEgg'), + }, { + type: 'eggs', + key: 'Cheetah', + text: t('questCheetahDropCheetahEgg'), + }, + ], + gp: 43, + exp: 350, + unlock: t('questCheetahUnlockText'), + }, + }, + cow: { + text: t('questCowText'), + notes: t('questCowNotes'), + completion: t('questCowCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questCowBoss'), + hp: 400, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Cow', + text: t('questCowDropCowEgg'), + }, { + type: 'eggs', + key: 'Cow', + text: t('questCowDropCowEgg'), + }, { + type: 'eggs', + key: 'Cow', + text: t('questCowDropCowEgg'), + }, + ], + gp: 31, + exp: 200, + unlock: t('questCowUnlockText'), + }, + }, + dilatory_derby: { // eslint-disable-line camelcase + text: t('questSeahorseText'), + notes: t('questSeahorseNotes'), + completion: t('questSeahorseCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questSeahorseBoss'), + hp: 300, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Seahorse', + text: t('questSeahorseDropSeahorseEgg'), + }, { + type: 'eggs', + key: 'Seahorse', + text: t('questSeahorseDropSeahorseEgg'), + }, { + type: 'eggs', + key: 'Seahorse', + text: t('questSeahorseDropSeahorseEgg'), + }, + ], + gp: 25, + exp: 125, + unlock: t('questSeahorseUnlockText'), + }, + }, + dolphin: { + text: t('questDolphinText'), + notes: t('questDolphinNotes'), + completion: t('questDolphinCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questDolphinBoss'), + hp: 300, + str: 1.25, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Dolphin', + text: t('questDolphinDropDolphinEgg'), + }, { + type: 'eggs', + key: 'Dolphin', + text: t('questDolphinDropDolphinEgg'), + }, { + type: 'eggs', + key: 'Dolphin', + text: t('questDolphinDropDolphinEgg'), + }, + ], + gp: 22, + exp: 110, + unlock: t('questDolphinUnlockText'), + }, + }, + falcon: { + text: t('questFalconText'), + notes: t('questFalconNotes'), + completion: t('questFalconCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questFalconBoss'), + hp: 700, + str: 2, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Falcon', + text: t('questFalconDropFalconEgg'), + }, { + type: 'eggs', + key: 'Falcon', + text: t('questFalconDropFalconEgg'), + }, { + type: 'eggs', + key: 'Falcon', + text: t('questFalconDropFalconEgg'), + }, + ], + gp: 49, + exp: 425, + unlock: t('questFalconUnlockText'), + }, + }, + ferret: { + text: t('questFerretText'), + notes: t('questFerretNotes'), + completion: t('questFerretCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questFerretBoss'), + hp: 400, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Ferret', + text: t('questFerretDropFerretEgg'), + }, { + type: 'eggs', + key: 'Ferret', + text: t('questFerretDropFerretEgg'), + }, { + type: 'eggs', + key: 'Ferret', + text: t('questFerretDropFerretEgg'), + }, + ], + gp: 31, + exp: 200, + unlock: t('questFerretUnlockText'), + }, + }, + frog: { + text: t('questFrogText'), + notes: t('questFrogNotes'), + completion: t('questFrogCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questFrogBoss'), + hp: 300, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Frog', + text: t('questFrogDropFrogEgg'), + }, { + type: 'eggs', + key: 'Frog', + text: t('questFrogDropFrogEgg'), + }, { + type: 'eggs', + key: 'Frog', + text: t('questFrogDropFrogEgg'), + }, + ], + gp: 25, + exp: 125, + unlock: t('questFrogUnlockText'), + }, + }, + ghost_stag: { // eslint-disable-line camelcase + text: t('questGhostStagText'), + notes: t('questGhostStagNotes'), + completion: t('questGhostStagCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questGhostStagBoss'), + hp: 1200, + str: 2.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Deer', + text: t('questGhostStagDropDeerEgg'), + }, { + type: 'eggs', + key: 'Deer', + text: t('questGhostStagDropDeerEgg'), + }, { + type: 'eggs', + key: 'Deer', + text: t('questGhostStagDropDeerEgg'), + }, + ], + gp: 80, + exp: 800, + unlock: t('questGhostStagUnlockText'), + }, + }, + gryphon: { + text: t('questGryphonText'), + notes: t('questGryphonNotes'), + completion: t('questGryphonCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questGryphonBoss'), + hp: 300, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Gryphon', + text: t('questGryphonDropGryphonEgg'), + }, { + type: 'eggs', + key: 'Gryphon', + text: t('questGryphonDropGryphonEgg'), + }, { + type: 'eggs', + key: 'Gryphon', + text: t('questGryphonDropGryphonEgg'), + }, + ], + gp: 25, + exp: 125, + unlock: t('questGryphonUnlockText'), + }, + }, + guineapig: { + text: t('questGuineaPigText'), + notes: t('questGuineaPigNotes'), + completion: t('questGuineaPigCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questGuineaPigBoss'), + hp: 400, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'GuineaPig', + text: t('questGuineaPigDropGuineaPigEgg'), + }, { + type: 'eggs', + key: 'GuineaPig', + text: t('questGuineaPigDropGuineaPigEgg'), + }, { + type: 'eggs', + key: 'GuineaPig', + text: t('questGuineaPigDropGuineaPigEgg'), + }, + ], + gp: 31, + exp: 200, + unlock: t('questGuineaPigUnlockText'), + }, + }, + harpy: { + text: t('questHarpyText'), + notes: t('questHarpyNotes'), + completion: t('questHarpyCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questHarpyBoss'), + hp: 600, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Parrot', + text: t('questHarpyDropParrotEgg'), + }, { + type: 'eggs', + key: 'Parrot', + text: t('questHarpyDropParrotEgg'), + }, { + type: 'eggs', + key: 'Parrot', + text: t('questHarpyDropParrotEgg'), + }, + ], + gp: 43, + exp: 350, + unlock: t('questHarpyUnlockText'), + }, + }, + hedgehog: { + text: t('questHedgehogText'), + notes: t('questHedgehogNotes'), + completion: t('questHedgehogCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questHedgehogBoss'), + hp: 400, + str: 1.25, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Hedgehog', + text: t('questHedgehogDropHedgehogEgg'), + }, { + type: 'eggs', + key: 'Hedgehog', + text: t('questHedgehogDropHedgehogEgg'), + }, { + type: 'eggs', + key: 'Hedgehog', + text: t('questHedgehogDropHedgehogEgg'), + }, + ], + gp: 30, + exp: 125, + unlock: t('questHedgehogUnlockText'), + }, + }, + hippo: { + text: t('questHippoText'), + notes: t('questHippoNotes'), + completion: t('questHippoCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questHippoBoss'), + hp: 800, + str: 2, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Hippo', + text: t('questHippoDropHippoEgg'), + }, { + type: 'eggs', + key: 'Hippo', + text: t('questHippoDropHippoEgg'), + }, { + type: 'eggs', + key: 'Hippo', + text: t('questHippoDropHippoEgg'), + }, + ], + gp: 55, + exp: 500, + unlock: t('questHippoUnlockText'), + }, + }, + horse: { + text: t('questHorseText'), + notes: t('questHorseNotes'), + completion: t('questHorseCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questHorseBoss'), + hp: 500, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Horse', + text: t('questHorseDropHorseEgg'), + }, { + type: 'eggs', + key: 'Horse', + text: t('questHorseDropHorseEgg'), + }, { + type: 'eggs', + key: 'Horse', + text: t('questHorseDropHorseEgg'), + }, + ], + gp: 37, + exp: 275, + unlock: t('questHorseUnlockText'), + }, + }, + kangaroo: { + text: t('questKangarooText'), + notes: t('questKangarooNotes'), + completion: t('questKangarooCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questKangarooBoss'), + hp: 700, + str: 2, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Kangaroo', + text: t('questKangarooDropKangarooEgg'), + }, { + type: 'eggs', + key: 'Kangaroo', + text: t('questKangarooDropKangarooEgg'), + }, { + type: 'eggs', + key: 'Kangaroo', + text: t('questKangarooDropKangarooEgg'), + }, + ], + gp: 49, + exp: 425, + unlock: t('questKangarooUnlockText'), + }, + }, + kraken: { + text: t('questKrakenText'), + notes: t('questKrakenNotes'), + completion: t('questKrakenCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questKrakenBoss'), + hp: 800, + str: 2, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Cuttlefish', + text: t('questKrakenDropCuttlefishEgg'), + }, { + type: 'eggs', + key: 'Cuttlefish', + text: t('questKrakenDropCuttlefishEgg'), + }, { + type: 'eggs', + key: 'Cuttlefish', + text: t('questKrakenDropCuttlefishEgg'), + }, + ], + gp: 55, + exp: 500, + unlock: t('questKrakenUnlockText'), + }, + }, + monkey: { + text: t('questMonkeyText'), + notes: t('questMonkeyNotes'), + completion: t('questMonkeyCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questMonkeyBoss'), + hp: 400, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Monkey', + text: t('questMonkeyDropMonkeyEgg'), + }, { + type: 'eggs', + key: 'Monkey', + text: t('questMonkeyDropMonkeyEgg'), + }, { + type: 'eggs', + key: 'Monkey', + text: t('questMonkeyDropMonkeyEgg'), + }, + ], + gp: 31, + exp: 200, + unlock: t('questMonkeyUnlockText'), + }, + }, + nudibranch: { + text: t('questNudibranchText'), + notes: t('questNudibranchNotes'), + completion: t('questNudibranchCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questNudibranchBoss'), + hp: 400, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Nudibranch', + text: t('questNudibranchDropNudibranchEgg'), + }, { + type: 'eggs', + key: 'Nudibranch', + text: t('questNudibranchDropNudibranchEgg'), + }, { + type: 'eggs', + key: 'Nudibranch', + text: t('questNudibranchDropNudibranchEgg'), + }, + ], + gp: 31, + exp: 200, + unlock: t('questNudibranchUnlockText'), + }, + }, + octopus: { + text: t('questOctopusText'), + notes: t('questOctopusNotes'), + completion: t('questOctopusCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questOctopusBoss'), + hp: 1200, + str: 2.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Octopus', + text: t('questOctopusDropOctopusEgg'), + }, { + type: 'eggs', + key: 'Octopus', + text: t('questOctopusDropOctopusEgg'), + }, { + type: 'eggs', + key: 'Octopus', + text: t('questOctopusDropOctopusEgg'), + }, + ], + gp: 80, + exp: 800, + unlock: t('questOctopusUnlockText'), + }, + }, + owl: { + text: t('questOwlText'), + notes: t('questOwlNotes'), + completion: t('questOwlCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questOwlBoss'), + hp: 500, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Owl', + text: t('questOwlDropOwlEgg'), + }, { + type: 'eggs', + key: 'Owl', + text: t('questOwlDropOwlEgg'), + }, { + type: 'eggs', + key: 'Owl', + text: t('questOwlDropOwlEgg'), + }, + ], + gp: 37, + exp: 275, + unlock: t('questOwlUnlockText'), + }, + }, + peacock: { + text: t('questPeacockText'), + notes: t('questPeacockNotes'), + completion: t('questPeacockCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questPeacockBoss'), + hp: 300, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Peacock', + text: t('questPeacockDropPeacockEgg'), + }, { + type: 'eggs', + key: 'Peacock', + text: t('questPeacockDropPeacockEgg'), + }, { + type: 'eggs', + key: 'Peacock', + text: t('questPeacockDropPeacockEgg'), + }, + ], + gp: 25, + exp: 125, + unlock: t('questPeacockUnlockText'), + }, + }, + penguin: { + text: t('questPenguinText'), + notes: t('questPenguinNotes'), + completion: t('questPenguinCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questPenguinBoss'), + hp: 400, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Penguin', + text: t('questPenguinDropPenguinEgg'), + }, { + type: 'eggs', + key: 'Penguin', + text: t('questPenguinDropPenguinEgg'), + }, { + type: 'eggs', + key: 'Penguin', + text: t('questPenguinDropPenguinEgg'), + }, + ], + gp: 31, + exp: 200, + unlock: t('questPenguinUnlockText'), + }, + }, + pterodactyl: { + text: t('questPterodactylText'), + notes: t('questPterodactylNotes'), + completion: t('questPterodactylCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questPterodactylBoss'), + hp: 1000, + str: 2, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Pterodactyl', + text: t('questPterodactylDropPterodactylEgg'), + }, { + type: 'eggs', + key: 'Pterodactyl', + text: t('questPterodactylDropPterodactylEgg'), + }, { + type: 'eggs', + key: 'Pterodactyl', + text: t('questPterodactylDropPterodactylEgg'), + }, + ], + gp: 67, + exp: 650, + unlock: t('questPterodactylUnlockText'), + }, + }, + rat: { + text: t('questRatText'), + notes: t('questRatNotes'), + completion: t('questRatCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questRatBoss'), + hp: 1200, + str: 2.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Rat', + text: t('questRatDropRatEgg'), + }, { + type: 'eggs', + key: 'Rat', + text: t('questRatDropRatEgg'), + }, { + type: 'eggs', + key: 'Rat', + text: t('questRatDropRatEgg'), + }, + ], + gp: 80, + exp: 800, + unlock: t('questRatUnlockText'), + }, + }, + rock: { + text: t('questRockText'), + notes: t('questRockNotes'), + completion: t('questRockCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questRockBoss'), + hp: 400, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Rock', + text: t('questRockDropRockEgg'), + }, { + type: 'eggs', + key: 'Rock', + text: t('questRockDropRockEgg'), + }, { + type: 'eggs', + key: 'Rock', + text: t('questRockDropRockEgg'), + }, + ], + gp: 31, + exp: 200, + unlock: t('questRockUnlockText'), + }, + }, + rooster: { + text: t('questRoosterText'), + notes: t('questRoosterNotes'), + completion: t('questRoosterCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questRoosterBoss'), + hp: 300, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Rooster', + text: t('questRoosterDropRoosterEgg'), + }, { + type: 'eggs', + key: 'Rooster', + text: t('questRoosterDropRoosterEgg'), + }, { + type: 'eggs', + key: 'Rooster', + text: t('questRoosterDropRoosterEgg'), + }, + ], + gp: 25, + exp: 125, + unlock: t('questRoosterUnlockText'), + }, + }, + sabretooth: { + text: t('questSabretoothText'), + notes: t('questSabretoothNotes'), + completion: t('questSabretoothCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questSabretoothBoss'), + hp: 1000, + str: 2, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Sabretooth', + text: t('questSabretoothDropSabretoothEgg'), + }, { + type: 'eggs', + key: 'Sabretooth', + text: t('questSabretoothDropSabretoothEgg'), + }, { + type: 'eggs', + key: 'Sabretooth', + text: t('questSabretoothDropSabretoothEgg'), + }, + ], + gp: 67, + exp: 650, + unlock: t('questSabretoothUnlockText'), + }, + }, + seaserpent: { + text: t('questSeaSerpentText'), + notes: t('questSeaSerpentNotes'), + completion: t('questSeaSerpentCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questSeaSerpentBoss'), + hp: 1200, + str: 2.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'SeaSerpent', + text: t('questSeaSerpentDropSeaSerpentEgg'), + }, { + type: 'eggs', + key: 'SeaSerpent', + text: t('questSeaSerpentDropSeaSerpentEgg'), + }, { + type: 'eggs', + key: 'SeaSerpent', + text: t('questSeaSerpentDropSeaSerpentEgg'), + }, + ], + gp: 80, + exp: 800, + unlock: t('questSeaSerpentUnlockText'), + }, + }, + sheep: { + text: t('questSheepText'), + notes: t('questSheepNotes'), + completion: t('questSheepCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questSheepBoss'), + hp: 300, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Sheep', + text: t('questSheepDropSheepEgg'), + }, { + type: 'eggs', + key: 'Sheep', + text: t('questSheepDropSheepEgg'), + }, { + type: 'eggs', + key: 'Sheep', + text: t('questSheepDropSheepEgg'), + }, + ], + gp: 25, + exp: 125, + unlock: t('questSheepUnlockText'), + }, + }, + slime: { + text: t('questSlimeText'), + notes: t('questSlimeNotes'), + completion: t('questSlimeCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questSlimeBoss'), + hp: 400, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Slime', + text: t('questSlimeDropSlimeEgg'), + }, { + type: 'eggs', + key: 'Slime', + text: t('questSlimeDropSlimeEgg'), + }, { + type: 'eggs', + key: 'Slime', + text: t('questSlimeDropSlimeEgg'), + }, + ], + gp: 31, + exp: 200, + unlock: t('questSlimeUnlockText'), + }, + }, + sloth: { + text: t('questSlothText'), + notes: t('questSlothNotes'), + completion: t('questSlothCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questSlothBoss'), + hp: 400, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Sloth', + text: t('questSlothDropSlothEgg'), + }, { + type: 'eggs', + key: 'Sloth', + text: t('questSlothDropSlothEgg'), + }, { + type: 'eggs', + key: 'Sloth', + text: t('questSlothDropSlothEgg'), + }, + ], + gp: 31, + exp: 200, + unlock: t('questSlothUnlockText'), + }, + }, + snail: { + text: t('questSnailText'), + notes: t('questSnailNotes'), + completion: t('questSnailCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questSnailBoss'), + hp: 500, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Snail', + text: t('questSnailDropSnailEgg'), + }, { + type: 'eggs', + key: 'Snail', + text: t('questSnailDropSnailEgg'), + }, { + type: 'eggs', + key: 'Snail', + text: t('questSnailDropSnailEgg'), + }, + ], + gp: 37, + exp: 275, + unlock: t('questSnailUnlockText'), + }, + }, + snake: { + text: t('questSnakeText'), + notes: t('questSnakeNotes'), + completion: t('questSnakeCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questSnakeBoss'), + hp: 1100, + str: 2.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Snake', + text: t('questSnakeDropSnakeEgg'), + }, { + type: 'eggs', + key: 'Snake', + text: t('questSnakeDropSnakeEgg'), + }, { + type: 'eggs', + key: 'Snake', + text: t('questSnakeDropSnakeEgg'), + }, + ], + gp: 73, + exp: 725, + unlock: t('questSnakeUnlockText'), + }, + }, + spider: { + text: t('questSpiderText'), + notes: t('questSpiderNotes'), + completion: t('questSpiderCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questSpiderBoss'), + hp: 400, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Spider', + text: t('questSpiderDropSpiderEgg'), + }, { + type: 'eggs', + key: 'Spider', + text: t('questSpiderDropSpiderEgg'), + }, { + type: 'eggs', + key: 'Spider', + text: t('questSpiderDropSpiderEgg'), + }, + ], + gp: 31, + exp: 200, + unlock: t('questSpiderUnlockText'), + }, + }, + squirrel: { + text: t('questSquirrelText'), + notes: t('questSquirrelNotes'), + completion: t('questSquirrelCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questSquirrelBoss'), + hp: 700, + str: 2, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Squirrel', + text: t('questSquirrelDropSquirrelEgg'), + }, { + type: 'eggs', + key: 'Squirrel', + text: t('questSquirrelDropSquirrelEgg'), + }, { + type: 'eggs', + key: 'Squirrel', + text: t('questSquirrelDropSquirrelEgg'), + }, + ], + gp: 49, + exp: 425, + unlock: t('questSquirrelUnlockText'), + }, + }, + treeling: { + text: t('questTreelingText'), + notes: t('questTreelingNotes'), + completion: t('questTreelingCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questTreelingBoss'), + hp: 600, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Treeling', + text: t('questTreelingDropTreelingEgg'), + }, { + type: 'eggs', + key: 'Treeling', + text: t('questTreelingDropTreelingEgg'), + }, { + type: 'eggs', + key: 'Treeling', + text: t('questTreelingDropTreelingEgg'), + }, + ], + gp: 43, + exp: 350, + unlock: t('questTreelingUnlockText'), + }, + }, + trex: { + text: t('questTRexText'), + notes: t('questTRexNotes'), + completion: t('questTRexCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questTRexBoss'), + hp: 800, + str: 2, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'TRex', + text: t('questTRexDropTRexEgg'), + }, { + type: 'eggs', + key: 'TRex', + text: t('questTRexDropTRexEgg'), + }, { + type: 'eggs', + key: 'TRex', + text: t('questTRexDropTRexEgg'), + }, + ], + gp: 55, + exp: 500, + unlock: t('questTRexUnlockText'), + }, + }, + trex_undead: { // eslint-disable-line camelcase + text: t('questTRexUndeadText'), + notes: t('questTRexUndeadNotes'), + completion: t('questTRexUndeadCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questTRexUndeadBoss'), + hp: 500, + str: 2, + rage: { + title: t('questTRexUndeadRageTitle'), + description: t('questTRexUndeadRageDescription'), + value: 50, + healing: 0.3, + effect: t('questTRexUndeadRageEffect'), + }, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'TRex', + text: t('questTRexDropTRexEgg'), + }, { + type: 'eggs', + key: 'TRex', + text: t('questTRexDropTRexEgg'), + }, { + type: 'eggs', + key: 'TRex', + text: t('questTRexDropTRexEgg'), + }, + ], + gp: 55, + exp: 500, + unlock: t('questTRexUnlockText'), + }, + }, + triceratops: { + text: t('questTriceratopsText'), + notes: t('questTriceratopsNotes'), + completion: t('questTriceratopsCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questTriceratopsBoss'), + hp: 1200, + str: 2.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Triceratops', + text: t('questTriceratopsDropTriceratopsEgg'), + }, { + type: 'eggs', + key: 'Triceratops', + text: t('questTriceratopsDropTriceratopsEgg'), + }, { + type: 'eggs', + key: 'Triceratops', + text: t('questTriceratopsDropTriceratopsEgg'), + }, + ], + gp: 80, + exp: 800, + unlock: t('questTriceratopsUnlockText'), + }, + }, + turtle: { + text: t('questTurtleText'), + notes: t('questTurtleNotes'), + completion: t('questTurtleCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questTurtleBoss'), + hp: 300, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Turtle', + text: t('questTurtleDropTurtleEgg'), + }, { + type: 'eggs', + key: 'Turtle', + text: t('questTurtleDropTurtleEgg'), + }, { + type: 'eggs', + key: 'Turtle', + text: t('questTurtleDropTurtleEgg'), + }, + ], + gp: 25, + exp: 125, + unlock: t('questTurtleUnlockText'), + }, + }, + unicorn: { + text: t('questUnicornText'), + notes: t('questUnicornNotes'), + completion: t('questUnicornCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questUnicornBoss'), + hp: 600, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Unicorn', + text: t('questUnicornDropUnicornEgg'), + }, { + type: 'eggs', + key: 'Unicorn', + text: t('questUnicornDropUnicornEgg'), + }, { + type: 'eggs', + key: 'Unicorn', + text: t('questUnicornDropUnicornEgg'), + }, + ], + gp: 43, + exp: 350, + unlock: t('questUnicornUnlockText'), + }, + }, + velociraptor: { + text: t('questVelociraptorText'), + notes: t('questVelociraptorNotes'), + completion: t('questVelociraptorCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questVelociraptorBoss'), + hp: 900, + str: 2, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Velociraptor', + text: t('questVelociraptorDropVelociraptorEgg'), + }, { + type: 'eggs', + key: 'Velociraptor', + text: t('questVelociraptorDropVelociraptorEgg'), + }, { + type: 'eggs', + key: 'Velociraptor', + text: t('questVelociraptorDropVelociraptorEgg'), + }, + ], + gp: 63, + exp: 575, + unlock: t('questVelociraptorUnlockText'), + }, + }, + whale: { + text: t('questWhaleText'), + notes: t('questWhaleNotes'), + completion: t('questWhaleCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questWhaleBoss'), + hp: 500, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Whale', + text: t('questWhaleDropWhaleEgg'), + }, { + type: 'eggs', + key: 'Whale', + text: t('questWhaleDropWhaleEgg'), + }, { + type: 'eggs', + key: 'Whale', + text: t('questWhaleDropWhaleEgg'), + }, + ], + gp: 37, + exp: 275, + unlock: t('questWhaleUnlockText'), + }, + }, + yarn: { + text: t('questYarnText'), + notes: t('questYarnNotes'), + completion: t('questYarnCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questYarnBoss'), + hp: 500, + str: 1.5, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Yarn', + text: t('questYarnDropYarnEgg'), + }, { + type: 'eggs', + key: 'Yarn', + text: t('questYarnDropYarnEgg'), + }, { + type: 'eggs', + key: 'Yarn', + text: t('questYarnDropYarnEgg'), + }, + ], + gp: 37, + exp: 275, + unlock: t('questYarnUnlockText'), + }, + }, +}; + +export default QUEST_PETS; diff --git a/website/common/script/content/constants/questPotions.js b/website/common/script/content/constants/questPotions.js new file mode 100644 index 0000000000..5bd146cf71 --- /dev/null +++ b/website/common/script/content/constants/questPotions.js @@ -0,0 +1,339 @@ +import t from '../translation'; + +const QUEST_POTIONS = { + amber: { + text: t('questAmberText'), + notes: t('questAmberNotes'), + completion: t('questAmberCompletion'), + value: 4, + category: 'hatchingPotion', + boss: { + name: t('questAmberBoss'), + hp: 300, + str: 1.25, + }, + drop: { + items: [ + { + type: 'hatchingPotions', + key: 'Amber', + text: t('questAmberDropAmberPotion'), + }, { + type: 'hatchingPotions', + key: 'Amber', + text: t('questAmberDropAmberPotion'), + }, { + type: 'hatchingPotions', + key: 'Amber', + text: t('questAmberDropAmberPotion'), + }, + ], + gp: 50, + exp: 100, + unlock: t('questAmberUnlockText'), + }, + }, + blackPearl: { + text: t('questBlackPearlText'), + notes: t('questBlackPearlNotes'), + completion: t('questBlackPearlCompletion'), + value: 4, + category: 'hatchingPotion', + boss: { + name: t('questBlackPearlBoss'), + hp: 725, + str: 1.75, + }, + drop: { + items: [ + { + type: 'hatchingPotions', + key: 'BlackPearl', + text: t('questBlackPearlDropBlackPearlPotion'), + }, { + type: 'hatchingPotions', + key: 'BlackPearl', + text: t('questBlackPearlDropBlackPearlPotion'), + }, { + type: 'hatchingPotions', + key: 'BlackPearl', + text: t('questBlackPearlDropBlackPearlPotion'), + }, + ], + gp: 50, + exp: 450, + unlock: t('questBlackPearlUnlockText'), + }, + }, + bronze: { + text: t('questBronzeText'), + notes: t('questBronzeNotes'), + completion: t('questBronzeCompletion'), + value: 4, + category: 'hatchingPotion', + boss: { + name: t('questBronzeBoss'), + hp: 800, + str: 2, + }, + drop: { + items: [ + { + type: 'hatchingPotions', + key: 'Bronze', + text: t('questBronzeDropBronzePotion'), + }, { + type: 'hatchingPotions', + key: 'Bronze', + text: t('questBronzeDropBronzePotion'), + }, { + type: 'hatchingPotions', + key: 'Bronze', + text: t('questBronzeDropBronzePotion'), + }, + ], + gp: 63, + exp: 575, + unlock: t('questBronzeUnlockText'), + }, + }, + fluorite: { + text: t('questFluoriteText'), + notes: t('questFluoriteNotes'), + completion: t('questFluoriteCompletion'), + value: 4, + category: 'hatchingPotion', + boss: { + name: t('questFluoriteBoss'), + hp: 1200, + str: 2, + }, + drop: { + items: [ + { + type: 'hatchingPotions', + key: 'Fluorite', + text: t('questFluoriteDropFluoritePotion'), + }, { + type: 'hatchingPotions', + key: 'Fluorite', + text: t('questFluoriteDropFluoritePotion'), + }, { + type: 'hatchingPotions', + key: 'Fluorite', + text: t('questFluoriteDropFluoritePotion'), + }, + ], + gp: 70, + exp: 750, + unlock: t('questFluoriteUnlockText'), + }, + }, + onyx: { + text: t('questOnyxText'), + notes: t('questOnyxNotes'), + completion: t('questOnyxCompletion'), + value: 4, + category: 'hatchingPotion', + collect: { + onyxStone: { + text: t('questOnyxCollectOnyxStones'), + count: 25, + }, + plutoRune: { + text: t('questOnyxCollectPlutoRunes'), + count: 10, + }, + leoRune: { + text: t('questOnyxCollectLeoRunes'), + count: 10, + }, + }, + drop: { + items: [ + { + type: 'hatchingPotions', + key: 'Onyx', + text: t('questOnyxDropOnyxPotion'), + }, { + type: 'hatchingPotions', + key: 'Onyx', + text: t('questOnyxDropOnyxPotion'), + }, { + type: 'hatchingPotions', + key: 'Onyx', + text: t('questOnyxDropOnyxPotion'), + }, + ], + gp: 50, + exp: 100, + unlock: t('questOnyxUnlockText'), + }, + }, + ruby: { + text: t('questRubyText'), + notes: t('questRubyNotes'), + completion: t('questRubyCompletion'), + value: 4, + category: 'hatchingPotion', + collect: { + rubyGem: { + text: t('questRubyCollectRubyGems'), + count: 25, + }, + venusRune: { + text: t('questRubyCollectVenusRunes'), + count: 10, + }, + aquariusRune: { + text: t('questRubyCollectAquariusRunes'), + count: 10, + }, + }, + drop: { + items: [ + { + type: 'hatchingPotions', + key: 'Ruby', + text: t('questRubyDropRubyPotion'), + }, { + type: 'hatchingPotions', + key: 'Ruby', + text: t('questRubyDropRubyPotion'), + }, { + type: 'hatchingPotions', + key: 'Ruby', + text: t('questRubyDropRubyPotion'), + }, + ], + gp: 50, + exp: 100, + unlock: t('questRubyUnlockText'), + }, + }, + silver: { + text: t('questSilverText'), + notes: t('questSilverNotes'), + completion: t('questSilverCompletion'), + value: 4, + category: 'hatchingPotion', + collect: { + silverIngot: { + text: t('questSilverCollectSilverIngots'), + count: 20, + }, + moonRune: { + text: t('questSilverCollectMoonRunes'), + count: 15, + }, + cancerRune: { + text: t('questSilverCollectCancerRunes'), + count: 15, + }, + }, + drop: { + items: [ + { + type: 'hatchingPotions', + key: 'Silver', + text: t('questSilverDropSilverPotion'), + }, { + type: 'hatchingPotions', + key: 'Silver', + text: t('questSilverDropSilverPotion'), + }, { + type: 'hatchingPotions', + key: 'Silver', + text: t('questSilverDropSilverPotion'), + }, + ], + gp: 50, + exp: 100, + unlock: t('questSilverUnlockText'), + }, + }, + stone: { + text: t('questStoneText'), + notes: t('questStoneNotes'), + completion: t('questStoneCompletion'), + value: 4, + category: 'hatchingPotion', + collect: { + mossyStone: { + text: t('questStoneCollectMossyStones'), + count: 25, + }, + marsRune: { + text: t('questStoneCollectMarsRunes'), + count: 10, + }, + capricornRune: { + text: t('questStoneCollectCapricornRunes'), + count: 10, + }, + }, + drop: { + items: [ + { + type: 'hatchingPotions', + key: 'MossyStone', + text: t('questStoneDropMossyStonePotion'), + }, { + type: 'hatchingPotions', + key: 'MossyStone', + text: t('questStoneDropMossyStonePotion'), + }, { + type: 'hatchingPotions', + key: 'MossyStone', + text: t('questStoneDropMossyStonePotion'), + }, + ], + gp: 50, + exp: 100, + unlock: t('questStoneUnlockText'), + }, + }, + turquoise: { + text: t('questTurquoiseText'), + notes: t('questTurquoiseNotes'), + completion: t('questTurquoiseCompletion'), + value: 4, + category: 'hatchingPotion', + collect: { + turquoiseGem: { + text: t('questTurquoiseCollectTurquoiseGems'), + count: 25, + }, + sagittariusRune: { + text: t('questTurquoiseCollectSagittariusRunes'), + count: 10, + }, + neptuneRune: { + text: t('questTurquoiseCollectNeptuneRunes'), + count: 10, + }, + }, + drop: { + items: [ + { + type: 'hatchingPotions', + key: 'Turquoise', + text: t('questTurquoiseDropTurquoisePotion'), + }, { + type: 'hatchingPotions', + key: 'Turquoise', + text: t('questTurquoiseDropTurquoisePotion'), + }, { + type: 'hatchingPotions', + key: 'Turquoise', + text: t('questTurquoiseDropTurquoisePotion'), + }, + ], + gp: 50, + exp: 100, + unlock: t('questTurquoiseUnlockText'), + }, + }, +}; + +export default QUEST_POTIONS; diff --git a/website/common/script/content/constants/questSeasonal.js b/website/common/script/content/constants/questSeasonal.js new file mode 100644 index 0000000000..166b2896e4 --- /dev/null +++ b/website/common/script/content/constants/questSeasonal.js @@ -0,0 +1,171 @@ +import find from 'lodash/find'; +import moment from 'moment'; +import EVENTS from 'events'; +import t from '../translation'; + +const CURRENT_EVENT = find( + EVENTS, event => moment().isBetween(event.start, event.end) && Boolean(event.season), +); + +const QUEST_SEASONAL = { + // winter + evilsanta: { + event: CURRENT_EVENT && CURRENT_EVENT.season === 'winter' ? CURRENT_EVENT : null, + text: t('questEvilSantaText'), + notes: t('questEvilSantaNotes'), + addlNotes: t('evilSantaAddlNotes'), + completion: t('questEvilSantaCompletion'), + value: 4, + category: 'pet', + boss: { + name: t('questEvilSantaBoss'), + hp: 300, + str: 1, + }, + drop: { + items: [ + { + type: 'mounts', + key: 'BearCub-Polar', + text: t('questEvilSantaDropBearCubPolarMount'), + }, + ], + gp: 20, + exp: 100, + }, + }, + evilsanta2: { + event: CURRENT_EVENT && CURRENT_EVENT.season === 'winter' ? CURRENT_EVENT : null, + text: t('questEvilSanta2Text'), + notes: t('questEvilSanta2Notes'), + addlNotes: t('evilSantaAddlNotes'), + completion: t('questEvilSanta2Completion'), + value: 4, + category: 'pet', + collect: { + tracks: { + text: t('questEvilSanta2CollectTracks'), + count: 20, + }, + branches: { + text: t('questEvilSanta2CollectBranches'), + count: 10, + }, + }, + drop: { + items: [ + { + type: 'pets', + key: 'BearCub-Polar', + text: t('questEvilSanta2DropBearCubPolarPet'), + }, + ], + gp: 20, + exp: 100, + }, + }, + // spring + egg: { + text: t('questEggHuntText'), + notes: t('questEggHuntNotes'), + completion: t('questEggHuntCompletion'), + value: 1, + category: 'pet', + event: CURRENT_EVENT && CURRENT_EVENT.season === 'spring' ? CURRENT_EVENT : null, + collect: { + plainEgg: { + text: t('questEggHuntCollectPlainEgg'), + count: 40, + }, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Egg', + text: t('questEggHuntDropPlainEgg'), + }, { + type: 'eggs', + key: 'Egg', + text: t('questEggHuntDropPlainEgg'), + }, { + type: 'eggs', + key: 'Egg', + text: t('questEggHuntDropPlainEgg'), + }, { + type: 'eggs', + key: 'Egg', + text: t('questEggHuntDropPlainEgg'), + }, { + type: 'eggs', + key: 'Egg', + text: t('questEggHuntDropPlainEgg'), + }, { + type: 'eggs', + key: 'Egg', + text: t('questEggHuntDropPlainEgg'), + }, { + type: 'eggs', + key: 'Egg', + text: t('questEggHuntDropPlainEgg'), + }, { + type: 'eggs', + key: 'Egg', + text: t('questEggHuntDropPlainEgg'), + }, { + type: 'eggs', + key: 'Egg', + text: t('questEggHuntDropPlainEgg'), + }, { + type: 'eggs', + key: 'Egg', + text: t('questEggHuntDropPlainEgg'), + }, + ], + gp: 0, + exp: 0, + }, + }, + waffle: { + text: t('questWaffleText'), + notes: t('questWaffleNotes'), + completion: t('questWaffleCompletion'), + value: 4, + category: 'hatchingPotion', + event: CURRENT_EVENT && CURRENT_EVENT.season === 'spring' ? CURRENT_EVENT : null, + boss: { + name: t('questWaffleBoss'), + hp: 500, + str: 2, + rage: { + title: t('questWaffleRageTitle'), + description: t('questWaffleRageDescription'), + value: 50, + progressDrain: 0.5, + effect: t('questWaffleRageEffect'), + }, + }, + drop: { + items: [ + { + type: 'hatchingPotions', + key: 'Dessert', + text: t('questWaffleDropDessertPotion'), + }, { + type: 'hatchingPotions', + key: 'Dessert', + text: t('questWaffleDropDessertPotion'), + }, { + type: 'hatchingPotions', + key: 'Dessert', + text: t('questWaffleDropDessertPotion'), + }, + ], + gp: 40, + exp: 500, + unlock: t('questWaffleUnlockText'), + }, + }, +}; + +export default QUEST_SEASONAL; diff --git a/website/common/script/content/constants/questTimeTravel.js b/website/common/script/content/constants/questTimeTravel.js new file mode 100644 index 0000000000..96367761a4 --- /dev/null +++ b/website/common/script/content/constants/questTimeTravel.js @@ -0,0 +1,120 @@ +import t from '../translation'; + +const QUEST_TIME_TRAVEL = { + robot: { + text: t('questRobotText'), + notes: t('questRobotNotes'), + completion: t('questRobotCompletion'), + value: 1, + category: 'timeTravelers', + canBuy () { + return false; + }, + collect: { + bolt: { + text: t('questRobotCollectBolts'), + count: 15, + }, + gear: { + text: t('questRobotCollectGears'), + count: 10, + }, + spring: { + text: t('questRobotCollectSprings'), + count: 10, + }, + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Robot', + text: t('questRobotDropRobotEgg'), + }, { + type: 'eggs', + key: 'Robot', + text: t('questRobotDropRobotEgg'), + }, { + type: 'eggs', + key: 'Robot', + text: t('questRobotDropRobotEgg'), + }, + ], + gp: 40, + exp: 75, + unlock: t('questRobotUnlockText'), + }, + }, + solarSystem: { + text: t('questSolarSystemText'), + notes: t('questSolarSystemNotes'), + completion: t('questSolarSystemCompletion'), + value: 1, + category: 'timeTravelers', + canBuy () { + return false; + }, + boss: { + name: t('questSolarSystemBoss'), + hp: 1500, + str: 2.5, + }, + drop: { + items: [ + { + type: 'hatchingPotions', + key: 'SolarSystem', + text: t('questSolarSystemDropSolarSystemPotion'), + }, { + type: 'hatchingPotions', + key: 'SolarSystem', + text: t('questSolarSystemDropSolarSystemPotion'), + }, { + type: 'hatchingPotions', + key: 'SolarSystem', + text: t('questSolarSystemDropSolarSystemPotion'), + }, + ], + gp: 90, + exp: 900, + unlock: t('questSolarSystemUnlockText'), + }, + }, + windup: { + text: t('questWindupText'), + notes: t('questWindupNotes'), + completion: t('questWindupCompletion'), + value: 1, + category: 'timeTravelers', + canBuy () { + return false; + }, + boss: { + name: t('questWindupBoss'), + hp: 1000, + str: 1, + }, + drop: { + items: [ + { + type: 'hatchingPotions', + key: 'Windup', + text: t('questWindupDropWindupPotion'), + }, { + type: 'hatchingPotions', + key: 'Windup', + text: t('questWindupDropWindupPotion'), + }, { + type: 'hatchingPotions', + key: 'Windup', + text: t('questWindupDropWindupPotion'), + }, + ], + gp: 50, + exp: 425, + unlock: t('questWindupUnlockText'), + }, + }, +}; + +export default QUEST_TIME_TRAVEL; diff --git a/website/common/script/content/constants/questWorld.js b/website/common/script/content/constants/questWorld.js new file mode 100644 index 0000000000..13a68851e5 --- /dev/null +++ b/website/common/script/content/constants/questWorld.js @@ -0,0 +1,418 @@ +import t from '../translation'; + +const QUEST_WORLD = { + bewilder: { + text: t('questBewilderText'), + notes: t('questBewilderNotes'), + completion: t('questBewilderCompletion'), + completionChat: t('questBewilderCompletionChat'), + value: 0, + canBuy () { + return false; + }, + category: 'world', + boss: { + name: t('questBewilderText'), + hp: 20000000, + str: 1, + def: 1, + rage: { + title: t('questBewilderBossRageTitle'), + description: t('questBewilderBossRageDescription'), + value: 800000, + bailey: t('questBewilderBossRageBailey'), + stables: t('questBewilderBossRageStables'), + market: t('questBewilderBossRageMarket'), + }, + }, + drop: { + items: [ + { + type: 'pets', + key: 'MagicalBee-Base', + text: t('questBewilderDropBumblebeePet'), + }, { + type: 'mounts', + key: 'MagicalBee-Base', + text: t('questBewilderDropBumblebeeMount'), + }, { + type: 'food', + key: 'Meat', + text: t('foodMeat'), + }, { + type: 'food', + key: 'Milk', + text: t('foodMilk'), + }, { + type: 'food', + key: 'Potatoe', + text: t('foodPotatoe'), + }, { + type: 'food', + key: 'Strawberry', + text: t('foodStrawberry'), + }, { + type: 'food', + key: 'Chocolate', + text: t('foodChocolate'), + }, { + type: 'food', + key: 'Fish', + text: t('foodFish'), + }, { + type: 'food', + key: 'RottenMeat', + text: t('foodRottenMeat'), + }, { + type: 'food', + key: 'CottonCandyPink', + text: t('foodCottonCandyPink'), + }, { + type: 'food', + key: 'CottonCandyBlue', + text: t('foodCottonCandyBlue'), + }, { + type: 'food', + key: 'Honey', + text: t('foodHoney'), + }, + ], + gp: 0, + exp: 0, + }, + }, + burnout: { + text: t('questBurnoutText'), + notes: t('questBurnoutNotes'), + completion: t('questBurnoutCompletion'), + completionChat: t('questBurnoutCompletionChat'), + value: 0, + canBuy () { + return false; + }, + category: 'world', + boss: { + name: t('questBurnoutBoss'), + hp: 11000000, + str: 2.5, + def: 1, + rage: { + title: t('questBurnoutBossRageTitle'), + description: t('questBurnoutBossRageDescription'), + value: 1000000, + quests: t('questBurnoutBossRageQuests'), + seasonalShop: t('questBurnoutBossRageSeasonalShop'), + tavern: t('questBurnoutBossRageTavern'), + }, + }, + drop: { + items: [ + { + type: 'pets', + key: 'Phoenix-Base', + text: t('questBurnoutDropPhoenixPet'), + }, { + type: 'mounts', + key: 'Phoenix-Base', + text: t('questBurnoutDropPhoenixMount'), + }, { + type: 'food', + key: 'Candy_Base', + text: t('foodCandyBase'), + }, { + type: 'food', + key: 'Candy_White', + text: t('foodCandyWhite'), + }, { + type: 'food', + key: 'Candy_Desert', + text: t('foodCandyDesert'), + }, { + type: 'food', + key: 'Candy_Red', + text: t('foodCandyRed'), + }, { + type: 'food', + key: 'Candy_Shade', + text: t('foodCandyShade'), + }, { + type: 'food', + key: 'Candy_Skeleton', + text: t('foodCandySkeleton'), + }, { + type: 'food', + key: 'Candy_Zombie', + text: t('foodCandyZombie'), + }, { + type: 'food', + key: 'Candy_CottonCandyPink', + text: t('foodCandyCottonCandyPink'), + }, { + type: 'food', + key: 'Candy_CottonCandyBlue', + text: t('foodCandyCottonCandyBlue'), + }, { + type: 'food', + key: 'Candy_Golden', + text: t('foodCandyGolden'), + }, + ], + gp: 0, + exp: 0, + }, + }, + dilatory: { + text: t('questDilatoryText'), + notes: t('questDilatoryNotes'), + completion: t('questDilatoryCompletion'), + value: 0, + canBuy () { + return false; + }, + category: 'world', + boss: { + name: t('questDilatoryBoss'), + hp: 5000000, + str: 1, + def: 1, + rage: { + title: t('questDilatoryBossRageTitle'), + description: t('questDilatoryBossRageDescription'), + value: 4000000, + tavern: t('questDilatoryBossRageTavern'), + stables: t('questDilatoryBossRageStables'), + market: t('questDilatoryBossRageMarket'), + }, + }, + drop: { + items: [ + { + type: 'pets', + key: 'MantisShrimp-Base', + text: t('questDilatoryDropMantisShrimpPet'), + }, { + type: 'mounts', + key: 'MantisShrimp-Base', + text: t('questDilatoryDropMantisShrimpMount'), + }, { + type: 'food', + key: 'Meat', + text: t('foodMeat'), + }, { + type: 'food', + key: 'Milk', + text: t('foodMilk'), + }, { + type: 'food', + key: 'Potatoe', + text: t('foodPotatoe'), + }, { + type: 'food', + key: 'Strawberry', + text: t('foodStrawberry'), + }, { + type: 'food', + key: 'Chocolate', + text: t('foodChocolate'), + }, { + type: 'food', + key: 'Fish', + text: t('foodFish'), + }, { + type: 'food', + key: 'RottenMeat', + text: t('foodRottenMeat'), + }, { + type: 'food', + key: 'CottonCandyPink', + text: t('foodCottonCandyPink'), + }, { + type: 'food', + key: 'CottonCandyBlue', + text: t('foodCottonCandyBlue'), + }, { + type: 'food', + key: 'Honey', + text: t('foodHoney'), + }, + ], + gp: 0, + exp: 0, + }, + }, + dysheartener: { + text: t('questDysheartenerText'), + notes: t('questDysheartenerNotes'), + completion: t('questDysheartenerCompletion'), + completionChat: t('questDysheartenerCompletionChat'), + value: 0, + canBuy () { + return false; + }, + category: 'world', + boss: { + name: t('questDysheartenerText'), + hp: 17000000, + str: 1.25, + def: 1, + rage: { + title: t('questDysheartenerBossRageTitle'), + description: t('questDysheartenerBossRageDescription'), + value: 500000, + seasonalShop: t('questDysheartenerBossRageSeasonal'), + market: t('questDysheartenerBossRageMarket'), + quests: t('questDysheartenerBossRageQuests'), + }, + }, + colors: { + dark: '#410F2A', + medium: '#5C1130', + light: '#931F4D', + extralight: '#DC4069', + }, + drop: { + items: [ + { + type: 'pets', + key: 'Hippogriff-Hopeful', + text: t('questDysheartenerDropHippogriffPet'), + }, { + type: 'mounts', + key: 'Hippogriff-Hopeful', + text: t('questDysheartenerDropHippogriffMount'), + }, { + type: 'food', + key: 'Cake_Base', + text: t('foodCakeBase'), + }, { + type: 'food', + key: 'Candy_White', + text: t('foodCandyWhite'), + }, { + type: 'food', + key: 'Cake_Desert', + text: t('foodCakeDesert'), + }, { + type: 'food', + key: 'Candy_Red', + text: t('foodCandyRed'), + }, { + type: 'food', + key: 'Cake_Shade', + text: t('foodCakeShade'), + }, { + type: 'food', + key: 'Candy_Skeleton', + text: t('foodCandySkeleton'), + }, { + type: 'food', + key: 'Cake_Zombie', + text: t('foodCakeZombie'), + }, { + type: 'food', + key: 'Candy_CottonCandyPink', + text: t('foodCandyCottonCandyPink'), + }, { + type: 'food', + key: 'Candy_CottonCandyBlue', + text: t('foodCandyCottonCandyBlue'), + }, { + type: 'food', + key: 'Cake_Golden', + text: t('foodCakeGolden'), + }, + ], + gp: 0, + exp: 0, + }, + }, + stressbeast: { + text: t('questStressbeastText'), + notes: t('questStressbeastNotes'), + completion: t('questStressbeastCompletion'), + completionChat: t('questStressbeastCompletionChat'), + value: 0, + canBuy () { + return false; + }, + category: 'world', + boss: { + name: t('questStressbeastBoss'), + hp: 2750000, + str: 1, + def: 1, + rage: { + title: t('questStressbeastBossRageTitle'), + description: t('questStressbeastBossRageDescription'), + value: 1450000, + healing: 0.3, + stables: t('questStressbeastBossRageStables'), + bailey: t('questStressbeastBossRageBailey'), + guide: t('questStressbeastBossRageGuide'), + }, + desperation: { + threshold: 500000, + str: 3.5, + def: 2, + text: t('questStressbeastDesperation'), + }, + }, + drop: { + items: [ + { + type: 'pets', + key: 'Mammoth-Base', + text: t('questStressbeastDropMammothPet'), + }, { + type: 'mounts', + key: 'Mammoth-Base', + text: t('questStressbeastDropMammothMount'), + }, { + type: 'food', + key: 'Meat', + text: t('foodMeat'), + }, { + type: 'food', + key: 'Milk', + text: t('foodMilk'), + }, { + type: 'food', + key: 'Potatoe', + text: t('foodPotatoe'), + }, { + type: 'food', + key: 'Strawberry', + text: t('foodStrawberry'), + }, { + type: 'food', + key: 'Chocolate', + text: t('foodChocolate'), + }, { + type: 'food', + key: 'Fish', + text: t('foodFish'), + }, { + type: 'food', + key: 'RottenMeat', + text: t('foodRottenMeat'), + }, { + type: 'food', + key: 'CottonCandyPink', + text: t('foodCottonCandyPink'), + }, { + type: 'food', + key: 'CottonCandyBlue', + text: t('foodCottonCandyBlue'), + }, { + type: 'food', + key: 'Honey', + text: t('foodHoney'), + }, + ], + gp: 0, + exp: 0, + }, + }, +}; + +export default QUEST_WORLD; diff --git a/website/common/script/content/quests.js b/website/common/script/content/quests.js index b72ac82754..11535a6816 100644 --- a/website/common/script/content/quests.js +++ b/website/common/script/content/quests.js @@ -1,3988 +1,47 @@ import defaults from 'lodash/defaults'; import each from 'lodash/each'; -import find from 'lodash/find'; -import moment from 'moment'; +// import find from 'lodash/find'; +// import moment from 'moment'; import sortBy from 'lodash/sortBy'; import t from './translation'; import { - EVENTS, USER_CAN_OWN_QUEST_CATEGORIES, - // future constants for quest variable - // QUEST_GENERIC - // QUEST_SERIES, - // QUEST_MASTERCLASSER, - // QUEST_PETS, - // QUESTS_HATCHING_POTIONS, - // QUESTS_TIME_TRAVELERS + QUEST_GENERIC, + QUEST_SERIES, + QUEST_MASTERCLASSER, + QUEST_SEASONAL, + QUEST_PETS, + QUEST_POTIONS, + QUEST_TIME_TRAVEL, + QUEST_WORLD, } from './constants'; -const CURRENT_EVENT = find( - EVENTS, event => moment().isBetween(event.start, event.end) && Boolean(event.season), -); const userCanOwnQuestCategories = USER_CAN_OWN_QUEST_CATEGORIES; +const questGeneric = QUEST_GENERIC; +const questSeries = QUEST_SERIES; +const questMasterclasser = QUEST_MASTERCLASSER; +const questSeasonal = QUEST_SEASONAL; +const questPets = QUEST_PETS; +const questPotions = QUEST_POTIONS; +const questTimeTravel = QUEST_TIME_TRAVEL; +const questWorld = QUEST_WORLD; -// separatihg & sorting quests by type -- -// generic unlockable, chain, masterclasser, seasonal, pet, potion, time travelers, world -// with intent of eventually refactoring - -const quests = { - // generic unlockable quests - basilist: { - text: t('questBasilistText'), - notes: t('questBasilistNotes'), - group: 'questGroupEarnable', - completion: t('questBasilistCompletion'), - goldValue: 100, - category: 'unlockable', - unlockCondition: { - condition: 'party invite', - text: t('inviteFriends'), - }, - boss: { - name: t('questBasilistBoss'), - hp: 100, - str: 0.5, - }, - drop: { - gp: 8, - exp: 42, - }, - }, - dustbunnies: { - text: t('questDustBunniesText'), - notes: t('questDustBunniesNotes'), - group: 'questGroupEarnable', - completion: t('questDustBunniesCompletion'), - value: 1, - category: 'unlockable', - boss: { - name: t('questDustBunniesBoss'), - hp: 100, - str: 0.5, - }, - drop: { - gp: 8, - exp: 42, - }, - }, - // series quests - atom1: { - text: t('questAtom1Text'), - notes: t('questAtom1Notes'), - completion: t('questAtom1Completion'), - group: 'questGroupAtom', - value: 4, - lvl: 15, - category: 'unlockable', - collect: { - soapBars: { - text: t('questAtom1CollectSoapBars'), - count: 20, - }, - }, - drop: { - items: [ - { - type: 'quests', - key: 'atom2', - text: t('questAtom1Drop'), - onlyOwner: true, - }, - ], - gp: 7, - exp: 50, - }, - }, - atom2: { - text: t('questAtom2Text'), - notes: t('questAtom2Notes'), - completion: t('questAtom2Completion'), - group: 'questGroupAtom', - previous: 'atom1', - prereqQuests: [ - 'atom1', - ], - value: 4, - lvl: 15, - category: 'unlockable', - boss: { - name: t('questAtom2Boss'), - hp: 300, - str: 1, - }, - drop: { - items: [ - { - type: 'quests', - key: 'atom3', - text: t('questAtom2Drop'), - onlyOwner: true, - }, - ], - gp: 20, - exp: 100, - }, - }, - atom3: { - text: t('questAtom3Text'), - notes: t('questAtom3Notes'), - group: 'questGroupAtom', - previous: 'atom2', - prereqQuests: [ - 'atom1', - 'atom2', - ], - completion: t('questAtom3Completion'), - value: 4, - lvl: 15, - category: 'unlockable', - boss: { - name: t('questAtom3Boss'), - hp: 800, - str: 1.5, - }, - drop: { - items: [ - { - type: 'gear', - key: 'head_special_2', - text: t('headSpecial2Text'), - }, { - type: 'hatchingPotions', - key: 'Base', - text: t('questAtom3DropPotion'), - }, { - type: 'hatchingPotions', - key: 'Base', - text: t('questAtom3DropPotion'), - }, - ], - gp: 25, - exp: 125, - }, - }, - goldenknight1: { - text: t('questGoldenknight1Text'), - notes: t('questGoldenknight1Notes'), - completion: t('questGoldenknight1Completion'), - group: 'questGroupGoldenknight', - value: 4, - lvl: 40, - category: 'unlockable', - collect: { - testimony: { - text: t('questGoldenknight1CollectTestimony'), - count: 60, - }, - }, - drop: { - items: [ - { - type: 'quests', - key: 'goldenknight2', - text: t('questGoldenknight1DropGoldenknight2Quest'), - onlyOwner: true, - }, - ], - gp: 15, - exp: 120, - }, - }, - goldenknight2: { - text: t('questGoldenknight2Text'), - notes: t('questGoldenknight2Notes'), - completion: t('questGoldenknight2Completion'), - group: 'questGroupGoldenknight', - value: 4, - previous: 'goldenknight1', - prereqQuests: [ - 'goldenknight1', - ], - lvl: 40, - category: 'unlockable', - boss: { - name: t('questGoldenknight2Boss'), - hp: 1000, - str: 3, - }, - drop: { - items: [ - { - type: 'quests', - key: 'goldenknight3', - text: t('questGoldenknight2DropGoldenknight3Quest'), - onlyOwner: true, - }, - ], - gp: 75, - exp: 750, - }, - }, - goldenknight3: { - text: t('questGoldenknight3Text'), - notes: t('questGoldenknight3Notes'), - group: 'questGroupGoldenknight', - completion: t('questGoldenknight3Completion'), - previous: 'goldenknight2', - prereqQuests: [ - 'goldenknight1', - 'goldenknight2', - ], - value: 4, - lvl: 40, - category: 'unlockable', - boss: { - name: t('questGoldenknight3Boss'), - hp: 1700, - str: 3.5, - }, - drop: { - items: [ - { - type: 'food', - key: 'Honey', - text: t('questGoldenknight3DropHoney'), - }, { - type: 'food', - key: 'Honey', - text: t('questGoldenknight3DropHoney'), - }, { - type: 'food', - key: 'Honey', - text: t('questGoldenknight3DropHoney'), - }, { - type: 'hatchingPotions', - key: 'Golden', - text: t('questGoldenknight3DropGoldenPotion'), - }, { - type: 'hatchingPotions', - key: 'Golden', - text: t('questGoldenknight3DropGoldenPotion'), - }, { - type: 'gear', - key: 'shield_special_goldenknight', - text: t('questGoldenknight3DropWeapon'), - }, - ], - gp: 900, - exp: 1500, - }, - }, - moon1: { - text: t('questMoon1Text'), - notes: t('questMoon1Notes'), - group: 'questGroupMoon', - completion: t('questMoon1Completion'), - value: 4, - category: 'unlockable', - unlockCondition: { - condition: 'login reward', - incentiveThreshold: 7, - text: t('loginReward', { count: 7 }), - }, - collect: { - shard: { - text: t('questMoon1CollectShards'), - count: 20, - }, - }, - drop: { - items: [ - { - type: 'gear', - key: 'head_special_lunarWarriorHelm', - text: t('questMoon1DropHeadgear'), - }, - ], - gp: 7, - exp: 50, - }, - }, - moon2: { - text: t('questMoon2Text'), - notes: t('questMoon2Notes'), - group: 'questGroupMoon', - completion: t('questMoon2Completion'), - previous: 'moon1', - prereqQuests: [ - 'moon1', - ], - value: 4, - category: 'unlockable', - unlockCondition: { - condition: 'login reward', - incentiveThreshold: 22, - text: t('loginReward', { count: 22 }), - }, - boss: { - name: t('questMoon2Boss'), - hp: 100, - str: 1.5, - }, - drop: { - items: [ - { - type: 'gear', - key: 'armor_special_lunarWarriorArmor', - text: t('questMoon2DropArmor'), - }, - ], - gp: 37, - exp: 275, - }, - }, - moon3: { - text: t('questMoon3Text'), - notes: t('questMoon3Notes'), - group: 'questGroupMoon', - completion: t('questMoon3Completion'), - previous1: 'moon2', - prereqQuests: [ - 'moon1', - 'moon2', - ], - value: 4, - category: 'unlockable', - unlockCondition: { - condition: 'login reward', - incentiveThreshold: 40, - text: t('loginReward', { count: 40 }), - }, - boss: { - name: t('questMoon3Boss'), - hp: 1000, - str: 2, - }, - drop: { - items: [ - { - type: 'gear', - key: 'weapon_special_lunarScythe', - text: t('questMoon3DropWeapon'), - }, - ], - gp: 67, - exp: 650, - }, - }, - moonstone1: { - text: t('questMoonstone1Text'), - notes: t('questMoonstone1Notes'), - completion: t('questMoonstone1Completion'), - group: 'questGroupMoonstone', - value: 4, - lvl: 60, - category: 'unlockable', - collect: { - moonstone: { - text: t('questMoonstone1CollectMoonstone'), - count: 100, - }, - }, - drop: { - items: [ - { - type: 'quests', - key: 'moonstone2', - text: t('questMoonstone1DropMoonstone2Quest'), - onlyOwner: true, - }, - ], - gp: 50, - exp: 100, - }, - }, - moonstone2: { - text: t('questMoonstone2Text'), - notes: t('questMoonstone2Notes'), - completion: t('questMoonstone2Completion'), - group: 'questGroupMoonstone', - value: 4, - lvl: 60, - previous: 'moonstone1', - prereqQuests: [ - 'moonstone1', - ], - category: 'unlockable', - boss: { - name: t('questMoonstone2Boss'), - hp: 1500, - str: 3, - }, - drop: { - items: [ - { - type: 'quests', - key: 'moonstone3', - text: t('questMoonstone2DropMoonstone3Quest'), - onlyOwner: true, - }, - ], - gp: 500, - exp: 1000, - }, - }, - moonstone3: { - text: t('questMoonstone3Text'), - notes: t('questMoonstone3Notes'), - group: 'questGroupMoonstone', - completion: t('questMoonstone3Completion'), - previous: 'moonstone2', - prereqQuests: [ - 'moonstone1', - 'moonstone2', - ], - value: 4, - lvl: 60, - category: 'unlockable', - boss: { - name: t('questMoonstone3Boss'), - hp: 2000, - str: 3.5, - }, - drop: { - items: [ - { - type: 'gear', - key: 'armor_special_2', - text: t('armorSpecial2Text'), - }, { - type: 'food', - key: 'RottenMeat', - text: t('questMoonstone3DropRottenMeat'), - }, { - type: 'food', - key: 'RottenMeat', - text: t('questMoonstone3DropRottenMeat'), - }, { - type: 'food', - key: 'RottenMeat', - text: t('questMoonstone3DropRottenMeat'), - }, { - type: 'food', - key: 'RottenMeat', - text: t('questMoonstone3DropRottenMeat'), - }, { - type: 'food', - key: 'RottenMeat', - text: t('questMoonstone3DropRottenMeat'), - }, { - type: 'hatchingPotions', - key: 'Zombie', - text: t('questMoonstone3DropZombiePotion'), - }, { - type: 'hatchingPotions', - key: 'Zombie', - text: t('questMoonstone3DropZombiePotion'), - }, { - type: 'hatchingPotions', - key: 'Zombie', - text: t('questMoonstone3DropZombiePotion'), - }, - ], - gp: 900, - exp: 1500, - }, - }, - vice1: { - text: t('questVice1Text'), - notes: t('questVice1Notes'), - completion: t('questVice1Completion'), - group: 'questGroupVice', - value: 4, - lvl: 30, - category: 'unlockable', - boss: { - name: t('questVice1Boss'), - hp: 750, - str: 1.5, - }, - drop: { - items: [ - { - type: 'quests', - key: 'vice2', - text: t('questVice1DropVice2Quest'), - onlyOwner: true, - }, - ], - gp: 20, - exp: 100, - }, - }, - vice2: { - text: t('questVice2Text'), - notes: t('questVice2Notes'), - completion: t('questVice2Completion'), - group: 'questGroupVice', - value: 4, - lvl: 30, - category: 'unlockable', - previous: 'vice1', - prereqQuests: [ - 'vice1', - ], - collect: { - lightCrystal: { - text: t('questVice2CollectLightCrystal'), - count: 30, - }, - }, - drop: { - items: [ - { - type: 'quests', - key: 'vice3', - text: t('questVice2DropVice3Quest'), - onlyOwner: true, - }, - ], - gp: 20, - exp: 75, - }, - }, - vice3: { - text: t('questVice3Text'), - notes: t('questVice3Notes'), - group: 'questGroupVice', - completion: t('questVice3Completion'), - previous: 'vice2', - prereqQuests: [ - 'vice1', - 'vice2', - ], - value: 4, - lvl: 30, - category: 'unlockable', - boss: { - name: t('questVice3Boss'), - hp: 1500, - str: 3, - }, - drop: { - items: [ - { - type: 'gear', - key: 'weapon_special_2', - text: t('questVice3DropWeaponSpecial2'), - }, { - type: 'eggs', - key: 'Dragon', - text: t('questVice3DropDragonEgg'), - }, { - type: 'eggs', - key: 'Dragon', - text: t('questVice3DropDragonEgg'), - }, { - type: 'hatchingPotions', - key: 'Shade', - text: t('questVice3DropShadeHatchingPotion'), - }, { - type: 'hatchingPotions', - key: 'Shade', - text: t('questVice3DropShadeHatchingPotion'), - }, - ], - gp: 100, - exp: 1000, - }, - }, - // masterclasser quests - dilatoryDistress1: { - text: t('questDilatoryDistress1Text'), - notes: t('questDilatoryDistress1Notes'), - group: 'questGroupDilatoryDistress', - completion: t('questDilatoryDistress1Completion'), - value: 4, - goldValue: 200, - category: 'gold', - collect: { - fireCoral: { - text: t('questDilatoryDistress1CollectFireCoral'), - count: 20, - }, - blueFins: { - text: t('questDilatoryDistress1CollectBlueFins'), - count: 20, - }, - }, - drop: { - items: [ - { - type: 'gear', - key: 'armor_special_finnedOceanicArmor', - text: t('questDilatoryDistress1DropArmor'), - }, - ], - gp: 0, - exp: 75, - }, - }, - dilatoryDistress2: { - text: t('questDilatoryDistress2Text'), - notes: t('questDilatoryDistress2Notes'), - group: 'questGroupDilatoryDistress', - completion: t('questDilatoryDistress2Completion'), - previous: 'dilatoryDistress1', - prereqQuests: [ - 'dilatoryDistress1', - ], - value: 4, - goldValue: 300, - category: 'gold', - boss: { - name: t('questDilatoryDistress2Boss'), - hp: 500, - rage: { - title: t('questDilatoryDistress2RageTitle'), - description: t('questDilatoryDistress2RageDescription'), - value: 50, - healing: 0.3, - effect: t('questDilatoryDistress2RageEffect'), - }, - }, - drop: { - items: [ - { - type: 'hatchingPotions', - key: 'Skeleton', - text: t('questDilatoryDistress2DropSkeletonPotion'), - }, { - type: 'hatchingPotions', - key: 'CottonCandyBlue', - text: t('questDilatoryDistress2DropCottonCandyBluePotion'), - }, { - type: 'gear', - key: 'head_special_fireCoralCirclet', - text: t('questDilatoryDistress2DropHeadgear'), - }, - ], - gp: 0, - exp: 500, - }, - }, - dilatoryDistress3: { - text: t('questDilatoryDistress3Text'), - notes: t('questDilatoryDistress3Notes'), - group: 'questGroupDilatoryDistress', - completion: t('questDilatoryDistress3Completion'), - previous: 'dilatoryDistress2', - prereqQuests: [ - 'dilatoryDistress1', - 'dilatoryDistress2', - ], - value: 4, - goldValue: 400, - category: 'gold', - boss: { - name: t('questDilatoryDistress3Boss'), - hp: 1000, - str: 2, - }, - drop: { - items: [ - { - type: 'food', - key: 'Fish', - text: t('questDilatoryDistress3DropFish'), - }, { - type: 'food', - key: 'Fish', - text: t('questDilatoryDistress3DropFish'), - }, { - type: 'food', - key: 'Fish', - text: t('questDilatoryDistress3DropFish'), - }, { - type: 'gear', - key: 'weapon_special_tridentOfCrashingTides', - text: t('questDilatoryDistress3DropWeapon'), - }, { - type: 'gear', - key: 'shield_special_moonpearlShield', - text: t('questDilatoryDistress3DropShield'), - }, - ], - gp: 0, - exp: 650, - }, - }, - mayhemMistiflying1: { - text: t('questMayhemMistiflying1Text'), - notes: t('questMayhemMistiflying1Notes'), - group: 'questGroupMayhemMistiflying', - completion: t('questMayhemMistiflying1Completion'), - value: 4, - goldValue: 200, - category: 'gold', - boss: { - name: t('questMayhemMistiflying1Boss'), - hp: 500, - rage: { - title: t('questMayhemMistiflying1RageTitle'), - description: t('questMayhemMistiflying1RageDescription'), - value: 50, - healing: 0.3, - effect: t('questMayhemMistiflying1RageEffect'), - }, - }, - drop: { - items: [ - { - type: 'hatchingPotions', - key: 'Skeleton', - text: t('questMayhemMistiflying1DropSkeletonPotion'), - }, { - type: 'hatchingPotions', - key: 'White', - text: t('questMayhemMistiflying1DropWhitePotion'), - }, { - type: 'gear', - key: 'armor_special_roguishRainbowMessengerRobes', - text: t('questMayhemMistiflying1DropArmor'), - }, - ], - gp: 0, - exp: 500, - }, - }, - mayhemMistiflying2: { - text: t('questMayhemMistiflying2Text'), - notes: t('questMayhemMistiflying2Notes'), - group: 'questGroupMayhemMistiflying', - completion: t('questMayhemMistiflying2Completion'), - previous: 'mayhemMistiflying1', - prereqQuests: [ - 'mayhemMistiflying1', - ], - value: 4, - goldValue: 300, - category: 'gold', - collect: { - mistifly1: { - text: t('questMayhemMistiflying2CollectRedMistiflies'), - count: 25, - }, - mistifly2: { - text: t('questMayhemMistiflying2CollectBlueMistiflies'), - count: 15, - }, - mistifly3: { - text: t('questMayhemMistiflying2CollectGreenMistiflies'), - count: 10, - }, - }, - drop: { - items: [ - { - type: 'gear', - key: 'head_special_roguishRainbowMessengerHood', - text: t('questMayhemMistiflying2DropHeadgear'), - }, - ], - gp: 0, - exp: 75, - }, - }, - mayhemMistiflying3: { - text: t('questMayhemMistiflying3Text'), - notes: t('questMayhemMistiflying3Notes'), - group: 'questGroupMayhemMistiflying', - completion: t('questMayhemMistiflying3Completion'), - previous: 'mayhemMistiflying2', - prereqQuests: [ - 'mayhemMistiflying1', - 'mayhemMistiflying2', - ], - value: 4, - goldValue: 400, - category: 'gold', - boss: { - name: t('questMayhemMistiflying3Boss'), - hp: 1000, - str: 2, - }, - drop: { - items: [ - { - type: 'food', - key: 'CottonCandyPink', - text: t('questMayhemMistiflying3DropPinkCottonCandy'), - }, { - type: 'food', - key: 'CottonCandyPink', - text: t('questMayhemMistiflying3DropPinkCottonCandy'), - }, { - type: 'food', - key: 'CottonCandyPink', - text: t('questMayhemMistiflying3DropPinkCottonCandy'), - }, { - type: 'gear', - key: 'weapon_special_roguishRainbowMessage', - text: t('questMayhemMistiflying3DropWeapon'), - }, { - type: 'gear', - key: 'shield_special_roguishRainbowMessage', - text: t('questMayhemMistiflying3DropShield'), - }, - ], - gp: 0, - exp: 650, - }, - }, - stoikalmCalamity1: { - text: t('questStoikalmCalamity1Text'), - notes: t('questStoikalmCalamity1Notes'), - group: 'questGroupStoikalmCalamity', - completion: t('questStoikalmCalamity1Completion'), - value: 4, - goldValue: 200, - category: 'gold', - boss: { - name: t('questStoikalmCalamity1Boss'), - hp: 500, - rage: { - title: t('questStoikalmCalamity1RageTitle'), - description: t('questStoikalmCalamity1RageDescription'), - value: 50, - healing: 0.3, - effect: t('questStoikalmCalamity1RageEffect'), - }, - }, - drop: { - items: [ - { - type: 'hatchingPotions', - key: 'Skeleton', - text: t('questStoikalmCalamity1DropSkeletonPotion'), - }, { - type: 'hatchingPotions', - key: 'Desert', - text: t('questStoikalmCalamity1DropDesertPotion'), - }, { - type: 'gear', - key: 'armor_special_mammothRiderArmor', - text: t('questStoikalmCalamity1DropArmor'), - }, - ], - gp: 0, - exp: 500, - }, - }, - stoikalmCalamity2: { - text: t('questStoikalmCalamity2Text'), - notes: t('questStoikalmCalamity2Notes'), - group: 'questGroupStoikalmCalamity', - completion: t('questStoikalmCalamity2Completion'), - previous: 'stoikalmCalamity1', - prereqQuests: [ - 'stoikalmCalamity1', - ], - value: 4, - goldValue: 300, - category: 'gold', - collect: { - icicleCoin: { - text: t('questStoikalmCalamity2CollectIcicleCoins'), - count: 40, - }, - }, - drop: { - items: [ - { - type: 'gear', - key: 'head_special_mammothRiderHelm', - text: t('questStoikalmCalamity2DropHeadgear'), - }, - ], - gp: 0, - exp: 75, - }, - }, - stoikalmCalamity3: { - text: t('questStoikalmCalamity3Text'), - notes: t('questStoikalmCalamity3Notes'), - group: 'questGroupStoikalmCalamity', - completion: t('questStoikalmCalamity3Completion'), - previous: 'stoikalmCalamity2', - prereqQuests: [ - 'stoikalmCalamity1', - 'stoikalmCalamity2', - ], - value: 4, - goldValue: 400, - category: 'gold', - boss: { - name: t('questStoikalmCalamity3Boss'), - hp: 1000, - str: 2, - }, - drop: { - items: [ - { - type: 'food', - key: 'CottonCandyBlue', - text: t('questStoikalmCalamity3DropBlueCottonCandy'), - }, { - type: 'food', - key: 'CottonCandyBlue', - text: t('questStoikalmCalamity3DropBlueCottonCandy'), - }, { - type: 'food', - key: 'CottonCandyBlue', - text: t('questStoikalmCalamity3DropBlueCottonCandy'), - }, { - type: 'gear', - key: 'weapon_special_mammothRiderSpear', - text: t('questStoikalmCalamity3DropWeapon'), - }, { - type: 'gear', - key: 'shield_special_mammothRiderHorn', - text: t('questStoikalmCalamity3DropShield'), - }, - ], - gp: 0, - exp: 650, - }, - }, - taskwoodsTerror1: { - text: t('questTaskwoodsTerror1Text'), - notes: t('questTaskwoodsTerror1Notes'), - group: 'questGroupTaskwoodsTerror', - completion: t('questTaskwoodsTerror1Completion'), - value: 4, - goldValue: 200, - category: 'gold', - boss: { - name: t('questTaskwoodsTerror1Boss'), - hp: 500, - rage: { - title: t('questTaskwoodsTerror1RageTitle'), - description: t('questTaskwoodsTerror1RageDescription'), - value: 50, - healing: 0.3, - effect: t('questTaskwoodsTerror1RageEffect'), - }, - }, - drop: { - items: [ - { - type: 'hatchingPotions', - key: 'Skeleton', - text: t('questTaskwoodsTerror1DropSkeletonPotion'), - }, { - type: 'hatchingPotions', - key: 'Red', - text: t('questTaskwoodsTerror1DropRedPotion'), - }, { - type: 'gear', - key: 'head_special_pyromancersTurban', - text: t('questTaskwoodsTerror1DropHeadgear'), - }, - ], - gp: 0, - exp: 500, - }, - }, - taskwoodsTerror2: { - text: t('questTaskwoodsTerror2Text'), - notes: t('questTaskwoodsTerror2Notes'), - group: 'questGroupTaskwoodsTerror', - completion: t('questTaskwoodsTerror2Completion'), - previous: 'taskwoodsTerror1', - prereqQuests: [ - 'taskwoodsTerror1', - ], - value: 4, - goldValue: 300, - category: 'gold', - collect: { - pixie: { - text: t('questTaskwoodsTerror2CollectPixies'), - count: 25, - }, - brownie: { - text: t('questTaskwoodsTerror2CollectBrownies'), - count: 15, - }, - dryad: { - text: t('questTaskwoodsTerror2CollectDryads'), - count: 10, - }, - }, - drop: { - items: [ - { - type: 'gear', - key: 'armor_special_pyromancersRobes', - text: t('questTaskwoodsTerror2DropArmor'), - }, - ], - gp: 0, - exp: 75, - }, - }, - taskwoodsTerror3: { - text: t('questTaskwoodsTerror3Text'), - notes: t('questTaskwoodsTerror3Notes'), - group: 'questGroupTaskwoodsTerror', - completion: t('questTaskwoodsTerror3Completion'), - previous: 'taskwoodsTerror2', - prereqQuests: [ - 'taskwoodsTerror1', - 'taskwoodsTerror2', - ], - value: 4, - goldValue: 400, - category: 'gold', - boss: { - name: t('questTaskwoodsTerror3Boss'), - hp: 1000, - str: 2, - }, - drop: { - items: [ - { - type: 'food', - key: 'Strawberry', - text: t('questTaskwoodsTerror3DropStrawberry'), - }, { - type: 'food', - key: 'Strawberry', - text: t('questTaskwoodsTerror3DropStrawberry'), - }, { - type: 'food', - key: 'Strawberry', - text: t('questTaskwoodsTerror3DropStrawberry'), - }, { - type: 'gear', - key: 'weapon_special_taskwoodsLantern', - text: t('questTaskwoodsTerror3DropWeapon'), - }, - ], - gp: 0, - exp: 650, - }, - }, - // final quest series in Masterclasser - lostMasterclasser1: { - text: t('questLostMasterclasser1Text'), - notes: t('questLostMasterclasser1Notes'), - group: 'questGroupLostMasterclasser', - completion: t('questLostMasterclasser1Completion'), - value: 4, - prereqQuests: [ - 'dilatoryDistress1', - 'dilatoryDistress2', - 'dilatoryDistress3', - 'mayhemMistiflying1', - 'mayhemMistiflying2', - 'mayhemMistiflying3', - 'stoikalmCalamity1', - 'stoikalmCalamity2', - 'stoikalmCalamity3', - 'taskwoodsTerror1', - 'taskwoodsTerror2', - 'taskwoodsTerror3', - ], - goldValue: 400, - category: 'gold', - collect: { - ancientTome: { - text: t('questLostMasterclasser1CollectAncientTomes'), - count: 40, - }, - forbiddenTome: { - text: t('questLostMasterclasser1CollectForbiddenTomes'), - count: 40, - }, - hiddenTome: { - text: t('questLostMasterclasser1CollectHiddenTomes'), - count: 40, - }, - }, - drop: { - items: [ - { - type: 'food', - key: 'Potatoe', - text: t('foodPotatoe'), - }, { - type: 'food', - key: 'Potatoe', - text: t('foodPotatoe'), - }, { - type: 'food', - key: 'Potatoe', - text: t('foodPotatoe'), - }, { - type: 'food', - key: 'Meat', - text: t('foodMeat'), - }, { - type: 'food', - key: 'Meat', - text: t('foodMeat'), - }, { - type: 'food', - key: 'Meat', - text: t('foodMeat'), - }, { - type: 'food', - key: 'Milk', - text: t('foodMilk'), - }, { - type: 'food', - key: 'Milk', - text: t('foodMilk'), - }, { - type: 'food', - key: 'Milk', - text: t('foodMilk'), - }, - ], - gp: 0, - exp: 200, - }, - }, - lostMasterclasser2: { - text: t('questLostMasterclasser2Text'), - notes: t('questLostMasterclasser2Notes'), - group: 'questGroupLostMasterclasser', - previous1: 'lostMasterclasser1', - completion: t('questLostMasterclasser2Completion'), - prereqQuests: [ - 'lostMasterclasser1', - ], - value: 4, - goldValue: 500, - category: 'gold', - boss: { - name: t('questLostMasterclasser2Boss'), - hp: 1500, - str: 2.5, - }, - drop: { - items: [ - { - type: 'food', - key: 'Chocolate', - text: t('foodChocolate'), - }, { - type: 'food', - key: 'Chocolate', - text: t('foodChocolate'), - }, { - type: 'food', - key: 'Chocolate', - text: t('foodChocolate'), - }, { - type: 'food', - key: 'Honey', - text: t('foodHoney'), - }, { - type: 'food', - key: 'Honey', - text: t('foodHoney'), - }, { - type: 'food', - key: 'Honey', - text: t('foodHoney'), - }, { - type: 'food', - key: 'RottenMeat', - text: t('foodRottenMeat'), - }, { - type: 'food', - key: 'RottenMeat', - text: t('foodRottenMeat'), - }, { - type: 'food', - key: 'RottenMeat', - text: t('foodRottenMeat'), - }, { - type: 'gear', - key: 'eyewear_special_aetherMask', - text: t('questLostMasterclasser2DropEyewear'), - }, - ], - gp: 0, - exp: 1500, - }, - }, - lostMasterclasser3: { - text: t('questLostMasterclasser3Text'), - notes: t('questLostMasterclasser3Notes'), - group: 'questGroupLostMasterclasser', - completion: t('questLostMasterclasser3Completion'), - previous: 'lostMasterclasser2', - prereqQuests: [ - 'lostMasterclasser1', - 'lostMasterclasser2', - ], - value: 4, - goldValue: 600, - category: 'gold', - boss: { - name: t('questLostMasterclasser3Boss'), - hp: 2000, - str: 3, - rage: { - title: t('questLostMasterclasser3RageTitle'), - description: t('questLostMasterclasser3RageDescription'), - value: 25, - healing: 0.3, - effect: t('questLostMasterclasser3RageEffect'), - }, - }, - drop: { - items: [ - { - type: 'hatchingPotions', - key: 'Base', - text: t('questLostMasterclasser3DropBasePotion'), - }, { - type: 'hatchingPotions', - key: 'CottonCandyPink', - text: t('questLostMasterclasser3DropPinkPotion'), - }, { - type: 'hatchingPotions', - key: 'Golden', - text: t('questLostMasterclasser3DropGoldenPotion'), - }, { - type: 'hatchingPotions', - key: 'Shade', - text: t('questLostMasterclasser3DropShadePotion'), - }, { - type: 'hatchingPotions', - key: 'Zombie', - text: t('questLostMasterclasser3DropZombiePotion'), - }, { - type: 'gear', - key: 'body_special_aetherAmulet', - text: t('questLostMasterclasser3DropBodyAccessory'), - }, - ], - gp: 0, - exp: 2000, - }, - }, - lostMasterclasser4: { - text: t('questLostMasterclasser4Text'), - notes: t('questLostMasterclasser4Notes'), - group: 'questGroupLostMasterclasser', - completion: t('questLostMasterclasser4Completion'), - previous: 'lostMasterclasser3', - prereqQuests: [ - 'lostMasterclasser1', - 'lostMasterclasser2', - 'lostMasterclasser3', - ], - value: 4, - goldValue: 700, - category: 'gold', - boss: { - name: t('questLostMasterclasser4Boss'), - hp: 3000, - str: 4, - rage: { - title: t('questLostMasterclasser4RageTitle'), - description: t('questLostMasterclasser4RageDescription'), - value: 15, - mpDrain: true, - effect: t('questLostMasterclasser4RageEffect'), - }, - }, - drop: { - items: [ - { - type: 'mounts', - key: 'Aether-Invisible', - text: t('questLostMasterclasser4DropMount'), - }, { - type: 'gear', - key: 'back_special_aetherCloak', - text: t('questLostMasterclasser4DropBackAccessory'), - }, { - type: 'gear', - key: 'weapon_special_aetherCrystals', - text: t('questLostMasterclasser4DropWeapon'), - }, - ], - gp: 0, - exp: 3500, - }, - }, - // seasonal quests - // winter - evilsanta: { - event: CURRENT_EVENT && CURRENT_EVENT.season === 'winter' ? CURRENT_EVENT : null, - text: t('questEvilSantaText'), - notes: t('questEvilSantaNotes'), - addlNotes: t('evilSantaAddlNotes'), - completion: t('questEvilSantaCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questEvilSantaBoss'), - hp: 300, - str: 1, - }, - drop: { - items: [ - { - type: 'mounts', - key: 'BearCub-Polar', - text: t('questEvilSantaDropBearCubPolarMount'), - }, - ], - gp: 20, - exp: 100, - }, - }, - evilsanta2: { - event: CURRENT_EVENT && CURRENT_EVENT.season === 'winter' ? CURRENT_EVENT : null, - text: t('questEvilSanta2Text'), - notes: t('questEvilSanta2Notes'), - addlNotes: t('evilSantaAddlNotes'), - completion: t('questEvilSanta2Completion'), - value: 4, - category: 'pet', - collect: { - tracks: { - text: t('questEvilSanta2CollectTracks'), - count: 20, - }, - branches: { - text: t('questEvilSanta2CollectBranches'), - count: 10, - }, - }, - drop: { - items: [ - { - type: 'pets', - key: 'BearCub-Polar', - text: t('questEvilSanta2DropBearCubPolarPet'), - }, - ], - gp: 20, - exp: 100, - }, - }, - // spring - egg: { - text: t('questEggHuntText'), - notes: t('questEggHuntNotes'), - completion: t('questEggHuntCompletion'), - value: 1, - category: 'pet', - event: CURRENT_EVENT && CURRENT_EVENT.season === 'spring' ? CURRENT_EVENT : null, - collect: { - plainEgg: { - text: t('questEggHuntCollectPlainEgg'), - count: 40, - }, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Egg', - text: t('questEggHuntDropPlainEgg'), - }, { - type: 'eggs', - key: 'Egg', - text: t('questEggHuntDropPlainEgg'), - }, { - type: 'eggs', - key: 'Egg', - text: t('questEggHuntDropPlainEgg'), - }, { - type: 'eggs', - key: 'Egg', - text: t('questEggHuntDropPlainEgg'), - }, { - type: 'eggs', - key: 'Egg', - text: t('questEggHuntDropPlainEgg'), - }, { - type: 'eggs', - key: 'Egg', - text: t('questEggHuntDropPlainEgg'), - }, { - type: 'eggs', - key: 'Egg', - text: t('questEggHuntDropPlainEgg'), - }, { - type: 'eggs', - key: 'Egg', - text: t('questEggHuntDropPlainEgg'), - }, { - type: 'eggs', - key: 'Egg', - text: t('questEggHuntDropPlainEgg'), - }, { - type: 'eggs', - key: 'Egg', - text: t('questEggHuntDropPlainEgg'), - }, - ], - gp: 0, - exp: 0, - }, - }, - waffle: { - text: t('questWaffleText'), - notes: t('questWaffleNotes'), - completion: t('questWaffleCompletion'), - value: 4, - category: 'hatchingPotion', - event: CURRENT_EVENT && CURRENT_EVENT.season === 'spring' ? CURRENT_EVENT : null, - boss: { - name: t('questWaffleBoss'), - hp: 500, - str: 2, - rage: { - title: t('questWaffleRageTitle'), - description: t('questWaffleRageDescription'), - value: 50, - progressDrain: 0.5, - effect: t('questWaffleRageEffect'), - }, - }, - drop: { - items: [ - { - type: 'hatchingPotions', - key: 'Dessert', - text: t('questWaffleDropDessertPotion'), - }, { - type: 'hatchingPotions', - key: 'Dessert', - text: t('questWaffleDropDessertPotion'), - }, { - type: 'hatchingPotions', - key: 'Dessert', - text: t('questWaffleDropDessertPotion'), - }, - ], - gp: 40, - exp: 500, - unlock: t('questWaffleUnlockText'), - }, - }, - // pet quests - alligator: { - text: t('questAlligatorText'), - notes: t('questAlligatorNotes'), - completion: t('questAlligatorCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questAlligatorBoss'), - hp: 1100, - str: 2.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Alligator', - text: t('questAlligatorDropAlligatorEgg'), - }, { - type: 'eggs', - key: 'Alligator', - text: t('questAlligatorDropAlligatorEgg'), - }, { - type: 'eggs', - key: 'Alligator', - text: t('questAlligatorDropAlligatorEgg'), - }, - ], - gp: 73, - exp: 725, - unlock: t('questAlligatorUnlockText'), - }, - }, - armadillo: { - text: t('questArmadilloText'), - notes: t('questArmadilloNotes'), - completion: t('questArmadilloCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questArmadilloBoss'), - hp: 600, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Armadillo', - text: t('questArmadilloDropArmadilloEgg'), - }, { - type: 'eggs', - key: 'Armadillo', - text: t('questArmadilloDropArmadilloEgg'), - }, { - type: 'eggs', - key: 'Armadillo', - text: t('questArmadilloDropArmadilloEgg'), - }, - ], - gp: 43, - exp: 350, - unlock: t('questArmadilloUnlockText'), - }, - }, - axolotl: { - text: t('questAxolotlText'), - notes: t('questAxolotlNotes'), - completion: t('questAxolotlCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questAxolotlBoss'), - hp: 500, - str: 1.5, - rage: { - title: t('questAxolotlRageTitle'), - description: t('questAxolotlRageDescription'), - value: 50, - healing: 0.3, - effect: t('questAxolotlRageEffect'), - }, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Axolotl', - text: t('questAxolotlDropAxolotlEgg'), - }, { - type: 'eggs', - key: 'Axolotl', - text: t('questAxolotlDropAxolotlEgg'), - }, { - type: 'eggs', - key: 'Axolotl', - text: t('questAxolotlDropAxolotlEgg'), - }, - ], - gp: 37, - exp: 275, - unlock: t('questAxolotlUnlockText'), - }, - }, - badger: { - text: t('questBadgerText'), - notes: t('questBadgerNotes'), - completion: t('questBadgerCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questBadgerBoss'), - hp: 600, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Badger', - text: t('questBadgerDropBadgerEgg'), - }, { - type: 'eggs', - key: 'Badger', - text: t('questBadgerDropBadgerEgg'), - }, { - type: 'eggs', - key: 'Badger', - text: t('questBadgerDropBadgerEgg'), - }, - ], - gp: 43, - exp: 350, - unlock: t('questBadgerUnlockText'), - }, - }, - beetle: { - text: t('questBeetleText'), - notes: t('questBeetleNotes'), - completion: t('questBeetleCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questBeetleBoss'), - hp: 500, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Beetle', - text: t('questBeetleDropBeetleEgg'), - }, { - type: 'eggs', - key: 'Beetle', - text: t('questBeetleDropBeetleEgg'), - }, { - type: 'eggs', - key: 'Beetle', - text: t('questBeetleDropBeetleEgg'), - }, - ], - gp: 37, - exp: 275, - unlock: t('questBeetleUnlockText'), - }, - }, - bunny: { - text: t('questBunnyText'), - notes: t('questBunnyNotes'), - completion: t('questBunnyCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questBunnyBoss'), - hp: 300, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Bunny', - text: t('questBunnyDropBunnyEgg'), - }, { - type: 'eggs', - key: 'Bunny', - text: t('questBunnyDropBunnyEgg'), - }, { - type: 'eggs', - key: 'Bunny', - text: t('questBunnyDropBunnyEgg'), - }, - ], - gp: 25, - exp: 125, - unlock: t('questBunnyUnlockText'), - }, - }, - butterfly: { - text: t('questButterflyText'), - notes: t('questButterflyNotes'), - completion: t('questButterflyCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questButterflyBoss'), - hp: 400, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Butterfly', - text: t('questButterflyDropButterflyEgg'), - }, { - type: 'eggs', - key: 'Butterfly', - text: t('questButterflyDropButterflyEgg'), - }, { - type: 'eggs', - key: 'Butterfly', - text: t('questButterflyDropButterflyEgg'), - }, - ], - gp: 31, - exp: 200, - unlock: t('questButterflyUnlockText'), - }, - }, - cheetah: { - text: t('questCheetahText'), - notes: t('questCheetahNotes'), - completion: t('questCheetahCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questCheetahBoss'), - hp: 600, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Cheetah', - text: t('questCheetahDropCheetahEgg'), - }, { - type: 'eggs', - key: 'Cheetah', - text: t('questCheetahDropCheetahEgg'), - }, { - type: 'eggs', - key: 'Cheetah', - text: t('questCheetahDropCheetahEgg'), - }, - ], - gp: 43, - exp: 350, - unlock: t('questCheetahUnlockText'), - }, - }, - cow: { - text: t('questCowText'), - notes: t('questCowNotes'), - completion: t('questCowCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questCowBoss'), - hp: 400, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Cow', - text: t('questCowDropCowEgg'), - }, { - type: 'eggs', - key: 'Cow', - text: t('questCowDropCowEgg'), - }, { - type: 'eggs', - key: 'Cow', - text: t('questCowDropCowEgg'), - }, - ], - gp: 31, - exp: 200, - unlock: t('questCowUnlockText'), - }, - }, - dilatory_derby: { // eslint-disable-line camelcase - text: t('questSeahorseText'), - notes: t('questSeahorseNotes'), - completion: t('questSeahorseCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questSeahorseBoss'), - hp: 300, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Seahorse', - text: t('questSeahorseDropSeahorseEgg'), - }, { - type: 'eggs', - key: 'Seahorse', - text: t('questSeahorseDropSeahorseEgg'), - }, { - type: 'eggs', - key: 'Seahorse', - text: t('questSeahorseDropSeahorseEgg'), - }, - ], - gp: 25, - exp: 125, - unlock: t('questSeahorseUnlockText'), - }, - }, - dolphin: { - text: t('questDolphinText'), - notes: t('questDolphinNotes'), - completion: t('questDolphinCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questDolphinBoss'), - hp: 300, - str: 1.25, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Dolphin', - text: t('questDolphinDropDolphinEgg'), - }, { - type: 'eggs', - key: 'Dolphin', - text: t('questDolphinDropDolphinEgg'), - }, { - type: 'eggs', - key: 'Dolphin', - text: t('questDolphinDropDolphinEgg'), - }, - ], - gp: 22, - exp: 110, - unlock: t('questDolphinUnlockText'), - }, - }, - falcon: { - text: t('questFalconText'), - notes: t('questFalconNotes'), - completion: t('questFalconCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questFalconBoss'), - hp: 700, - str: 2, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Falcon', - text: t('questFalconDropFalconEgg'), - }, { - type: 'eggs', - key: 'Falcon', - text: t('questFalconDropFalconEgg'), - }, { - type: 'eggs', - key: 'Falcon', - text: t('questFalconDropFalconEgg'), - }, - ], - gp: 49, - exp: 425, - unlock: t('questFalconUnlockText'), - }, - }, - ferret: { - text: t('questFerretText'), - notes: t('questFerretNotes'), - completion: t('questFerretCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questFerretBoss'), - hp: 400, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Ferret', - text: t('questFerretDropFerretEgg'), - }, { - type: 'eggs', - key: 'Ferret', - text: t('questFerretDropFerretEgg'), - }, { - type: 'eggs', - key: 'Ferret', - text: t('questFerretDropFerretEgg'), - }, - ], - gp: 31, - exp: 200, - unlock: t('questFerretUnlockText'), - }, - }, - frog: { - text: t('questFrogText'), - notes: t('questFrogNotes'), - completion: t('questFrogCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questFrogBoss'), - hp: 300, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Frog', - text: t('questFrogDropFrogEgg'), - }, { - type: 'eggs', - key: 'Frog', - text: t('questFrogDropFrogEgg'), - }, { - type: 'eggs', - key: 'Frog', - text: t('questFrogDropFrogEgg'), - }, - ], - gp: 25, - exp: 125, - unlock: t('questFrogUnlockText'), - }, - }, - ghost_stag: { // eslint-disable-line camelcase - text: t('questGhostStagText'), - notes: t('questGhostStagNotes'), - completion: t('questGhostStagCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questGhostStagBoss'), - hp: 1200, - str: 2.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Deer', - text: t('questGhostStagDropDeerEgg'), - }, { - type: 'eggs', - key: 'Deer', - text: t('questGhostStagDropDeerEgg'), - }, { - type: 'eggs', - key: 'Deer', - text: t('questGhostStagDropDeerEgg'), - }, - ], - gp: 80, - exp: 800, - unlock: t('questGhostStagUnlockText'), - }, - }, - gryphon: { - text: t('questGryphonText'), - notes: t('questGryphonNotes'), - completion: t('questGryphonCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questGryphonBoss'), - hp: 300, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Gryphon', - text: t('questGryphonDropGryphonEgg'), - }, { - type: 'eggs', - key: 'Gryphon', - text: t('questGryphonDropGryphonEgg'), - }, { - type: 'eggs', - key: 'Gryphon', - text: t('questGryphonDropGryphonEgg'), - }, - ], - gp: 25, - exp: 125, - unlock: t('questGryphonUnlockText'), - }, - }, - guineapig: { - text: t('questGuineaPigText'), - notes: t('questGuineaPigNotes'), - completion: t('questGuineaPigCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questGuineaPigBoss'), - hp: 400, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'GuineaPig', - text: t('questGuineaPigDropGuineaPigEgg'), - }, { - type: 'eggs', - key: 'GuineaPig', - text: t('questGuineaPigDropGuineaPigEgg'), - }, { - type: 'eggs', - key: 'GuineaPig', - text: t('questGuineaPigDropGuineaPigEgg'), - }, - ], - gp: 31, - exp: 200, - unlock: t('questGuineaPigUnlockText'), - }, - }, - harpy: { - text: t('questHarpyText'), - notes: t('questHarpyNotes'), - completion: t('questHarpyCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questHarpyBoss'), - hp: 600, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Parrot', - text: t('questHarpyDropParrotEgg'), - }, { - type: 'eggs', - key: 'Parrot', - text: t('questHarpyDropParrotEgg'), - }, { - type: 'eggs', - key: 'Parrot', - text: t('questHarpyDropParrotEgg'), - }, - ], - gp: 43, - exp: 350, - unlock: t('questHarpyUnlockText'), - }, - }, - hedgehog: { - text: t('questHedgehogText'), - notes: t('questHedgehogNotes'), - completion: t('questHedgehogCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questHedgehogBoss'), - hp: 400, - str: 1.25, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Hedgehog', - text: t('questHedgehogDropHedgehogEgg'), - }, { - type: 'eggs', - key: 'Hedgehog', - text: t('questHedgehogDropHedgehogEgg'), - }, { - type: 'eggs', - key: 'Hedgehog', - text: t('questHedgehogDropHedgehogEgg'), - }, - ], - gp: 30, - exp: 125, - unlock: t('questHedgehogUnlockText'), - }, - }, - hippo: { - text: t('questHippoText'), - notes: t('questHippoNotes'), - completion: t('questHippoCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questHippoBoss'), - hp: 800, - str: 2, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Hippo', - text: t('questHippoDropHippoEgg'), - }, { - type: 'eggs', - key: 'Hippo', - text: t('questHippoDropHippoEgg'), - }, { - type: 'eggs', - key: 'Hippo', - text: t('questHippoDropHippoEgg'), - }, - ], - gp: 55, - exp: 500, - unlock: t('questHippoUnlockText'), - }, - }, - horse: { - text: t('questHorseText'), - notes: t('questHorseNotes'), - completion: t('questHorseCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questHorseBoss'), - hp: 500, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Horse', - text: t('questHorseDropHorseEgg'), - }, { - type: 'eggs', - key: 'Horse', - text: t('questHorseDropHorseEgg'), - }, { - type: 'eggs', - key: 'Horse', - text: t('questHorseDropHorseEgg'), - }, - ], - gp: 37, - exp: 275, - unlock: t('questHorseUnlockText'), - }, - }, - kangaroo: { - text: t('questKangarooText'), - notes: t('questKangarooNotes'), - completion: t('questKangarooCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questKangarooBoss'), - hp: 700, - str: 2, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Kangaroo', - text: t('questKangarooDropKangarooEgg'), - }, { - type: 'eggs', - key: 'Kangaroo', - text: t('questKangarooDropKangarooEgg'), - }, { - type: 'eggs', - key: 'Kangaroo', - text: t('questKangarooDropKangarooEgg'), - }, - ], - gp: 49, - exp: 425, - unlock: t('questKangarooUnlockText'), - }, - }, - kraken: { - text: t('questKrakenText'), - notes: t('questKrakenNotes'), - completion: t('questKrakenCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questKrakenBoss'), - hp: 800, - str: 2, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Cuttlefish', - text: t('questKrakenDropCuttlefishEgg'), - }, { - type: 'eggs', - key: 'Cuttlefish', - text: t('questKrakenDropCuttlefishEgg'), - }, { - type: 'eggs', - key: 'Cuttlefish', - text: t('questKrakenDropCuttlefishEgg'), - }, - ], - gp: 55, - exp: 500, - unlock: t('questKrakenUnlockText'), - }, - }, - monkey: { - text: t('questMonkeyText'), - notes: t('questMonkeyNotes'), - completion: t('questMonkeyCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questMonkeyBoss'), - hp: 400, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Monkey', - text: t('questMonkeyDropMonkeyEgg'), - }, { - type: 'eggs', - key: 'Monkey', - text: t('questMonkeyDropMonkeyEgg'), - }, { - type: 'eggs', - key: 'Monkey', - text: t('questMonkeyDropMonkeyEgg'), - }, - ], - gp: 31, - exp: 200, - unlock: t('questMonkeyUnlockText'), - }, - }, - nudibranch: { - text: t('questNudibranchText'), - notes: t('questNudibranchNotes'), - completion: t('questNudibranchCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questNudibranchBoss'), - hp: 400, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Nudibranch', - text: t('questNudibranchDropNudibranchEgg'), - }, { - type: 'eggs', - key: 'Nudibranch', - text: t('questNudibranchDropNudibranchEgg'), - }, { - type: 'eggs', - key: 'Nudibranch', - text: t('questNudibranchDropNudibranchEgg'), - }, - ], - gp: 31, - exp: 200, - unlock: t('questNudibranchUnlockText'), - }, - }, - octopus: { - text: t('questOctopusText'), - notes: t('questOctopusNotes'), - completion: t('questOctopusCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questOctopusBoss'), - hp: 1200, - str: 2.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Octopus', - text: t('questOctopusDropOctopusEgg'), - }, { - type: 'eggs', - key: 'Octopus', - text: t('questOctopusDropOctopusEgg'), - }, { - type: 'eggs', - key: 'Octopus', - text: t('questOctopusDropOctopusEgg'), - }, - ], - gp: 80, - exp: 800, - unlock: t('questOctopusUnlockText'), - }, - }, - owl: { - text: t('questOwlText'), - notes: t('questOwlNotes'), - completion: t('questOwlCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questOwlBoss'), - hp: 500, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Owl', - text: t('questOwlDropOwlEgg'), - }, { - type: 'eggs', - key: 'Owl', - text: t('questOwlDropOwlEgg'), - }, { - type: 'eggs', - key: 'Owl', - text: t('questOwlDropOwlEgg'), - }, - ], - gp: 37, - exp: 275, - unlock: t('questOwlUnlockText'), - }, - }, - peacock: { - text: t('questPeacockText'), - notes: t('questPeacockNotes'), - completion: t('questPeacockCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questPeacockBoss'), - hp: 300, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Peacock', - text: t('questPeacockDropPeacockEgg'), - }, { - type: 'eggs', - key: 'Peacock', - text: t('questPeacockDropPeacockEgg'), - }, { - type: 'eggs', - key: 'Peacock', - text: t('questPeacockDropPeacockEgg'), - }, - ], - gp: 25, - exp: 125, - unlock: t('questPeacockUnlockText'), - }, - }, - penguin: { - text: t('questPenguinText'), - notes: t('questPenguinNotes'), - completion: t('questPenguinCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questPenguinBoss'), - hp: 400, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Penguin', - text: t('questPenguinDropPenguinEgg'), - }, { - type: 'eggs', - key: 'Penguin', - text: t('questPenguinDropPenguinEgg'), - }, { - type: 'eggs', - key: 'Penguin', - text: t('questPenguinDropPenguinEgg'), - }, - ], - gp: 31, - exp: 200, - unlock: t('questPenguinUnlockText'), - }, - }, - pterodactyl: { - text: t('questPterodactylText'), - notes: t('questPterodactylNotes'), - completion: t('questPterodactylCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questPterodactylBoss'), - hp: 1000, - str: 2, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Pterodactyl', - text: t('questPterodactylDropPterodactylEgg'), - }, { - type: 'eggs', - key: 'Pterodactyl', - text: t('questPterodactylDropPterodactylEgg'), - }, { - type: 'eggs', - key: 'Pterodactyl', - text: t('questPterodactylDropPterodactylEgg'), - }, - ], - gp: 67, - exp: 650, - unlock: t('questPterodactylUnlockText'), - }, - }, - rat: { - text: t('questRatText'), - notes: t('questRatNotes'), - completion: t('questRatCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questRatBoss'), - hp: 1200, - str: 2.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Rat', - text: t('questRatDropRatEgg'), - }, { - type: 'eggs', - key: 'Rat', - text: t('questRatDropRatEgg'), - }, { - type: 'eggs', - key: 'Rat', - text: t('questRatDropRatEgg'), - }, - ], - gp: 80, - exp: 800, - unlock: t('questRatUnlockText'), - }, - }, - rock: { - text: t('questRockText'), - notes: t('questRockNotes'), - completion: t('questRockCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questRockBoss'), - hp: 400, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Rock', - text: t('questRockDropRockEgg'), - }, { - type: 'eggs', - key: 'Rock', - text: t('questRockDropRockEgg'), - }, { - type: 'eggs', - key: 'Rock', - text: t('questRockDropRockEgg'), - }, - ], - gp: 31, - exp: 200, - unlock: t('questRockUnlockText'), - }, - }, - rooster: { - text: t('questRoosterText'), - notes: t('questRoosterNotes'), - completion: t('questRoosterCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questRoosterBoss'), - hp: 300, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Rooster', - text: t('questRoosterDropRoosterEgg'), - }, { - type: 'eggs', - key: 'Rooster', - text: t('questRoosterDropRoosterEgg'), - }, { - type: 'eggs', - key: 'Rooster', - text: t('questRoosterDropRoosterEgg'), - }, - ], - gp: 25, - exp: 125, - unlock: t('questRoosterUnlockText'), - }, - }, - sabretooth: { - text: t('questSabretoothText'), - notes: t('questSabretoothNotes'), - completion: t('questSabretoothCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questSabretoothBoss'), - hp: 1000, - str: 2, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Sabretooth', - text: t('questSabretoothDropSabretoothEgg'), - }, { - type: 'eggs', - key: 'Sabretooth', - text: t('questSabretoothDropSabretoothEgg'), - }, { - type: 'eggs', - key: 'Sabretooth', - text: t('questSabretoothDropSabretoothEgg'), - }, - ], - gp: 67, - exp: 650, - unlock: t('questSabretoothUnlockText'), - }, - }, - seaserpent: { - text: t('questSeaSerpentText'), - notes: t('questSeaSerpentNotes'), - completion: t('questSeaSerpentCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questSeaSerpentBoss'), - hp: 1200, - str: 2.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'SeaSerpent', - text: t('questSeaSerpentDropSeaSerpentEgg'), - }, { - type: 'eggs', - key: 'SeaSerpent', - text: t('questSeaSerpentDropSeaSerpentEgg'), - }, { - type: 'eggs', - key: 'SeaSerpent', - text: t('questSeaSerpentDropSeaSerpentEgg'), - }, - ], - gp: 80, - exp: 800, - unlock: t('questSeaSerpentUnlockText'), - }, - }, - sheep: { - text: t('questSheepText'), - notes: t('questSheepNotes'), - completion: t('questSheepCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questSheepBoss'), - hp: 300, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Sheep', - text: t('questSheepDropSheepEgg'), - }, { - type: 'eggs', - key: 'Sheep', - text: t('questSheepDropSheepEgg'), - }, { - type: 'eggs', - key: 'Sheep', - text: t('questSheepDropSheepEgg'), - }, - ], - gp: 25, - exp: 125, - unlock: t('questSheepUnlockText'), - }, - }, - slime: { - text: t('questSlimeText'), - notes: t('questSlimeNotes'), - completion: t('questSlimeCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questSlimeBoss'), - hp: 400, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Slime', - text: t('questSlimeDropSlimeEgg'), - }, { - type: 'eggs', - key: 'Slime', - text: t('questSlimeDropSlimeEgg'), - }, { - type: 'eggs', - key: 'Slime', - text: t('questSlimeDropSlimeEgg'), - }, - ], - gp: 31, - exp: 200, - unlock: t('questSlimeUnlockText'), - }, - }, - sloth: { - text: t('questSlothText'), - notes: t('questSlothNotes'), - completion: t('questSlothCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questSlothBoss'), - hp: 400, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Sloth', - text: t('questSlothDropSlothEgg'), - }, { - type: 'eggs', - key: 'Sloth', - text: t('questSlothDropSlothEgg'), - }, { - type: 'eggs', - key: 'Sloth', - text: t('questSlothDropSlothEgg'), - }, - ], - gp: 31, - exp: 200, - unlock: t('questSlothUnlockText'), - }, - }, - snail: { - text: t('questSnailText'), - notes: t('questSnailNotes'), - completion: t('questSnailCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questSnailBoss'), - hp: 500, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Snail', - text: t('questSnailDropSnailEgg'), - }, { - type: 'eggs', - key: 'Snail', - text: t('questSnailDropSnailEgg'), - }, { - type: 'eggs', - key: 'Snail', - text: t('questSnailDropSnailEgg'), - }, - ], - gp: 37, - exp: 275, - unlock: t('questSnailUnlockText'), - }, - }, - snake: { - text: t('questSnakeText'), - notes: t('questSnakeNotes'), - completion: t('questSnakeCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questSnakeBoss'), - hp: 1100, - str: 2.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Snake', - text: t('questSnakeDropSnakeEgg'), - }, { - type: 'eggs', - key: 'Snake', - text: t('questSnakeDropSnakeEgg'), - }, { - type: 'eggs', - key: 'Snake', - text: t('questSnakeDropSnakeEgg'), - }, - ], - gp: 73, - exp: 725, - unlock: t('questSnakeUnlockText'), - }, - }, - spider: { - text: t('questSpiderText'), - notes: t('questSpiderNotes'), - completion: t('questSpiderCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questSpiderBoss'), - hp: 400, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Spider', - text: t('questSpiderDropSpiderEgg'), - }, { - type: 'eggs', - key: 'Spider', - text: t('questSpiderDropSpiderEgg'), - }, { - type: 'eggs', - key: 'Spider', - text: t('questSpiderDropSpiderEgg'), - }, - ], - gp: 31, - exp: 200, - unlock: t('questSpiderUnlockText'), - }, - }, - squirrel: { - text: t('questSquirrelText'), - notes: t('questSquirrelNotes'), - completion: t('questSquirrelCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questSquirrelBoss'), - hp: 700, - str: 2, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Squirrel', - text: t('questSquirrelDropSquirrelEgg'), - }, { - type: 'eggs', - key: 'Squirrel', - text: t('questSquirrelDropSquirrelEgg'), - }, { - type: 'eggs', - key: 'Squirrel', - text: t('questSquirrelDropSquirrelEgg'), - }, - ], - gp: 49, - exp: 425, - unlock: t('questSquirrelUnlockText'), - }, - }, - treeling: { - text: t('questTreelingText'), - notes: t('questTreelingNotes'), - completion: t('questTreelingCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questTreelingBoss'), - hp: 600, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Treeling', - text: t('questTreelingDropTreelingEgg'), - }, { - type: 'eggs', - key: 'Treeling', - text: t('questTreelingDropTreelingEgg'), - }, { - type: 'eggs', - key: 'Treeling', - text: t('questTreelingDropTreelingEgg'), - }, - ], - gp: 43, - exp: 350, - unlock: t('questTreelingUnlockText'), - }, - }, - trex: { - text: t('questTRexText'), - notes: t('questTRexNotes'), - completion: t('questTRexCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questTRexBoss'), - hp: 800, - str: 2, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'TRex', - text: t('questTRexDropTRexEgg'), - }, { - type: 'eggs', - key: 'TRex', - text: t('questTRexDropTRexEgg'), - }, { - type: 'eggs', - key: 'TRex', - text: t('questTRexDropTRexEgg'), - }, - ], - gp: 55, - exp: 500, - unlock: t('questTRexUnlockText'), - }, - }, - trex_undead: { // eslint-disable-line camelcase - text: t('questTRexUndeadText'), - notes: t('questTRexUndeadNotes'), - completion: t('questTRexUndeadCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questTRexUndeadBoss'), - hp: 500, - str: 2, - rage: { - title: t('questTRexUndeadRageTitle'), - description: t('questTRexUndeadRageDescription'), - value: 50, - healing: 0.3, - effect: t('questTRexUndeadRageEffect'), - }, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'TRex', - text: t('questTRexDropTRexEgg'), - }, { - type: 'eggs', - key: 'TRex', - text: t('questTRexDropTRexEgg'), - }, { - type: 'eggs', - key: 'TRex', - text: t('questTRexDropTRexEgg'), - }, - ], - gp: 55, - exp: 500, - unlock: t('questTRexUnlockText'), - }, - }, - triceratops: { - text: t('questTriceratopsText'), - notes: t('questTriceratopsNotes'), - completion: t('questTriceratopsCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questTriceratopsBoss'), - hp: 1200, - str: 2.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Triceratops', - text: t('questTriceratopsDropTriceratopsEgg'), - }, { - type: 'eggs', - key: 'Triceratops', - text: t('questTriceratopsDropTriceratopsEgg'), - }, { - type: 'eggs', - key: 'Triceratops', - text: t('questTriceratopsDropTriceratopsEgg'), - }, - ], - gp: 80, - exp: 800, - unlock: t('questTriceratopsUnlockText'), - }, - }, - turtle: { - text: t('questTurtleText'), - notes: t('questTurtleNotes'), - completion: t('questTurtleCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questTurtleBoss'), - hp: 300, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Turtle', - text: t('questTurtleDropTurtleEgg'), - }, { - type: 'eggs', - key: 'Turtle', - text: t('questTurtleDropTurtleEgg'), - }, { - type: 'eggs', - key: 'Turtle', - text: t('questTurtleDropTurtleEgg'), - }, - ], - gp: 25, - exp: 125, - unlock: t('questTurtleUnlockText'), - }, - }, - unicorn: { - text: t('questUnicornText'), - notes: t('questUnicornNotes'), - completion: t('questUnicornCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questUnicornBoss'), - hp: 600, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Unicorn', - text: t('questUnicornDropUnicornEgg'), - }, { - type: 'eggs', - key: 'Unicorn', - text: t('questUnicornDropUnicornEgg'), - }, { - type: 'eggs', - key: 'Unicorn', - text: t('questUnicornDropUnicornEgg'), - }, - ], - gp: 43, - exp: 350, - unlock: t('questUnicornUnlockText'), - }, - }, - velociraptor: { - text: t('questVelociraptorText'), - notes: t('questVelociraptorNotes'), - completion: t('questVelociraptorCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questVelociraptorBoss'), - hp: 900, - str: 2, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Velociraptor', - text: t('questVelociraptorDropVelociraptorEgg'), - }, { - type: 'eggs', - key: 'Velociraptor', - text: t('questVelociraptorDropVelociraptorEgg'), - }, { - type: 'eggs', - key: 'Velociraptor', - text: t('questVelociraptorDropVelociraptorEgg'), - }, - ], - gp: 63, - exp: 575, - unlock: t('questVelociraptorUnlockText'), - }, - }, - whale: { - text: t('questWhaleText'), - notes: t('questWhaleNotes'), - completion: t('questWhaleCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questWhaleBoss'), - hp: 500, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Whale', - text: t('questWhaleDropWhaleEgg'), - }, { - type: 'eggs', - key: 'Whale', - text: t('questWhaleDropWhaleEgg'), - }, { - type: 'eggs', - key: 'Whale', - text: t('questWhaleDropWhaleEgg'), - }, - ], - gp: 37, - exp: 275, - unlock: t('questWhaleUnlockText'), - }, - }, - yarn: { - text: t('questYarnText'), - notes: t('questYarnNotes'), - completion: t('questYarnCompletion'), - value: 4, - category: 'pet', - boss: { - name: t('questYarnBoss'), - hp: 500, - str: 1.5, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Yarn', - text: t('questYarnDropYarnEgg'), - }, { - type: 'eggs', - key: 'Yarn', - text: t('questYarnDropYarnEgg'), - }, { - type: 'eggs', - key: 'Yarn', - text: t('questYarnDropYarnEgg'), - }, - ], - gp: 37, - exp: 275, - unlock: t('questYarnUnlockText'), - }, - }, - // potion quests - amber: { - text: t('questAmberText'), - notes: t('questAmberNotes'), - completion: t('questAmberCompletion'), - value: 4, - category: 'hatchingPotion', - boss: { - name: t('questAmberBoss'), - hp: 300, - str: 1.25, - }, - drop: { - items: [ - { - type: 'hatchingPotions', - key: 'Amber', - text: t('questAmberDropAmberPotion'), - }, { - type: 'hatchingPotions', - key: 'Amber', - text: t('questAmberDropAmberPotion'), - }, { - type: 'hatchingPotions', - key: 'Amber', - text: t('questAmberDropAmberPotion'), - }, - ], - gp: 50, - exp: 100, - unlock: t('questAmberUnlockText'), - }, - }, - blackPearl: { - text: t('questBlackPearlText'), - notes: t('questBlackPearlNotes'), - completion: t('questBlackPearlCompletion'), - value: 4, - category: 'hatchingPotion', - boss: { - name: t('questBlackPearlBoss'), - hp: 725, - str: 1.75, - }, - drop: { - items: [ - { - type: 'hatchingPotions', - key: 'BlackPearl', - text: t('questBlackPearlDropBlackPearlPotion'), - }, { - type: 'hatchingPotions', - key: 'BlackPearl', - text: t('questBlackPearlDropBlackPearlPotion'), - }, { - type: 'hatchingPotions', - key: 'BlackPearl', - text: t('questBlackPearlDropBlackPearlPotion'), - }, - ], - gp: 50, - exp: 450, - unlock: t('questBlackPearlUnlockText'), - }, - }, - bronze: { - text: t('questBronzeText'), - notes: t('questBronzeNotes'), - completion: t('questBronzeCompletion'), - value: 4, - category: 'hatchingPotion', - boss: { - name: t('questBronzeBoss'), - hp: 800, - str: 2, - }, - drop: { - items: [ - { - type: 'hatchingPotions', - key: 'Bronze', - text: t('questBronzeDropBronzePotion'), - }, { - type: 'hatchingPotions', - key: 'Bronze', - text: t('questBronzeDropBronzePotion'), - }, { - type: 'hatchingPotions', - key: 'Bronze', - text: t('questBronzeDropBronzePotion'), - }, - ], - gp: 63, - exp: 575, - unlock: t('questBronzeUnlockText'), - }, - }, - fluorite: { - text: t('questFluoriteText'), - notes: t('questFluoriteNotes'), - completion: t('questFluoriteCompletion'), - value: 4, - category: 'hatchingPotion', - boss: { - name: t('questFluoriteBoss'), - hp: 1200, - str: 2, - }, - drop: { - items: [ - { - type: 'hatchingPotions', - key: 'Fluorite', - text: t('questFluoriteDropFluoritePotion'), - }, { - type: 'hatchingPotions', - key: 'Fluorite', - text: t('questFluoriteDropFluoritePotion'), - }, { - type: 'hatchingPotions', - key: 'Fluorite', - text: t('questFluoriteDropFluoritePotion'), - }, - ], - gp: 70, - exp: 750, - unlock: t('questFluoriteUnlockText'), - }, - }, - onyx: { - text: t('questOnyxText'), - notes: t('questOnyxNotes'), - completion: t('questOnyxCompletion'), - value: 4, - category: 'hatchingPotion', - collect: { - onyxStone: { - text: t('questOnyxCollectOnyxStones'), - count: 25, - }, - plutoRune: { - text: t('questOnyxCollectPlutoRunes'), - count: 10, - }, - leoRune: { - text: t('questOnyxCollectLeoRunes'), - count: 10, - }, - }, - drop: { - items: [ - { - type: 'hatchingPotions', - key: 'Onyx', - text: t('questOnyxDropOnyxPotion'), - }, { - type: 'hatchingPotions', - key: 'Onyx', - text: t('questOnyxDropOnyxPotion'), - }, { - type: 'hatchingPotions', - key: 'Onyx', - text: t('questOnyxDropOnyxPotion'), - }, - ], - gp: 50, - exp: 100, - unlock: t('questOnyxUnlockText'), - }, - }, - ruby: { - text: t('questRubyText'), - notes: t('questRubyNotes'), - completion: t('questRubyCompletion'), - value: 4, - category: 'hatchingPotion', - collect: { - rubyGem: { - text: t('questRubyCollectRubyGems'), - count: 25, - }, - venusRune: { - text: t('questRubyCollectVenusRunes'), - count: 10, - }, - aquariusRune: { - text: t('questRubyCollectAquariusRunes'), - count: 10, - }, - }, - drop: { - items: [ - { - type: 'hatchingPotions', - key: 'Ruby', - text: t('questRubyDropRubyPotion'), - }, { - type: 'hatchingPotions', - key: 'Ruby', - text: t('questRubyDropRubyPotion'), - }, { - type: 'hatchingPotions', - key: 'Ruby', - text: t('questRubyDropRubyPotion'), - }, - ], - gp: 50, - exp: 100, - unlock: t('questRubyUnlockText'), - }, - }, - silver: { - text: t('questSilverText'), - notes: t('questSilverNotes'), - completion: t('questSilverCompletion'), - value: 4, - category: 'hatchingPotion', - collect: { - silverIngot: { - text: t('questSilverCollectSilverIngots'), - count: 20, - }, - moonRune: { - text: t('questSilverCollectMoonRunes'), - count: 15, - }, - cancerRune: { - text: t('questSilverCollectCancerRunes'), - count: 15, - }, - }, - drop: { - items: [ - { - type: 'hatchingPotions', - key: 'Silver', - text: t('questSilverDropSilverPotion'), - }, { - type: 'hatchingPotions', - key: 'Silver', - text: t('questSilverDropSilverPotion'), - }, { - type: 'hatchingPotions', - key: 'Silver', - text: t('questSilverDropSilverPotion'), - }, - ], - gp: 50, - exp: 100, - unlock: t('questSilverUnlockText'), - }, - }, - stone: { - text: t('questStoneText'), - notes: t('questStoneNotes'), - completion: t('questStoneCompletion'), - value: 4, - category: 'hatchingPotion', - collect: { - mossyStone: { - text: t('questStoneCollectMossyStones'), - count: 25, - }, - marsRune: { - text: t('questStoneCollectMarsRunes'), - count: 10, - }, - capricornRune: { - text: t('questStoneCollectCapricornRunes'), - count: 10, - }, - }, - drop: { - items: [ - { - type: 'hatchingPotions', - key: 'MossyStone', - text: t('questStoneDropMossyStonePotion'), - }, { - type: 'hatchingPotions', - key: 'MossyStone', - text: t('questStoneDropMossyStonePotion'), - }, { - type: 'hatchingPotions', - key: 'MossyStone', - text: t('questStoneDropMossyStonePotion'), - }, - ], - gp: 50, - exp: 100, - unlock: t('questStoneUnlockText'), - }, - }, - turquoise: { - text: t('questTurquoiseText'), - notes: t('questTurquoiseNotes'), - completion: t('questTurquoiseCompletion'), - value: 4, - category: 'hatchingPotion', - collect: { - turquoiseGem: { - text: t('questTurquoiseCollectTurquoiseGems'), - count: 25, - }, - sagittariusRune: { - text: t('questTurquoiseCollectSagittariusRunes'), - count: 10, - }, - neptuneRune: { - text: t('questTurquoiseCollectNeptuneRunes'), - count: 10, - }, - }, - drop: { - items: [ - { - type: 'hatchingPotions', - key: 'Turquoise', - text: t('questTurquoiseDropTurquoisePotion'), - }, { - type: 'hatchingPotions', - key: 'Turquoise', - text: t('questTurquoiseDropTurquoisePotion'), - }, { - type: 'hatchingPotions', - key: 'Turquoise', - text: t('questTurquoiseDropTurquoisePotion'), - }, - ], - gp: 50, - exp: 100, - unlock: t('questTurquoiseUnlockText'), - }, - }, - // time travelers quests - robot: { - text: t('questRobotText'), - notes: t('questRobotNotes'), - completion: t('questRobotCompletion'), - value: 1, - category: 'timeTravelers', - canBuy () { - return false; - }, - collect: { - bolt: { - text: t('questRobotCollectBolts'), - count: 15, - }, - gear: { - text: t('questRobotCollectGears'), - count: 10, - }, - spring: { - text: t('questRobotCollectSprings'), - count: 10, - }, - }, - drop: { - items: [ - { - type: 'eggs', - key: 'Robot', - text: t('questRobotDropRobotEgg'), - }, { - type: 'eggs', - key: 'Robot', - text: t('questRobotDropRobotEgg'), - }, { - type: 'eggs', - key: 'Robot', - text: t('questRobotDropRobotEgg'), - }, - ], - gp: 40, - exp: 75, - unlock: t('questRobotUnlockText'), - }, - }, - solarSystem: { - text: t('questSolarSystemText'), - notes: t('questSolarSystemNotes'), - completion: t('questSolarSystemCompletion'), - value: 1, - category: 'timeTravelers', - canBuy () { - return false; - }, - boss: { - name: t('questSolarSystemBoss'), - hp: 1500, - str: 2.5, - }, - drop: { - items: [ - { - type: 'hatchingPotions', - key: 'SolarSystem', - text: t('questSolarSystemDropSolarSystemPotion'), - }, { - type: 'hatchingPotions', - key: 'SolarSystem', - text: t('questSolarSystemDropSolarSystemPotion'), - }, { - type: 'hatchingPotions', - key: 'SolarSystem', - text: t('questSolarSystemDropSolarSystemPotion'), - }, - ], - gp: 90, - exp: 900, - unlock: t('questSolarSystemUnlockText'), - }, - }, - windup: { - text: t('questWindupText'), - notes: t('questWindupNotes'), - completion: t('questWindupCompletion'), - value: 1, - category: 'timeTravelers', - canBuy () { - return false; - }, - boss: { - name: t('questWindupBoss'), - hp: 1000, - str: 1, - }, - drop: { - items: [ - { - type: 'hatchingPotions', - key: 'Windup', - text: t('questWindupDropWindupPotion'), - }, { - type: 'hatchingPotions', - key: 'Windup', - text: t('questWindupDropWindupPotion'), - }, { - type: 'hatchingPotions', - key: 'Windup', - text: t('questWindupDropWindupPotion'), - }, - ], - gp: 50, - exp: 425, - unlock: t('questWindupUnlockText'), - }, - }, - // world quests - bewilder: { - text: t('questBewilderText'), - notes: t('questBewilderNotes'), - completion: t('questBewilderCompletion'), - completionChat: t('questBewilderCompletionChat'), - value: 0, - canBuy () { - return false; - }, - category: 'world', - boss: { - name: t('questBewilderText'), - hp: 20000000, - str: 1, - def: 1, - rage: { - title: t('questBewilderBossRageTitle'), - description: t('questBewilderBossRageDescription'), - value: 800000, - bailey: t('questBewilderBossRageBailey'), - stables: t('questBewilderBossRageStables'), - market: t('questBewilderBossRageMarket'), - }, - }, - drop: { - items: [ - { - type: 'pets', - key: 'MagicalBee-Base', - text: t('questBewilderDropBumblebeePet'), - }, { - type: 'mounts', - key: 'MagicalBee-Base', - text: t('questBewilderDropBumblebeeMount'), - }, { - type: 'food', - key: 'Meat', - text: t('foodMeat'), - }, { - type: 'food', - key: 'Milk', - text: t('foodMilk'), - }, { - type: 'food', - key: 'Potatoe', - text: t('foodPotatoe'), - }, { - type: 'food', - key: 'Strawberry', - text: t('foodStrawberry'), - }, { - type: 'food', - key: 'Chocolate', - text: t('foodChocolate'), - }, { - type: 'food', - key: 'Fish', - text: t('foodFish'), - }, { - type: 'food', - key: 'RottenMeat', - text: t('foodRottenMeat'), - }, { - type: 'food', - key: 'CottonCandyPink', - text: t('foodCottonCandyPink'), - }, { - type: 'food', - key: 'CottonCandyBlue', - text: t('foodCottonCandyBlue'), - }, { - type: 'food', - key: 'Honey', - text: t('foodHoney'), - }, - ], - gp: 0, - exp: 0, - }, - }, - burnout: { - text: t('questBurnoutText'), - notes: t('questBurnoutNotes'), - completion: t('questBurnoutCompletion'), - completionChat: t('questBurnoutCompletionChat'), - value: 0, - canBuy () { - return false; - }, - category: 'world', - boss: { - name: t('questBurnoutBoss'), - hp: 11000000, - str: 2.5, - def: 1, - rage: { - title: t('questBurnoutBossRageTitle'), - description: t('questBurnoutBossRageDescription'), - value: 1000000, - quests: t('questBurnoutBossRageQuests'), - seasonalShop: t('questBurnoutBossRageSeasonalShop'), - tavern: t('questBurnoutBossRageTavern'), - }, - }, - drop: { - items: [ - { - type: 'pets', - key: 'Phoenix-Base', - text: t('questBurnoutDropPhoenixPet'), - }, { - type: 'mounts', - key: 'Phoenix-Base', - text: t('questBurnoutDropPhoenixMount'), - }, { - type: 'food', - key: 'Candy_Base', - text: t('foodCandyBase'), - }, { - type: 'food', - key: 'Candy_White', - text: t('foodCandyWhite'), - }, { - type: 'food', - key: 'Candy_Desert', - text: t('foodCandyDesert'), - }, { - type: 'food', - key: 'Candy_Red', - text: t('foodCandyRed'), - }, { - type: 'food', - key: 'Candy_Shade', - text: t('foodCandyShade'), - }, { - type: 'food', - key: 'Candy_Skeleton', - text: t('foodCandySkeleton'), - }, { - type: 'food', - key: 'Candy_Zombie', - text: t('foodCandyZombie'), - }, { - type: 'food', - key: 'Candy_CottonCandyPink', - text: t('foodCandyCottonCandyPink'), - }, { - type: 'food', - key: 'Candy_CottonCandyBlue', - text: t('foodCandyCottonCandyBlue'), - }, { - type: 'food', - key: 'Candy_Golden', - text: t('foodCandyGolden'), - }, - ], - gp: 0, - exp: 0, - }, - }, - dilatory: { - text: t('questDilatoryText'), - notes: t('questDilatoryNotes'), - completion: t('questDilatoryCompletion'), - value: 0, - canBuy () { - return false; - }, - category: 'world', - boss: { - name: t('questDilatoryBoss'), - hp: 5000000, - str: 1, - def: 1, - rage: { - title: t('questDilatoryBossRageTitle'), - description: t('questDilatoryBossRageDescription'), - value: 4000000, - tavern: t('questDilatoryBossRageTavern'), - stables: t('questDilatoryBossRageStables'), - market: t('questDilatoryBossRageMarket'), - }, - }, - drop: { - items: [ - { - type: 'pets', - key: 'MantisShrimp-Base', - text: t('questDilatoryDropMantisShrimpPet'), - }, { - type: 'mounts', - key: 'MantisShrimp-Base', - text: t('questDilatoryDropMantisShrimpMount'), - }, { - type: 'food', - key: 'Meat', - text: t('foodMeat'), - }, { - type: 'food', - key: 'Milk', - text: t('foodMilk'), - }, { - type: 'food', - key: 'Potatoe', - text: t('foodPotatoe'), - }, { - type: 'food', - key: 'Strawberry', - text: t('foodStrawberry'), - }, { - type: 'food', - key: 'Chocolate', - text: t('foodChocolate'), - }, { - type: 'food', - key: 'Fish', - text: t('foodFish'), - }, { - type: 'food', - key: 'RottenMeat', - text: t('foodRottenMeat'), - }, { - type: 'food', - key: 'CottonCandyPink', - text: t('foodCottonCandyPink'), - }, { - type: 'food', - key: 'CottonCandyBlue', - text: t('foodCottonCandyBlue'), - }, { - type: 'food', - key: 'Honey', - text: t('foodHoney'), - }, - ], - gp: 0, - exp: 0, - }, - }, - dysheartener: { - text: t('questDysheartenerText'), - notes: t('questDysheartenerNotes'), - completion: t('questDysheartenerCompletion'), - completionChat: t('questDysheartenerCompletionChat'), - value: 0, - canBuy () { - return false; - }, - category: 'world', - boss: { - name: t('questDysheartenerText'), - hp: 17000000, - str: 1.25, - def: 1, - rage: { - title: t('questDysheartenerBossRageTitle'), - description: t('questDysheartenerBossRageDescription'), - value: 500000, - seasonalShop: t('questDysheartenerBossRageSeasonal'), - market: t('questDysheartenerBossRageMarket'), - quests: t('questDysheartenerBossRageQuests'), - }, - }, - colors: { - dark: '#410F2A', - medium: '#5C1130', - light: '#931F4D', - extralight: '#DC4069', - }, - drop: { - items: [ - { - type: 'pets', - key: 'Hippogriff-Hopeful', - text: t('questDysheartenerDropHippogriffPet'), - }, { - type: 'mounts', - key: 'Hippogriff-Hopeful', - text: t('questDysheartenerDropHippogriffMount'), - }, { - type: 'food', - key: 'Cake_Base', - text: t('foodCakeBase'), - }, { - type: 'food', - key: 'Candy_White', - text: t('foodCandyWhite'), - }, { - type: 'food', - key: 'Cake_Desert', - text: t('foodCakeDesert'), - }, { - type: 'food', - key: 'Candy_Red', - text: t('foodCandyRed'), - }, { - type: 'food', - key: 'Cake_Shade', - text: t('foodCakeShade'), - }, { - type: 'food', - key: 'Candy_Skeleton', - text: t('foodCandySkeleton'), - }, { - type: 'food', - key: 'Cake_Zombie', - text: t('foodCakeZombie'), - }, { - type: 'food', - key: 'Candy_CottonCandyPink', - text: t('foodCandyCottonCandyPink'), - }, { - type: 'food', - key: 'Candy_CottonCandyBlue', - text: t('foodCandyCottonCandyBlue'), - }, { - type: 'food', - key: 'Cake_Golden', - text: t('foodCakeGolden'), - }, - ], - gp: 0, - exp: 0, - }, - }, - stressbeast: { - text: t('questStressbeastText'), - notes: t('questStressbeastNotes'), - completion: t('questStressbeastCompletion'), - completionChat: t('questStressbeastCompletionChat'), - value: 0, - canBuy () { - return false; - }, - category: 'world', - boss: { - name: t('questStressbeastBoss'), - hp: 2750000, - str: 1, - def: 1, - rage: { - title: t('questStressbeastBossRageTitle'), - description: t('questStressbeastBossRageDescription'), - value: 1450000, - healing: 0.3, - stables: t('questStressbeastBossRageStables'), - bailey: t('questStressbeastBossRageBailey'), - guide: t('questStressbeastBossRageGuide'), - }, - desperation: { - threshold: 500000, - str: 3.5, - def: 2, - text: t('questStressbeastDesperation'), - }, - }, - drop: { - items: [ - { - type: 'pets', - key: 'Mammoth-Base', - text: t('questStressbeastDropMammothPet'), - }, { - type: 'mounts', - key: 'Mammoth-Base', - text: t('questStressbeastDropMammothMount'), - }, { - type: 'food', - key: 'Meat', - text: t('foodMeat'), - }, { - type: 'food', - key: 'Milk', - text: t('foodMilk'), - }, { - type: 'food', - key: 'Potatoe', - text: t('foodPotatoe'), - }, { - type: 'food', - key: 'Strawberry', - text: t('foodStrawberry'), - }, { - type: 'food', - key: 'Chocolate', - text: t('foodChocolate'), - }, { - type: 'food', - key: 'Fish', - text: t('foodFish'), - }, { - type: 'food', - key: 'RottenMeat', - text: t('foodRottenMeat'), - }, { - type: 'food', - key: 'CottonCandyPink', - text: t('foodCottonCandyPink'), - }, { - type: 'food', - key: 'CottonCandyBlue', - text: t('foodCottonCandyBlue'), - }, { - type: 'food', - key: 'Honey', - text: t('foodHoney'), - }, - ], - gp: 0, - exp: 0, - }, - }, -}; +// need to reconstruct a flat list from these by -- +// check for a lodash object tht will combine multiple objects into one obects +// I've added an additional ayer to the tree that the api and the rest of the +// code in this file are not expecting hence api.quests not being found +const quests = [ + questGeneric, + questSeries, + questMasterclasser, + questSeasonal, + questPets, + questPotions, + questTimeTravel, + questWorld, +]; +console.log(quests); each(quests, (v, key) => { defaults(v, { key, From 40f8c049abc95439a243eac01f92b909b3c9b12c Mon Sep 17 00:00:00 2001 From: CuriousMagpie Date: Wed, 2 Feb 2022 16:25:28 -0500 Subject: [PATCH 17/23] concatenate quest constant arrays into a single quests variable --- website/common/script/content/quests.js | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/website/common/script/content/quests.js b/website/common/script/content/quests.js index 11535a6816..33230edce2 100644 --- a/website/common/script/content/quests.js +++ b/website/common/script/content/quests.js @@ -7,22 +7,22 @@ import t from './translation'; import { USER_CAN_OWN_QUEST_CATEGORIES, QUEST_GENERIC, - QUEST_SERIES, QUEST_MASTERCLASSER, - QUEST_SEASONAL, QUEST_PETS, QUEST_POTIONS, + QUEST_SEASONAL, + QUEST_SERIES, QUEST_TIME_TRAVEL, QUEST_WORLD, } from './constants'; const userCanOwnQuestCategories = USER_CAN_OWN_QUEST_CATEGORIES; const questGeneric = QUEST_GENERIC; -const questSeries = QUEST_SERIES; const questMasterclasser = QUEST_MASTERCLASSER; -const questSeasonal = QUEST_SEASONAL; const questPets = QUEST_PETS; const questPotions = QUEST_POTIONS; +const questSeasonal = QUEST_SEASONAL; +const questSeries = QUEST_SERIES; const questTimeTravel = QUEST_TIME_TRAVEL; const questWorld = QUEST_WORLD; @@ -31,16 +31,15 @@ const questWorld = QUEST_WORLD; // I've added an additional ayer to the tree that the api and the rest of the // code in this file are not expecting hence api.quests not being found -const quests = [ - questGeneric, - questSeries, +const quests = questGeneric.concat( questMasterclasser, - questSeasonal, questPets, questPotions, + questSeasonal, + questSeries, questTimeTravel, questWorld, -]; +); console.log(quests); each(quests, (v, key) => { defaults(v, { From 98b43c681afa83e7d3b981eca1eb504e9ddece9c Mon Sep 17 00:00:00 2001 From: CuriousMagpie Date: Wed, 2 Feb 2022 16:48:48 -0500 Subject: [PATCH 18/23] use spread operator to combine multiple quest objects into one --- website/common/script/content/quests.js | 27 ++++++++++--------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/website/common/script/content/quests.js b/website/common/script/content/quests.js index 33230edce2..be62c01be9 100644 --- a/website/common/script/content/quests.js +++ b/website/common/script/content/quests.js @@ -1,7 +1,5 @@ import defaults from 'lodash/defaults'; import each from 'lodash/each'; -// import find from 'lodash/find'; -// import moment from 'moment'; import sortBy from 'lodash/sortBy'; import t from './translation'; import { @@ -26,21 +24,18 @@ const questSeries = QUEST_SERIES; const questTimeTravel = QUEST_TIME_TRAVEL; const questWorld = QUEST_WORLD; -// need to reconstruct a flat list from these by -- -// check for a lodash object tht will combine multiple objects into one obects -// I've added an additional ayer to the tree that the api and the rest of the -// code in this file are not expecting hence api.quests not being found +// this uses the spread operator, which allows us to combine multiple objects into one +const quests = { + ...questGeneric, + ...questMasterclasser, + ...questPets, + ...questPotions, + ...questSeasonal, + ...questSeries, + ...questTimeTravel, + ...questWorld, +}; -const quests = questGeneric.concat( - questMasterclasser, - questPets, - questPotions, - questSeasonal, - questSeries, - questTimeTravel, - questWorld, -); -console.log(quests); each(quests, (v, key) => { defaults(v, { key, From 55443ecc23a10910470c846f2169eab82970d6bb Mon Sep 17 00:00:00 2001 From: CuriousMagpie Date: Thu, 3 Feb 2022 12:10:16 -0500 Subject: [PATCH 19/23] revert files to develop --- .../components/shops/quests/questPopover.vue | 2 +- website/common/script/libs/getItemInfo.js | 31 ++++--------------- .../script/ops/buy/abstractBuyOperation.js | 17 ---------- website/common/script/ops/buy/buyQuestGem.js | 10 ------ website/common/script/ops/buy/buyQuestGold.js | 19 +++++------- 5 files changed, 14 insertions(+), 65 deletions(-) diff --git a/website/client/src/components/shops/quests/questPopover.vue b/website/client/src/components/shops/quests/questPopover.vue index b50aaa328a..40b4b59e35 100644 --- a/website/client/src/components/shops/quests/questPopover.vue +++ b/website/client/src/components/shops/quests/questPopover.vue @@ -13,7 +13,7 @@ {{ item.text }}
{{ $t('questUnlockLostMasterclasser') }} diff --git a/website/common/script/libs/getItemInfo.js b/website/common/script/libs/getItemInfo.js index 85906604f5..e7ffb300b6 100644 --- a/website/common/script/libs/getItemInfo.js +++ b/website/common/script/libs/getItemInfo.js @@ -9,27 +9,12 @@ import isFreeRebirth from './isFreeRebirth'; import getOfficialPinnedItems from './getOfficialPinnedItems'; function lockQuest (quest, user) { - // checks series quests, including Masterclasser? - if (quest.prereqQuests) { - if (!user.achievements.quests) return true; - for (const prereq of quest.prereqQuests) { - if (!user.achievements.quests[prereq]) return true; - } - } - // checks quest & user level against quest level + if (quest.key === 'lostMasterclasser1') return !(user.achievements.quests.dilatoryDistress3 && user.achievements.quests.mayhemMistiflying3 && user.achievements.quests.stoikalmCalamity3 && user.achievements.quests.taskwoodsTerror3); if (quest.lvl && user.stats.lvl < quest.lvl) return true; - - // checks unlockCondition.incentiveThreshold - if ( - quest.unlockCondition - && quest.unlockCondition.incentiveThreshold - && user.loginIncentives < quest.unlockCondition.incentiveThreshold - ) return true; - if (user.achievements.quests) { - return quest.previous - && !user.achievements.quests[quest.previous]; + if (quest.unlockCondition && (quest.key === 'moon1' || quest.key === 'moon2' || quest.key === 'moon3')) { + return user.loginIncentives < quest.unlockCondition.incentiveThreshold; } - // then if we've passed all the checks + if (user.achievements.quests) return quest.previous && !user.achievements.quests[quest.previous]; return quest.previous; } @@ -67,9 +52,7 @@ export default function getItemInfo (user, type, item, officialPinnedItems, lang let itemInfo; - switch ( // eslint-disable-line default-case - type - ) { + switch (type) { // eslint-disable-line default-case case 'eggs': itemInfo = { key: item.key, @@ -108,9 +91,7 @@ export default function getItemInfo (user, type, item, officialPinnedItems, lang locked: false, currency: 'gems', purchaseType: 'hatchingPotions', - path: item.wacky - ? `wackyHatchingPotions.${item.key}` - : `premiumHatchingPotions.${item.key}`, + path: item.wacky ? `wackyHatchingPotions.${item.key}` : `premiumHatchingPotions.${item.key}`, pinType: 'premiumHatchingPotion', event: item.event, }; diff --git a/website/common/script/ops/buy/abstractBuyOperation.js b/website/common/script/ops/buy/abstractBuyOperation.js index 7ff275d917..084fae5ce4 100644 --- a/website/common/script/ops/buy/abstractBuyOperation.js +++ b/website/common/script/ops/buy/abstractBuyOperation.js @@ -56,15 +56,6 @@ export class AbstractBuyOperation { return item.type; } - /** - * Returns the item lock status - * @param item - * @returns {String} - */ - getItemLock (item) { // eslint-disable-line class-methods-use-this - return item.locked; - } - /** * Shortcut to get the translated string without passing `req.language` * @param {String} key - translation key @@ -150,10 +141,6 @@ export class AbstractGoldItemOperation extends AbstractBuyOperation { if (item && item.canOwn && !item.canOwn(user)) { throw new NotAuthorized(this.i18n('cannotBuyItem')); } - - if (item.locked === 'locked') { - throw new NotAuthorized(this.i18n('cannotBuyItem')); - } } async subtractCurrency (user, item) { @@ -184,10 +171,6 @@ export class AbstractGemItemOperation extends AbstractBuyOperation { if (!user.balance || user.balance < itemValue * this.quantity) { throw new NotAuthorized(this.i18n('notEnoughGems')); } - - if (item.locked === 'locked') { - throw new NotAuthorized(this.i18n('cannotBuyItem')); - } } async subtractCurrency (user, item) { diff --git a/website/common/script/ops/buy/buyQuestGem.js b/website/common/script/ops/buy/buyQuestGem.js index 87fa47a33b..c086a81b79 100644 --- a/website/common/script/ops/buy/buyQuestGem.js +++ b/website/common/script/ops/buy/buyQuestGem.js @@ -8,7 +8,6 @@ import content from '../../content/index'; import errorMessage from '../../libs/errorMessage'; import { AbstractGemItemOperation } from './abstractBuyOperation'; -// import itemInfo from '../../libs/getItemInfo'; export class BuyQuestWithGemOperation extends AbstractGemItemOperation { // eslint-disable-line import/prefer-default-export, max-len multiplePurchaseAllowed () { // eslint-disable-line class-methods-use-this @@ -27,10 +26,6 @@ export class BuyQuestWithGemOperation extends AbstractGemItemOperation { // esli return 'quest'; } - getItemLock (item) { // eslint-disable-line class-methods-use-this - return item.locked; - } - extractAndValidateParams (user, req) { this.key = get(req, 'params.key'); const { key } = this; @@ -38,11 +33,6 @@ export class BuyQuestWithGemOperation extends AbstractGemItemOperation { // esli const item = content.quests[key]; - // if (quest.locked) { - // throw new - // BadRequest(errorMessage(`Prerequisites for ${itemInfo.text} not met.`)); - // } - if (!item) throw new NotFound(errorMessage('questNotFound', { key })); if (item.category === 'gold') { diff --git a/website/common/script/ops/buy/buyQuestGold.js b/website/common/script/ops/buy/buyQuestGold.js index bef8987ed3..10a0cfadcb 100644 --- a/website/common/script/ops/buy/buyQuestGold.js +++ b/website/common/script/ops/buy/buyQuestGold.js @@ -14,12 +14,12 @@ export class BuyQuestWithGoldOperation extends AbstractGoldItemOperation { // es return true; } - // userAbleToStartMasterClasser (user) { // eslint-disable-line class-methods-use-this - // return user.achievements.quests.dilatoryDistress3 - // && user.achievements.quests.mayhemMistiflying3 - // && user.achievements.quests.stoikalmCalamity3 - // && user.achievements.quests.taskwoodsTerror3; - // } + userAbleToStartMasterClasser (user) { // eslint-disable-line class-methods-use-this + return user.achievements.quests.dilatoryDistress3 + && user.achievements.quests.mayhemMistiflying3 + && user.achievements.quests.stoikalmCalamity3 + && user.achievements.quests.taskwoodsTerror3; + } getItemKey () { return this.key; @@ -33,10 +33,6 @@ export class BuyQuestWithGoldOperation extends AbstractGoldItemOperation { // es return 'quest'; } - getItemLock (item) { // eslint-disable-line class-methods-use-this - return item.locked; - } - extractAndValidateParams (user, req) { this.key = get(req, 'params.key'); const { key } = this; @@ -57,8 +53,7 @@ export class BuyQuestWithGoldOperation extends AbstractGoldItemOperation { // es checkPrerequisites (user, questKey) { const item = content.quests[questKey]; - if (questKey.startsWith('lostMasterclasser') - && !this.userAbleToStartMasterClasser(user)) { + if (questKey === 'lostMasterclasser1' && !this.userAbleToStartMasterClasser(user)) { throw new NotAuthorized(this.i18n('questUnlockLostMasterclasser')); } From 1785ac8226821d31a08840abcf3274b885348aea Mon Sep 17 00:00:00 2001 From: CuriousMagpie Date: Wed, 9 Mar 2022 15:39:42 -0500 Subject: [PATCH 20/23] added Birds of a Feather achievement --- habitica-images | 2 +- website/client/src/components/notifications.vue | 10 ++++++++++ website/common/locales/en/achievements.json | 5 ++++- website/common/script/content/achievements.js | 5 +++++ .../content/constants/animalSetAchievements.js | 15 +++++++++++++++ website/common/script/libs/achievements.js | 1 + website/server/models/userNotification.js | 1 + 7 files changed, 37 insertions(+), 2 deletions(-) diff --git a/habitica-images b/habitica-images index db1c63db00..30c7e4a39d 160000 --- a/habitica-images +++ b/habitica-images @@ -1 +1 @@ -Subproject commit db1c63db002487038e443e2c8872dfad80d136ee +Subproject commit 30c7e4a39dee61ac8e9eb127dcc1f8d4af6b2313 diff --git a/website/client/src/components/notifications.vue b/website/client/src/components/notifications.vue index 2960b0889e..77de66ef28 100644 --- a/website/client/src/components/notifications.vue +++ b/website/client/src/components/notifications.vue @@ -450,6 +450,14 @@ const NOTIFICATIONS = { achievement: 'zodiacZookeeper', }, }, + ACHIEVEMENT_BIRDS_OF_A_FEATHER: { + achievement: true, + label: $t => `${$t('achievement')}: ${$t('achievementBirdsOfAFeather')}`, + modalId: 'generic-achievement', + data: { + achievement: 'birdsOfAFeather', + }, + }, }; export default { @@ -514,6 +522,7 @@ export default { 'ACHIEVEMENT_RED_LETTER_DAY', 'ACHIEVEMENT_LEGENDARY_BESTIARY', 'ACHIEVEMENT_SEASONAL_SPECIALIST', 'ACHIEVEMENT_VIOLETS_ARE_BLUE', 'ACHIEVEMENT_WILD_BLUE_YONDER', 'ACHIEVEMENT_DOMESTICATED', 'ACHIEVEMENT_SHADY_CUSTOMER', 'ACHIEVEMENT_SHADE_OF_IT_ALL', 'ACHIEVEMENT_ZODIAC_ZOOKEEPER', + 'ACHIEVEMENT_BIRDS_OF_A_FEATHER', ].forEach(type => { handledNotifications[type] = true; }); @@ -948,6 +957,7 @@ export default { case 'ACHIEVEMENT_SHADY_CUSTOMER': case 'ACHIEVEMENT_SHADE_OF_IT_ALL': case 'ACHIEVEMENT_ZODIAC_ZOOKEEPER': + case 'ACHIEVEMENT_BIRDS_OF_A_FEATHER': case 'GENERIC_ACHIEVEMENT': this.showNotificationWithModal(notification); break; diff --git a/website/common/locales/en/achievements.json b/website/common/locales/en/achievements.json index a5ab0beb81..8e86fdf717 100644 --- a/website/common/locales/en/achievements.json +++ b/website/common/locales/en/achievements.json @@ -126,5 +126,8 @@ "achievementShadeOfItAllModalText": "You tamed all the Shade Mounts!", "achievementZodiacZookeeper": "Zodiac Zookeeper", "achievementZodiacZookeeperText": "Has hatched all the zodiac pets: Rat, Cow, Bunny, Snake, Horse, Sheep, Monkey, Rooster, Wolf, Tiger, Flying Pig, and Dragon!", - "achievementZodiacZookeeperModalText": "You collected all the zodiac pets!" + "achievementZodiacZookeeperModalText": "You collected all the zodiac pets!", + "achievementBirdsOfAFeather": "Birds of a Feather", + "achievementBirdsOfAFeatherText": "Has hatched all the flying pets: Flying Pig, Owl, Parrot, Pterodactyl, Gryphon, and Falcon.", + "achievementBirdsOfAFeatherModalText":"You collected all the flying pets!" } diff --git a/website/common/script/content/achievements.js b/website/common/script/content/achievements.js index 7d798eb638..b8f7ba8aab 100644 --- a/website/common/script/content/achievements.js +++ b/website/common/script/content/achievements.js @@ -272,6 +272,11 @@ const basicAchievs = { titleKey: 'achievementZodiacZookeeper', textKey: 'achievementZodiacZookeeperText', }, + birdsOfAFeather: { + icon: 'achievement-birdsOfAFeather', + titleKey: 'achievementBirdsOfAFeather', + textKey: 'achievementBirdsOfAFeatherText', + }, }; Object.assign(achievementsData, basicAchievs); diff --git a/website/common/script/content/constants/animalSetAchievements.js b/website/common/script/content/constants/animalSetAchievements.js index 5bdd8e039d..130d4dcc0a 100644 --- a/website/common/script/content/constants/animalSetAchievements.js +++ b/website/common/script/content/constants/animalSetAchievements.js @@ -26,6 +26,21 @@ const ANIMAL_SET_ACHIEVEMENTS = { achievementKey: 'domesticated', notificationType: 'ACHIEVEMENT_DOMESTICATED', }, + birdsOfAFeather: { + type: 'pet', + species: [ + 'FlyingPig', + 'Owl', + 'Parrot', + 'Pterodactyl', + 'Gryphon', + 'Falcon', + 'Rooster', + 'Peacock', + ], + achievementKey: 'birdsOfAFeather', + notificationType: 'ACHIEVEMENT_BIRDS_OF_A_FEATHER', + }, zodiacZookeeper: { type: 'pet', species: [ diff --git a/website/common/script/libs/achievements.js b/website/common/script/libs/achievements.js index 0718d63d40..cbd0071cbb 100644 --- a/website/common/script/libs/achievements.js +++ b/website/common/script/libs/achievements.js @@ -216,6 +216,7 @@ function _getBasicAchievements (user, language) { _addSimple(result, user, { path: 'shadyCustomer', language }); _addSimple(result, user, { path: 'shadeOfItAll', language }); _addSimple(result, user, { path: 'zodiacZookeeper', language }); + _addSimple(result, user, { path: 'birdsOfAFeather', language }); _addSimpleWithMasterCount(result, user, { path: 'beastMaster', language }); _addSimpleWithMasterCount(result, user, { path: 'mountMaster', language }); diff --git a/website/server/models/userNotification.js b/website/server/models/userNotification.js index 4171b14cbe..c6b12351e7 100644 --- a/website/server/models/userNotification.js +++ b/website/server/models/userNotification.js @@ -71,6 +71,7 @@ const NOTIFICATION_TYPES = [ 'ACHIEVEMENT_SHADY_CUSTOMER', 'ACHIEVEMENT_SHADE_OF_IT_ALL', 'ACHIEVEMENT_ZODIAC_ZOOKEEPER', + 'ACHIEVEMENT_BIRDS_OF_A_FEATHER', 'ACHIEVEMENT', // generic achievement notification, details inside `notification.data` 'DROP_CAP_REACHED', ]; From 19cf89baecfea7af34ed8ffc0eb12d5312493724 Mon Sep 17 00:00:00 2001 From: SabreCat Date: Thu, 7 Apr 2022 15:29:52 -0500 Subject: [PATCH 21/23] fix(pr): remove unrelated change --- .../content/constants/animalSetAchievements.js | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/website/common/script/content/constants/animalSetAchievements.js b/website/common/script/content/constants/animalSetAchievements.js index f9591aceea..55e89301c4 100644 --- a/website/common/script/content/constants/animalSetAchievements.js +++ b/website/common/script/content/constants/animalSetAchievements.js @@ -41,21 +41,6 @@ const ANIMAL_SET_ACHIEVEMENTS = { achievementKey: 'domesticated', notificationType: 'ACHIEVEMENT_DOMESTICATED', }, - birdsOfAFeather: { - type: 'pet', - species: [ - 'FlyingPig', - 'Owl', - 'Parrot', - 'Pterodactyl', - 'Gryphon', - 'Falcon', - 'Rooster', - 'Peacock', - ], - achievementKey: 'birdsOfAFeather', - notificationType: 'ACHIEVEMENT_BIRDS_OF_A_FEATHER', - }, zodiacZookeeper: { type: 'pet', species: [ From 405721602fcdb9c7aca369b1098ef52a067322d8 Mon Sep 17 00:00:00 2001 From: SabreCat Date: Thu, 7 Apr 2022 15:51:14 -0500 Subject: [PATCH 22/23] fix(quests): correct events import, prod bug with seasonal availability --- .../script/content/constants/questSeasonal.js | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/website/common/script/content/constants/questSeasonal.js b/website/common/script/content/constants/questSeasonal.js index 166b2896e4..ed792d7c5c 100644 --- a/website/common/script/content/constants/questSeasonal.js +++ b/website/common/script/content/constants/questSeasonal.js @@ -1,6 +1,6 @@ import find from 'lodash/find'; import moment from 'moment'; -import EVENTS from 'events'; +import { EVENTS } from './events'; import t from '../translation'; const CURRENT_EVENT = find( @@ -33,6 +33,9 @@ const QUEST_SEASONAL = { gp: 20, exp: 100, }, + canBuy () { + return this.event && moment().isBetween(this.event.start, this.event.end); + }, }, evilsanta2: { event: CURRENT_EVENT && CURRENT_EVENT.season === 'winter' ? CURRENT_EVENT : null, @@ -63,6 +66,9 @@ const QUEST_SEASONAL = { gp: 20, exp: 100, }, + canBuy () { + return this.event && moment().isBetween(this.event.start, this.event.end); + }, }, // spring egg: { @@ -125,6 +131,9 @@ const QUEST_SEASONAL = { gp: 0, exp: 0, }, + canBuy () { + return this.event && moment().isBetween(this.event.start, this.event.end); + }, }, waffle: { text: t('questWaffleText'), @@ -165,6 +174,9 @@ const QUEST_SEASONAL = { exp: 500, unlock: t('questWaffleUnlockText'), }, + canBuy () { + return this.event && moment().isBetween(this.event.start, this.event.end); + }, }, }; From c8ee51b7412db9e276e8ae79261f881c05ba5f2d Mon Sep 17 00:00:00 2001 From: CuriousMagpie Date: Mon, 11 Apr 2022 17:10:01 -0400 Subject: [PATCH 23/23] move quest constants to their own folder --- website/common/script/content/constants/index.js | 16 ++++++++-------- .../questGeneric.js => quests/generic.js} | 0 .../masterclasser.js} | 0 .../{constants/questPets.js => quests/pets.js} | 0 .../questPotions.js => quests/potions.js} | 0 .../questSeasonal.js => quests/seasonal.js} | 2 +- .../questSeries.js => quests/series.js} | 0 .../questTimeTravel.js => quests/timeTravel.js} | 0 .../{constants/questWorld.js => quests/world.js} | 0 9 files changed, 9 insertions(+), 9 deletions(-) rename website/common/script/content/{constants/questGeneric.js => quests/generic.js} (100%) rename website/common/script/content/{constants/questMasterclasser.js => quests/masterclasser.js} (100%) rename website/common/script/content/{constants/questPets.js => quests/pets.js} (100%) rename website/common/script/content/{constants/questPotions.js => quests/potions.js} (100%) rename website/common/script/content/{constants/questSeasonal.js => quests/seasonal.js} (99%) rename website/common/script/content/{constants/questSeries.js => quests/series.js} (100%) rename website/common/script/content/{constants/questTimeTravel.js => quests/timeTravel.js} (100%) rename website/common/script/content/{constants/questWorld.js => quests/world.js} (100%) diff --git a/website/common/script/content/constants/index.js b/website/common/script/content/constants/index.js index 6e37ade3e4..044bb68039 100644 --- a/website/common/script/content/constants/index.js +++ b/website/common/script/content/constants/index.js @@ -33,11 +33,11 @@ export { default as ANIMAL_COLOR_ACHIEVEMENTS } from './animalColorAchievements' export { default as ANIMAL_SET_ACHIEVEMENTS } from './animalSetAchievements'; export { default as QUEST_SERIES_ACHIEVEMENTS } from './questSeriesAchievements'; export { default as ITEM_LIST } from './itemList'; -export { default as QUEST_SERIES } from './questSeries'; -export { default as QUEST_MASTERCLASSER } from './questMasterclasser'; -export { default as QUEST_GENERIC } from './questGeneric'; -export { default as QUEST_SEASONAL } from './questSeasonal'; -export { default as QUEST_PETS } from './questPets'; -export { default as QUEST_POTIONS } from './questPotions'; -export { default as QUEST_TIME_TRAVEL } from './questTimeTravel'; -export { default as QUEST_WORLD } from './questWorld'; +export { default as QUEST_SERIES } from '../quests/series'; +export { default as QUEST_MASTERCLASSER } from '../quests/masterclasser'; +export { default as QUEST_GENERIC } from '../quests/generic'; +export { default as QUEST_SEASONAL } from '../quests/seasonal'; +export { default as QUEST_PETS } from '../quests/pets'; +export { default as QUEST_POTIONS } from '../quests/potions'; +export { default as QUEST_TIME_TRAVEL } from '../quests/timeTravel'; +export { default as QUEST_WORLD } from '../quests/world'; diff --git a/website/common/script/content/constants/questGeneric.js b/website/common/script/content/quests/generic.js similarity index 100% rename from website/common/script/content/constants/questGeneric.js rename to website/common/script/content/quests/generic.js diff --git a/website/common/script/content/constants/questMasterclasser.js b/website/common/script/content/quests/masterclasser.js similarity index 100% rename from website/common/script/content/constants/questMasterclasser.js rename to website/common/script/content/quests/masterclasser.js diff --git a/website/common/script/content/constants/questPets.js b/website/common/script/content/quests/pets.js similarity index 100% rename from website/common/script/content/constants/questPets.js rename to website/common/script/content/quests/pets.js diff --git a/website/common/script/content/constants/questPotions.js b/website/common/script/content/quests/potions.js similarity index 100% rename from website/common/script/content/constants/questPotions.js rename to website/common/script/content/quests/potions.js diff --git a/website/common/script/content/constants/questSeasonal.js b/website/common/script/content/quests/seasonal.js similarity index 99% rename from website/common/script/content/constants/questSeasonal.js rename to website/common/script/content/quests/seasonal.js index ed792d7c5c..b536cb41ad 100644 --- a/website/common/script/content/constants/questSeasonal.js +++ b/website/common/script/content/quests/seasonal.js @@ -1,6 +1,6 @@ import find from 'lodash/find'; import moment from 'moment'; -import { EVENTS } from './events'; +import { EVENTS } from '../constants/events'; import t from '../translation'; const CURRENT_EVENT = find( diff --git a/website/common/script/content/constants/questSeries.js b/website/common/script/content/quests/series.js similarity index 100% rename from website/common/script/content/constants/questSeries.js rename to website/common/script/content/quests/series.js diff --git a/website/common/script/content/constants/questTimeTravel.js b/website/common/script/content/quests/timeTravel.js similarity index 100% rename from website/common/script/content/constants/questTimeTravel.js rename to website/common/script/content/quests/timeTravel.js diff --git a/website/common/script/content/constants/questWorld.js b/website/common/script/content/quests/world.js similarity index 100% rename from website/common/script/content/constants/questWorld.js rename to website/common/script/content/quests/world.js