diff --git a/common/script/content/index.coffee b/common/script/content/index.coffee index a7eac79718..6ed54553d3 100644 --- a/common/script/content/index.coffee +++ b/common/script/content/index.coffee @@ -654,7 +654,7 @@ quests = require('../../dist/scripts/content/quests/index') api.userCanOwnQuestCategories = quests.canOwnCategories -api.quests = quests.scrolls +api.quests = quests.allQuests api.questsByLevel = quests.byLevel diff --git a/common/script/src/content/quests/gold-purchasable.js b/common/script/src/content/quests/gold-purchasable.js new file mode 100644 index 0000000000..2f4be14923 --- /dev/null +++ b/common/script/src/content/quests/gold-purchasable.js @@ -0,0 +1,128 @@ +import {each, defaults, assign} from 'lodash'; +import capitalize from 'lodash.capitalize'; +import camelCase from 'lodash.camelCase'; +import t from '../helpers/translator'; + +let dilatoryDistressSeries = { + dilatoryDistress1: { + goldValue: 200, + collect: { + fireCoral: { + text: t('questDilatoryDistress1CollectFireCoral'), + count: 25 + }, + blueFins: { + text: t('questDilatoryDistress1CollectBlueFins'), + count: 25 + } + }, + drop: { + items: [ + { + type: 'gear', + key: 'armor_special_finnedOceanicArmor', + text: t('questDilatoryDistress1DropArmor') + } + ], + exp: 75 + } + }, + dilatoryDistress2: { + previous: 'dilatoryDistress1', + goldValue: 300, + boss: { + hp: 500, + rage: { + title: t('questDilatoryDistress2RageTitle'), + description: t('questDilatoryDistress2RageDescription'), + value: 50, + healing: .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') + } + ], + exp: 500 + } + }, + dilatoryDistress3: { + previous: 'dilatoryDistress2', + goldValue: 400, + boss: { + 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') + } + ], + exp: 650 + }, + }, +}; + +let goldPurchasableQuests = { }; + +assign(goldPurchasableQuests, dilatoryDistressSeries); + +each(goldPurchasableQuests, (quest, name) => { + let camelName = camelCase(name); + let capitalizedName = capitalize(camelName); + + let questDefaults = { + text: t(`quest${capitalizedName}Text`), + notes: t(`quest${capitalizedName}Notes`), + completion: t(`quest${capitalizedName}Completion`), + category: 'gold', + value: 4, + }; + + let bossDefaults = { + name: t(`quest${capitalizedName}Boss`), + }; + + let dropDefaults = { + gold: 0 + }; + + defaults(quest, questDefaults); + + if (quest.boss) defaults(quest.boss, bossDefaults); + if (quest.drop) defaults(quest.drop, dropDefaults); +}); + +export default goldPurchasableQuests; diff --git a/common/script/src/content/quests/holiday.js b/common/script/src/content/quests/holiday.js new file mode 100644 index 0000000000..b01357a436 --- /dev/null +++ b/common/script/src/content/quests/holiday.js @@ -0,0 +1,124 @@ +import {each, defaults} from 'lodash'; +import capitalize from 'lodash.capitalize'; +import t from '../helpers/translator'; + +let holidayQuests = { + evilsanta: { + boss: { + name: t('questEvilSantaBoss'), + hp: 300, + str: 1 + }, + drop: { + items: [ + { + type: 'mounts', + key: 'BearCub-Polar', + text: t('questEvilSantaDropBearCubPolarMount') + } + ], + gp: 20, + exp: 100 + } + }, + evilsanta2: { + previous: 'evilsanta', + 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 + } + }, + egg: { + text: t('questEggHuntText'), + notes: t('questEggHuntNotes'), + completion: t('questEggHuntCompletion'), + value: 1, + collect: { + plainEgg: { + text: t('questEggHuntCollectPlainEgg'), + count: 100 + } + }, + 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 + } + }, +}; + +each(holidayQuests, (quest, name) => { + let capitalizedName = capitalize(name); + let questDefaults = { + text: t(`quest${capitalizedName}Text`), + notes: t(`quest${capitalizedName}Notes`), + completion: t(`quest${capitalizedName}Completion`), + canBuy: false, + value: 4, + category: 'pet', + }; + + defaults(quest, questDefaults); +}); + + +export default holidayQuests; diff --git a/common/script/src/content/quests/index.js b/common/script/src/content/quests/index.js index c553d89478..4d088fe72f 100644 --- a/common/script/src/content/quests/index.js +++ b/common/script/src/content/quests/index.js @@ -1,1469 +1,27 @@ -import {each, defaults, sortBy} from 'lodash'; +import {each, assign, defaults, sortBy} from 'lodash'; import t from '../helpers/translator'; +import worldQuests from './world'; +import holidayQuests from './holiday'; +import petQuests from './pet'; +import unlockableQuests from './unlockable'; +import goldPurchasableQuests from './gold-purchasable'; + const QUEST_BOSS_DEFAULTS = { str: 1, def: 1 }; const QUEST_BOSS_RAGE_DEFAULTS = { title: t('bossRageTitle'), description: t('bossRageDescription'), }; -let scrolls = { - dilatory: { - text: t('questDilatoryText'), - notes: t('questDilatoryNotes'), - completion: t('questDilatoryCompletion'), - value: 0, - canBuy: 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: false, - category: 'world', - boss: { - name: t('questStressbeastBoss'), - hp: 2750000, - str: 1, - def: 1, - rage: { - title: t('questStressbeastBossRageTitle'), - description: t('questStressbeastBossRageDescription'), - value: 1450000, - healing: .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 - } - }, - evilsanta: { - canBuy: false, - text: t('questEvilSantaText'), - notes: t('questEvilSantaNotes'), - 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: { - canBuy: false, - text: t('questEvilSanta2Text'), - notes: t('questEvilSanta2Notes'), - completion: t('questEvilSanta2Completion'), - value: 4, - previous: 'evilsanta', - 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: { - 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'), - value: 4, - lvl: 30, - category: 'unlockable', - boss: { - name: t('questVice1Boss'), - hp: 750, - str: 1.5 - }, - drop: { - items: [ - { - type: 'quests', - key: 'vice2', - text: t('questVice1DropVice2Quest') - } - ], - gp: 20, - exp: 100 - } - }, - vice2: { - text: t('questVice2Text'), - notes: t('questVice2Notes'), - value: 4, - lvl: 30, - category: 'unlockable', - previous: 'vice1', - collect: { - lightCrystal: { - text: t('questVice2CollectLightCrystal'), - count: 45 - } - }, - drop: { - items: [ - { - type: 'quests', - key: 'vice3', - text: t('questVice2DropVice3Quest') - } - ], - gp: 20, - exp: 75 - } - }, - vice3: { - text: t('questVice3Text'), - notes: t('questVice3Notes'), - 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'), - value: 1, - canBuy: false, - category: 'pet', - collect: { - plainEgg: { - text: t('questEggHuntCollectPlainEgg'), - count: 100 - } - }, - 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', - 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') - } - }, - 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: { - 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') - } - }, - atom1: { - text: t('questAtom1Text'), - notes: t('questAtom1Notes'), - value: 4, - lvl: 15, - category: 'unlockable', - collect: { - soapBars: { - text: t('questAtom1CollectSoapBars'), - count: 20 - } - }, - drop: { - items: [ - { - type: 'quests', - key: 'atom2', - text: t('questAtom1Drop') - } - ], - gp: 7, - exp: 50 - } - }, - atom2: { - text: t('questAtom2Text'), - notes: t('questAtom2Notes'), - 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') - } - ], - gp: 20, - exp: 100 - } - }, - atom3: { - text: t('questAtom3Text'), - notes: t('questAtom3Notes'), - previous: '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 - } - }, - 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') - } - }, - 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') - } - }, - 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') - } - }, - moonstone1: { - text: t('questMoonstone1Text'), - notes: t('questMoonstone1Notes'), - value: 4, - lvl: 60, - category: 'unlockable', - collect: { - moonstone: { - text: t('questMoonstone1CollectMoonstone'), - count: 500 - } - }, - drop: { - items: [ - { - type: 'quests', - key: 'moonstone2', - text: t('questMoonstone1DropMoonstone2Quest') - } - ], - gp: 50, - exp: 100 - } - }, - moonstone2: { - text: t('questMoonstone2Text'), - notes: t('questMoonstone2Notes'), - 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') - } - ], - gp: 500, - exp: 1000 - } - }, - moonstone3: { - text: t('questMoonstone3Text'), - notes: t('questMoonstone3Notes'), - 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 - } - }, - goldenknight1: { - text: t('questGoldenknight1Text'), - notes: t('questGoldenknight1Notes'), - value: 4, - lvl: 40, - category: 'unlockable', - collect: { - testimony: { - text: t('questGoldenknight1CollectTestimony'), - count: 300 - } - }, - drop: { - items: [ - { - type: 'quests', - key: 'goldenknight2', - text: t('questGoldenknight1DropGoldenknight2Quest') - } - ], - gp: 15, - exp: 120 - } - }, - goldenknight2: { - text: t('questGoldenknight2Text'), - notes: t('questGoldenknight2Notes'), - 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') - } - ], - gp: 75, - exp: 750 - } - }, - goldenknight3: { - text: t('questGoldenknight3Text'), - notes: t('questGoldenknight3Notes'), - 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 - } - }, - basilist: { - text: t('questBasilistText'), - notes: t('questBasilistNotes'), - completion: t('questBasilistCompletion'), - value: 4, - 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: { - 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: .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') - } - }, - dilatoryDistress1: { - text: t('questDilatoryDistress1Text'), - notes: t('questDilatoryDistress1Notes'), - completion: t('questDilatoryDistress1Completion'), - value: 4, - goldValue: 200, - category: 'gold', - collect: { - fireCoral: { - text: t('questDilatoryDistress1CollectFireCoral'), - count: 25 - }, - blueFins: { - text: t('questDilatoryDistress1CollectBlueFins'), - count: 25 - } - }, - drop: { - items: [ - { - type: 'gear', - key: 'armor_special_finnedOceanicArmor', - text: t('questDilatoryDistress1DropArmor') - } - ], - gp: 0, - exp: 75 - } - }, - dilatoryDistress2: { - text: t('questDilatoryDistress2Text'), - notes: t('questDilatoryDistress2Notes'), - completion: t('questDilatoryDistress2Completion'), - previous: 'dilatoryDistress1', - value: 4, - goldValue: 300, - category: 'gold', - boss: { - name: t('questDilatoryDistress2Boss'), - hp: 500, - rage: { - title: t('questDilatoryDistress2RageTitle'), - description: t('questDilatoryDistress2RageDescription'), - value: 50, - healing: .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'), - completion: t('questDilatoryDistress3Completion'), - previous: '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 - } - }, - 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') - } - } -}; +let allQuests = { }; -each(scrolls, function(quest, key) { +assign(allQuests, worldQuests); +assign(allQuests, holidayQuests); +assign(allQuests, petQuests); +assign(allQuests, unlockableQuests); +assign(allQuests, goldPurchasableQuests); + +each(allQuests, function(quest, key) { defaults(quest, { key: key, canBuy: true @@ -1480,7 +38,7 @@ each(scrolls, function(quest, key) { } }); -let questsByLevel = sortBy(scrolls, (quest) => { +let questsByLevel = sortBy(allQuests, (quest) => { return quest.lvl || 0; }); @@ -1491,7 +49,7 @@ let canOwnCategories = [ ]; export default { - scrolls: scrolls, + allQuests: allQuests, byLevel: questsByLevel, canOwnCategories: canOwnCategories, -} +}; diff --git a/common/script/src/content/quests/pet.js b/common/script/src/content/quests/pet.js new file mode 100644 index 0000000000..f0a785beb9 --- /dev/null +++ b/common/script/src/content/quests/pet.js @@ -0,0 +1,373 @@ +import {each, defaults} from 'lodash'; +import capitalize from 'lodash.capitalize'; +import camelCase from 'lodash.camelCase'; +import t from '../helpers/translator'; + +let petQuests = { + gryphon: { + boss: { + hp: 300, + str: 1.5, + }, + drop: { + gp: 25, + exp: 125, + } + }, + hedgehog: { + boss: { + hp: 400, + str: 1.25 + }, + drop: { + gp: 30, + exp: 125, + } + }, + ghost_stag: { + boss: { + 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, + } + }, + rat: { + boss: { + hp: 1200, + str: 2.5 + }, + drop: { + gp: 80, + exp: 800, + } + }, + octopus: { + boss: { + hp: 1200, + str: 2.5 + }, + drop: { + gp: 80, + exp: 800, + } + }, + dilatory_derby: { + text: t('questSeahorseText'), + notes: t('questSeahorseNotes'), + completion: t('questSeahorseCompletion'), + 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') + } + }, + harpy: { + boss: { + 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, + } + }, + rooster: { + boss: { + hp: 300, + str: 1.5 + }, + drop: { + gp: 25, + exp: 125, + } + }, + spider: { + boss: { + hp: 400, + str: 1.5 + }, + drop: { + gp: 31, + exp: 200, + } + }, + owl: { + boss: { + hp: 500, + str: 1.5 + }, + drop: { + gp: 37, + exp: 275, + } + }, + penguin: { + boss: { + hp: 400, + str: 1.5 + }, + drop: { + gp: 31, + exp: 200, + } + }, + trex: { + text: t('questTRexText'), + notes: t('questTRexNotes'), + completion: t('questTRexCompletion'), + 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: { + text: t('questTRexUndeadText'), + notes: t('questTRexUndeadNotes'), + completion: t('questTRexUndeadCompletion'), + boss: { + name: t('questTRexUndeadBoss'), + hp: 500, + str: 2, + rage: { + title: t('questTRexUndeadRageTitle'), + description: t('questTRexUndeadRageDescription'), + value: 50, + healing: .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: { + boss: { + hp: 400, + str: 1.5 + }, + drop: { + gp: 31, + exp: 200, + } + }, + bunny: { + boss: { + hp: 300, + str: 1.5 + }, + drop: { + gp: 25, + exp: 125, + } + }, + slime: { + boss: { + hp: 400, + str: 1.5 + }, + drop: { + gp: 31, + exp: 200, + } + }, + sheep: { + boss: { + hp: 300, + str: 1.5 + }, + drop: { + gp: 25, + exp: 125, + } + }, + kraken: { + boss: { + 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, + } + }, + whale: { + boss: { + hp: 500, + str: 1.5 + }, + drop: { + gp: 37, + exp: 275, + } + }, + cheetah: { + boss: { + hp: 600, + str: 1.5 + }, + drop: { + gp: 43, + exp: 350, + } + }, + horse: { + boss: { + hp: 500, + str: 1.5 + }, + drop: { + gp: 37, + exp: 275, + } + } +}; + +each(petQuests, (quest, name) => { + let camelName = camelCase(name); + let capitalizedName = capitalize(camelName); + + let questDefaults = { + text: t(`quest${capitalizedName}Text`), + notes: t(`quest${capitalizedName}Notes`), + completion: t(`quest${capitalizedName}Completion`), + category: 'pet', + value: 4, + }; + + let bossDefaults = { + name: t(`quest${capitalizedName}Boss`), + }; + + let dropDefaults = { + items: [ + { + type: 'eggs', + key: capitalizedName, + text: t(`quest${capitalizedName}Drop${capitalizedName}Egg`) + }, { + type: 'eggs', + key: capitalizedName, + text: t(`quest${capitalizedName}Drop${capitalizedName}Egg`) + }, { + type: 'eggs', + key: capitalizedName, + text: t(`quest${capitalizedName}Drop${capitalizedName}Egg`) + }, + ], + unlock: t(`quest${capitalizedName}UnlockText`), + }; + + defaults(quest, questDefaults); + + if (quest.boss) defaults(quest.boss, bossDefaults); + if (quest.drop) defaults(quest.drop, dropDefaults); +}); + + +export default petQuests; diff --git a/common/script/src/content/quests/unlockable.js b/common/script/src/content/quests/unlockable.js new file mode 100644 index 0000000000..2913c3920a --- /dev/null +++ b/common/script/src/content/quests/unlockable.js @@ -0,0 +1,375 @@ +import {each, defaults, assign} from 'lodash'; +import capitalize from 'lodash.capitalize'; +import camelCase from 'lodash.camelCase'; +import t from '../helpers/translator'; + +let inviteFriends = { + basilist: { + unlockCondition: { + condition: 'party invite', + text: t('inviteFriends') + }, + boss: { + hp: 100, + str: 0.5 + }, + drop: { + gp: 8, + exp: 42 + } + }, +}; + +let viceSeries = { + vice1: { + lvl: 30, + boss: { + hp: 750, + str: 1.5 + }, + drop: { + items: [ + { + type: 'quests', + key: 'vice2', + text: t('questVice1DropVice2Quest') + } + ], + gp: 20, + exp: 100 + } + }, + vice2: { + lvl: 30, + previous: 'vice1', + collect: { + lightCrystal: { + text: t('questVice2CollectLightCrystal'), + count: 45 + } + }, + drop: { + items: [ + { + type: 'quests', + key: 'vice3', + text: t('questVice2DropVice3Quest') + } + ], + gp: 20, + exp: 75 + } + }, + vice3: { + completion: t('questVice3Completion'), + previous: 'vice2', + lvl: 30, + boss: { + 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 + } + }, +}; + +let atomSeries = { + atom1: { + lvl: 15, + collect: { + soapBars: { + text: t('questAtom1CollectSoapBars'), + count: 20 + } + }, + drop: { + items: [ + { + type: 'quests', + key: 'atom2', + text: t('questAtom1Drop') + } + ], + gp: 7, + exp: 50 + } + }, + atom2: { + previous: 'atom1', + lvl: 15, + boss: { + hp: 300, + str: 1 + }, + drop: { + items: [ + { + type: 'quests', + key: 'atom3', + text: t('questAtom2Drop') + } + ], + gp: 20, + exp: 100 + } + }, + atom3: { + previous: 'atom2', + completion: t('questAtom3Completion'), + lvl: 15, + boss: { + 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 + } + }, +}; + +let moonstoneSeries = { + moonstone1: { + lvl: 60, + collect: { + moonstone: { + text: t('questMoonstone1CollectMoonstone'), + count: 500 + } + }, + drop: { + items: [ + { + type: 'quests', + key: 'moonstone2', + text: t('questMoonstone1DropMoonstone2Quest') + } + ], + gp: 50, + exp: 100 + } + }, + moonstone2: { + lvl: 60, + previous: 'moonstone1', + boss: { + hp: 1500, + str: 3 + }, + drop: { + items: [ + { + type: 'quests', + key: 'moonstone3', + text: t('questMoonstone2DropMoonstone3Quest') + } + ], + gp: 500, + exp: 1000 + } + }, + moonstone3: { + completion: t('questMoonstone3Completion'), + previous: 'moonstone2', + lvl: 60, + boss: { + 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 + } + }, +}; + +let goldenKnightSeries = { + goldenknight1: { + lvl: 40, + collect: { + testimony: { + text: t('questGoldenknight1CollectTestimony'), + count: 300 + } + }, + drop: { + items: [ + { + type: 'quests', + key: 'goldenknight2', + text: t('questGoldenknight1DropGoldenknight2Quest') + } + ], + gp: 15, + exp: 120 + } + }, + goldenknight2: { + previous: 'goldenknight1', + lvl: 40, + boss: { + hp: 1000, + str: 3 + }, + drop: { + items: [ + { + type: 'quests', + key: 'goldenknight3', + text: t('questGoldenknight2DropGoldenknight3Quest') + } + ], + gp: 75, + exp: 750 + } + }, + goldenknight3: { + completion: t('questGoldenknight3Completion'), + previous: 'goldenknight2', + lvl: 40, + boss: { + 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 + } + }, +}; + +let unlockableQuests = { }; + +assign(unlockableQuests, inviteFriends); +assign(unlockableQuests, atomSeries); +assign(unlockableQuests, viceSeries); +assign(unlockableQuests, moonstoneSeries); +assign(unlockableQuests, goldenKnightSeries); + +each(unlockableQuests, (quest, name) => { + let camelName = camelCase(name); + let capitalizedName = capitalize(camelName); + + let questDefaults = { + text: t(`quest${capitalizedName}Text`), + notes: t(`quest${capitalizedName}Notes`), + category: 'unlockable', + value: 4, + }; + + let bossDefaults = { + name: t(`quest${capitalizedName}Boss`), + }; + + defaults(quest, questDefaults); + + if (quest.boss) defaults(quest.boss, bossDefaults); +}); + +export default unlockableQuests; diff --git a/common/script/src/content/quests/world.js b/common/script/src/content/quests/world.js new file mode 100644 index 0000000000..ca1da4508b --- /dev/null +++ b/common/script/src/content/quests/world.js @@ -0,0 +1,172 @@ +import {each, defaults} from 'lodash'; +import capitalize from 'lodash.capitalize'; +import t from '../helpers/translator'; + +let worldQuests = { + dilatory: { + 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: { + completionChat: t('questStressbeastCompletionChat'), + boss: { + name: t('questStressbeastBoss'), + hp: 2750000, + str: 1, + def: 1, + rage: { + title: t('questStressbeastBossRageTitle'), + description: t('questStressbeastBossRageDescription'), + value: 1450000, + healing: .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 + } + }, +}; + +each(worldQuests, (quest, name) => { + let capitalizedName = capitalize(name); + let questDefaults = { + text: t(`quest${capitalizedName}Text`), + notes: t(`quest${capitalizedName}Notes`), + completion: t(`quest${capitalizedName}Completion`), + value: 0, + canBuy: false, + category: 'world', + }; + + defaults(quest, questDefaults); +}); + +export default worldQuests;