Files
habitica/common/script/content/index.js
Matteo Pagliazzi 28f2e9c356 API v3 [WIP] (#6144)
* Fixed more tests

* Added tags into user service

* Added api-v3 auth urls

* v3: fix package.json

* v3: fix package.json

* Fixed auth tests. Updated Authctrl response

* v3: remove newrelic config file in favour of env variables

* v3: upgrade some deps

* switch from Q to Bluebird

* v3 fix tests with deferred

* Removed extra consoles.log. Changed data.data to res.data

* v3 fix tests and use coroutines instead of regenerator

* v3: fix tests

* v3: do not await a non promise

* v3: q -> bluebird

* Changed id param for registration response

* Updated party query and create

* Ensured login callback happens after user sync

* Add challenges to groups. Fixed isMemberOfGuild check

* Updated party and group tests

* Fixed cron test

* return user.id and send analytics event before changing page

* fix trailing spaces

* disable redirects

* Api v3 party tavern fixes (#7191)

* Added check if user is in party before query

* Cached party query. Prevented party request when user is not in party. Updated Party create with no invites

* Update tavern ctrl to use new promise

* v3: misc fixes

* Api v3 task fixes (#7193)

* Update task view to use _id

* Added try catch to user service ops calls

* v3 client: saving after syncing is complete

* Fixed test broken by part sync change (#7195)

* v3: fix todo scoring and try to fix production testing problem

* revert changes to mongoose config

* mongoose: increase keepAlive

* test mongoose fix

* fix: Only apply captureStackTrace if it exists on the error object

* v3: fix reminders with no startDate

* mongoose: use options

* chore(): rename website/src -> website/server and website/public -> website/client (#7199)

* v3 fix GET /groups: return an error only if an invalid type is supplied not when there are 0 results (#7203)

* [API v3] Fix calls to user.ops and deleting tags (#7204)

* v3: fixes calls to user.ops from views and deleting tags

* v3: fix tests that use user._statsComputed

* Api v3 fixes continued (#7205)

* Added timzeone offset back

* Added APIToken back to settings page

* Fixed fetch recent messages for party

* Fixed returning group description

* Fixed check if user is member of challenge

* Fixed party members appearing in header

* Updated get myGroups param to include public groups. Fixed isMemberOf group

* Fixed hourglass purchase

* Fixed challenge addding tasks on first creating

* Updated tests to accomidate new changes

* fix: Correct checklist on client

Closes #7207

* fix: Pin eslint to 2.9

* minor improvements to cron code for clarity; fix inaccurate comments; add TODOs for rest-in-inn actions

* fix: Add missing type param to equip call

closes #7212

* rename and reword pubChalsMinPrize to reflect that it's only for Tavern challenges

* allows players to send gems to each other; other minor related changes - fixes https://github.com/HabitRPG/habitrpg/issues/7227

* fix tests for /members/transfer-gems

* fix: Set gems sent notification as translatable string

* chore: Remove unusued variable

* fix: Remove requirement on message paramter in transfer-gems

* add a missing variable declaration

* chore: clarify comments on cron code

* fix: Correct client request from habitrpg -> tavern

* update apidoc URL in package.json

Closes #7222

* Fixed start party by invites

* Updated spell casting to v3

* Fixed adding and removing tags on tasks

* Fixed page reload on settings change

* Fixed battle monsters with friends button

* Loaded completed todos when done is clicked

* chore: Reinstate floating version number for eslint

babel-eslint regression fixed

* Fixed reload tests

* change "an user" to "a user" in comments and text (no code changes) (#7257)

* fix: Alert user that drops were recieved

* remove userServices.js from karma.conf - it's been moved to website/client/js/services

* feat: Create debug update user route

* fix: Correct set cron debug function

* feat: Add make admin button to debug menu

* lint: Add missing semicolons in test

* fix: Temporarilly comment out udpate user debug route

* v3: fix _tmp for crit and streakBonus

* v3: execute all actions when leaving a solo party

* v3 client: fix group not found when leaving party

* v3 migration: fix challenge prize

* v3 cron: only save modified tasks

* v3: add CHALLENGE_TASK_NOT_FOUND to valid broken reasons

* v3: fix tasks chart

* v3 client: fix ability to leave challenge

* v3 client: fix filtering by tag and correctly show tag tooltip

* v3 common: fix tags tests

* v3 client: support unlinking not found challenges tasks

* v3: disable Bluebird warning for missing return, fixes #7269

* feat: Separate out update-user into set-cron and make-admin debug routes

* chore: Disable make admin debug route for v3 prod testing

* v3: misc fixes

* v3: misc fixes

* v3: fix adding multiple tasks

* Fixed join/leave button updates

* Queried only user groups to be available when creating challenges

* Fixed bulk add tasks to challenge

* Synced challenge tasks after leave and join.

* Fixed default selected group

* Fixed challenge member info. Fixed challenge winner selection

* Fixed deleting challenge tasks

* Fixed particiapting filter

* v3 client: fix casting spells

* v3: do not log sensitive data

* v3: always save user when casting spell

* v3: always save user when casting spell

* v3: more fixes for spells

* fix typos and missing information in apidocs - fixes https://github.com/HabitRPG/habitrpg/issues/7277 (#7282)

* v3: add TODO for client side spells

* feat: Add modify inventory debug menu

* Fixed viewing user progress on challenge

* Updated tests

* fix: Fix quest progress button

* fix incorrect Armoire test; remove unneeded param details from apidocs; disambiguate health potion

* v3: fix stealth casting

* v3: fix tasks saving and selection for rebirth reroll and reset (server-only)

* v3: fix auto allocation

* v3 client: misc fixes

* rename buyPotion and buy-potion to buyHealthPotion and buy-health-potion; fix apidoc param error

* Added delete for saved challenge task

* Fixed member modal on front page

* adjust text in apidocs for errors / clarity / consistency / standard terminology (no code changes) (#7298)

* fix bug in Rebirth test, add new tests, adjust apidocs (#7293)

* Updated task model to allow setting streak (#7306)

* fix: Correct missing * in apidoc comments

* Api v3 challenge fixes (#7287)

* Fixed join/leave button updates

* Queried only user groups to be available when creating challenges

* Fixed bulk add tasks to challenge

* Synced challenge tasks after leave and join.

* Fixed default selected group

* Fixed challenge member info. Fixed challenge winner selection

* Fixed deleting challenge tasks

* Fixed particiapting filter

* Fixed viewing user progress on challenge

* Updated tests

* Added delete for saved challenge task

* v3: fix sorting

* [API v3] add CRON_SAFE_MODE (#7286)

* add CRON_SAFE_MODE to example config file, fix some bugs, add an unrelated low-priority TODO

* create CRON_SAFE_MODE to disable parts of cron for use after extended outage - fixes https://github.com/HabitRPG/habitrpg/issues/7161

* fix a bug with CRON_SAFE_MODE, remove duplicated code, remove completed TODO comment

* fix check for CRON_SAFE_MODE

* v3 client: fix typo

* adjust debug menu Modify Inventory: hungrier pets, fewer Special items, "Hide" buttons

* completed To-Dos: return the 30 most recent instead of 30 oldest (#7318)

* v3 migration: fix createdAt date

* adjust locales text, key names, and files for Rebirth, Reset, and Fortify / ReRoll for consistency with existing strings (#7321)

* v3: fix unlinking multiple tasks

* v3 fix releasing pets

* v3: fix authenticating with apiUrl

* v3: fix typo

* v3 fix client tests for unlinking

* v3 client: do not show start quest button when quest is active

* v3 client: fix ability to send cards

* v3 client: fix misc challenge issues

* v3: fix notifications

* v3 client: more user friendly errors

* v3 client: only load completed todos once

* v3 client: fix tests

* v3: move TAVERN_ID to common code

* fix: Provide default type and text for new task creation in score route

* fix: Provide default history [] for habit in score route

* fix: Add _legacyId prop to tasks to support non-uuid identifiers

* chore: Change v3 migration to use _legacyId instead of legacyId

* fix: check for _legacyId in tasks if id does not exist

* refactor: Extract out finding task by id or _legacyId into a function

* Api v3 party quest fixes (#7341)

* Fix display of add challenge message when group challenges are empty

* Fixed forced quest start to update quest without reload

* Fixed needing to reload when accepting party invite

* Fix group leave and join reload

* Fixed leave current party and join another

* Updated party tests

* v3 client: remove console.log statement

* v3: misc fixes

* v3 client: fix predicatbale random

* v3: info about API v3

* v3: update footer with links to developer resources

* v3: support party invitation from email

* v3 client: fix chat flagging

* fix: Correct get tasks route to properly get todos (#7349)

* move locales strings from api-v3.json to other locales files (#7347)

* move locales strings from api-v3.json: authentication strings -> front.json

* move locales strings from api-v3.json: authentication strings -> tasks.json

* move locales strings from api-v3.json: authentication strings -> groups.json

* move locales strings from api-v3.json: authentication strings -> challenge.json

* move locales strings from api-v3.json: authentication strings -> groups.json (again)

* move locales strings from api-v3.json: authentication strings -> quests.json

* move locales strings from api-v3.json: authentication strings -> subscriber.json

* move locales strings from api-v3.json: authentication strings -> spells.json

* move locales strings from api-v3.json: authentication strings -> character.json

* move locales strings from api-v3.json: authentication strings -> groups.json (PMs)

* move locales strings from api-v3.json: authentication strings -> npc.json

* move locales strings from api-v3.json: authentication strings -> pets.json

* move locales strings from api-v3.json: authentication strings -> miscellaneous

* move locales strings from api-v3.json: authentication strings -> contrib.json and settings.json

* move locales strings from api-v3.json: delete unused string (invalidTasksOwner), delete api-v3.json, whitespace cleanup

* v3 client: fix sticky header

* v3: remove unused code

* v3 client: correctly redirect after inviting

* Removed v2 calls from views (#7351)

* v3: fix tests for challenge export

* v3: fallbackto authWithHeaders if wuthWithSession or authWithUrl fails

* Added force cache update when fetching new messages (#7360)

* v3: fetch whole user when booting from group tto avoid issues with pre save hook expecting all data

* v3: misc fixes for payments

* v3: limit fields of challenge tasks that can be updated

* fix(tests): never connect to NODE_DB_URI for tests

* Added new route for setting last cron and updated front end

* v3: fix iap url

* v3: fix build and ios IAP

* Changed route to user set custom day start

* v3: iap accessible under /api/v3, fixes to spells and groups invitations

* v3: correctly use v3 routes in client

* remove XP, GP when unticking a Daily with a completed checklist - fixes https://github.com/HabitRPG/habitrpg/issues/7246

* use natural language for error message about skills on challenge tasks (#7336), fix other gramatical error

* Updated ui when user rejects a guild invite (#7368)

* feat: complete custom day start route

Closes #7363

* fix: Correct spelling of healAll skill

fix: Correct sprite name of healAll skill

* fix: Change all instances of spookDust -> spookySparkles

* add dateCreated to all tasks; add empty challenge object to tasks that don't have one (#7386)

* add plumilla to artists for Tangle Tree in Bailey message

* Fixed quest drop modal (#7377)

* Fixed quest drop modal

* Fixed broken party test

* [API v3] Maintenance Mode (#7367)

* WIP(maintenance): maintenance

* WIP(maintenance): working locale features

* fix(maintenance): don't translate info page target

* WIP(maintenance): start adding info page

* fix(maintenance): linting

* feat: Add container to maintenance info page

* fix(maintenance): add config.json edits
Also DRY variables for main vs info pages

* fix(maintenance): linting

* refactor(maintenance): further slim down variables

* refactor: Remove unnecessary variables

* fix: Correct string interpolation in maintenace view

* feat: Dynamically add time to maintenance pages

* maintenance mode: do not connect to mongodb

* fix(maintenance): clean up timezones etc.

* fix(maintenance): remove unneeded sprite

* Tavern party challenges invites fix (#7394)

* Added challenges and invitations to party

* Loaded tavern challenges

* Updated group and quest services tests

* v3: implement automatic syncing if user is not up to date

* Removed unnecessary fields when updating groups and challenges (#7395)

* v3: do not saved populated user

* v3: correctly return user subset

* Chained party promises together (#7396)

* v3: $w -> splitWhitespace

* use bluebird

* use babel polyfill

* migration: fix items

* update links for v3

* Updated shortname validation to support multiple browsers

* Docs changes (#7401)

* chore: Clarify transfer-gems documentation

* chore: Clarify api status route documentation

* chore: Mark webhooks as BETA

* Added tags update route. Added sort to user service (#7381)

* Added tags update route. Added sort to user service

* Change update tasks route to reorder tasks

* Fixed linting issue

* Changed params for reorder tags route

* Fixed not found tag and added test

* Added password confirmation when deleteing account (#7402)

* fix production logging

* feat(commit): push

* empty commit

* feat(maintenance): post-downtime news & awards (#7406)

* fix exporting avatar

* second attempt at fixing exporting avatar

* fix production logging

* s3: convert moment to date instance

* fix avatar sharing and caching (30 minutes)

* fix: Correct missing parameter

Closes #7433

* fix: Validate challenge shortname on server

* adjust text strings - fixes https://github.com/HabitRPG/habitrpg/issues/5631 and also Short Name -> Tag Name
2016-05-23 13:58:31 +02:00

2823 lines
61 KiB
JavaScript

import _ from 'lodash';
import moment from 'moment';
import t from './translation';
import {
CLASSES,
EVENTS,
GEAR_TYPES,
ITEM_LIST,
USER_CAN_OWN_QUEST_CATEGORIES,
} from './constants';
let api = module.exports;
import mysterySets from './mystery-sets';
import gear from './gear';
import appearances from './appearance';
import backgrounds from './appearance/backgrounds.js'
import spells from './spells';
import faq from './faq';
api.mystery = mysterySets;
api.itemList = ITEM_LIST;
api.gear = gear;
api.spells = spells;
/*
Time Traveler Store, mystery sets need their items mapped in
*/
_.each(api.mystery, function(v, k) {
return v.items = _.where(api.gear.flat, {
mystery: k
});
});
api.timeTravelerStore = function(owned) {
var ownedKeys;
ownedKeys = _.keys((typeof owned.toObject === "function" ? owned.toObject() : void 0) || owned);
return _.reduce(api.mystery, function(m, v, k) {
if (k === 'wondercon' || ~ownedKeys.indexOf(v.items[0].key)) {
return m;
}
m[k] = v;
return m;
}, {});
};
/*
---------------------------------------------------------------
Unique Rewards: Potion and Armoire
---------------------------------------------------------------
*/
api.potion = {
type: 'potion',
text: t('potionText'),
notes: t('potionNotes'),
value: 25,
key: 'potion'
};
api.armoire = {
type: 'armoire',
text: t('armoireText'),
notes: (function(user, count) {
if (user.flags.armoireEmpty) {
return t('armoireNotesEmpty')();
}
return t('armoireNotesFull')() + count;
}),
value: 100,
key: 'armoire',
canOwn: (function(u) {
return _.contains(u.achievements.ultimateGearSets, true);
})
};
/*
---------------------------------------------------------------
Classes
---------------------------------------------------------------
*/
api.classes = CLASSES;
/*
---------------------------------------------------------------
Gear Types
---------------------------------------------------------------
*/
api.gearTypes = GEAR_TYPES;
api.cardTypes = {
greeting: {
key: 'greeting',
messageOptions: 4,
yearRound: true
},
nye: {
key: 'nye',
messageOptions: 5
},
thankyou: {
key: 'thankyou',
messageOptions: 4,
yearRound: true
},
valentine: {
key: 'valentine',
messageOptions: 4
},
birthday: {
key: 'birthday',
messageOptions: 1,
yearRound: true,
},
};
api.special = api.spells.special;
/*
---------------------------------------------------------------
Drops
---------------------------------------------------------------
*/
api.dropEggs = {
Wolf: {
text: t('dropEggWolfText'),
adjective: t('dropEggWolfAdjective')
},
TigerCub: {
text: t('dropEggTigerCubText'),
mountText: t('dropEggTigerCubMountText'),
adjective: t('dropEggTigerCubAdjective')
},
PandaCub: {
text: t('dropEggPandaCubText'),
mountText: t('dropEggPandaCubMountText'),
adjective: t('dropEggPandaCubAdjective')
},
LionCub: {
text: t('dropEggLionCubText'),
mountText: t('dropEggLionCubMountText'),
adjective: t('dropEggLionCubAdjective')
},
Fox: {
text: t('dropEggFoxText'),
adjective: t('dropEggFoxAdjective')
},
FlyingPig: {
text: t('dropEggFlyingPigText'),
adjective: t('dropEggFlyingPigAdjective')
},
Dragon: {
text: t('dropEggDragonText'),
adjective: t('dropEggDragonAdjective')
},
Cactus: {
text: t('dropEggCactusText'),
adjective: t('dropEggCactusAdjective')
},
BearCub: {
text: t('dropEggBearCubText'),
mountText: t('dropEggBearCubMountText'),
adjective: t('dropEggBearCubAdjective')
}
};
_.each(api.dropEggs, function(egg, key) {
return _.defaults(egg, {
canBuy: (function() {
return true;
}),
value: 3,
key: key,
notes: t('eggNotes', {
eggText: egg.text,
eggAdjective: egg.adjective
}),
mountText: egg.text
});
});
api.questEggs = {
Gryphon: {
text: t('questEggGryphonText'),
adjective: t('questEggGryphonAdjective'),
canBuy: (function(u) {
return u.achievements.quests && (u.achievements.quests.gryphon != null) > 0;
})
},
Hedgehog: {
text: t('questEggHedgehogText'),
adjective: t('questEggHedgehogAdjective'),
canBuy: (function(u) {
return u.achievements.quests && (u.achievements.quests.hedgehog != null) > 0;
})
},
Deer: {
text: t('questEggDeerText'),
adjective: t('questEggDeerAdjective'),
canBuy: (function(u) {
return u.achievements.quests && (u.achievements.quests.ghost_stag != null) > 0;
})
},
Egg: {
text: t('questEggEggText'),
adjective: t('questEggEggAdjective'),
mountText: t('questEggEggMountText')
},
Rat: {
text: t('questEggRatText'),
adjective: t('questEggRatAdjective'),
canBuy: (function(u) {
return u.achievements.quests && (u.achievements.quests.rat != null) > 0;
})
},
Octopus: {
text: t('questEggOctopusText'),
adjective: t('questEggOctopusAdjective'),
canBuy: (function(u) {
return u.achievements.quests && (u.achievements.quests.octopus != null) > 0;
})
},
Seahorse: {
text: t('questEggSeahorseText'),
adjective: t('questEggSeahorseAdjective'),
canBuy: (function(u) {
return u.achievements.quests && (u.achievements.quests.dilatory_derby != null) > 0;
})
},
Parrot: {
text: t('questEggParrotText'),
adjective: t('questEggParrotAdjective'),
canBuy: (function(u) {
return u.achievements.quests && (u.achievements.quests.harpy != null) > 0;
})
},
Rooster: {
text: t('questEggRoosterText'),
adjective: t('questEggRoosterAdjective'),
canBuy: (function(u) {
return u.achievements.quests && (u.achievements.quests.rooster != null) > 0;
})
},
Spider: {
text: t('questEggSpiderText'),
adjective: t('questEggSpiderAdjective'),
canBuy: (function(u) {
return u.achievements.quests && (u.achievements.quests.spider != null) > 0;
})
},
Owl: {
text: t('questEggOwlText'),
adjective: t('questEggOwlAdjective'),
canBuy: (function(u) {
return u.achievements.quests && (u.achievements.quests.owl != null) > 0;
})
},
Penguin: {
text: t('questEggPenguinText'),
adjective: t('questEggPenguinAdjective'),
canBuy: (function(u) {
return u.achievements.quests && (u.achievements.quests.penguin != null) > 0;
})
},
TRex: {
text: t('questEggTRexText'),
adjective: t('questEggTRexAdjective'),
canBuy: (function(u) {
return u.achievements.quests && ((u.achievements.quests.trex != null) > 0 || (u.achievements.quests.trex_undead != null) > 0);
})
},
Rock: {
text: t('questEggRockText'),
adjective: t('questEggRockAdjective'),
canBuy: (function(u) {
return u.achievements.quests && (u.achievements.quests.rock != null) > 0;
})
},
Bunny: {
text: t('questEggBunnyText'),
adjective: t('questEggBunnyAdjective'),
canBuy: (function(u) {
return u.achievements.quests && (u.achievements.quests.bunny != null) > 0;
})
},
Slime: {
text: t('questEggSlimeText'),
adjective: t('questEggSlimeAdjective'),
canBuy: (function(u) {
return u.achievements.quests && (u.achievements.quests.slime != null) > 0;
})
},
Sheep: {
text: t('questEggSheepText'),
adjective: t('questEggSheepAdjective'),
canBuy: (function(u) {
return u.achievements.quests && (u.achievements.quests.sheep != null) > 0;
})
},
Cuttlefish: {
text: t('questEggCuttlefishText'),
adjective: t('questEggCuttlefishAdjective'),
canBuy: (function(u) {
return u.achievements.quests && (u.achievements.quests.kraken != null) > 0;
})
},
Whale: {
text: t('questEggWhaleText'),
adjective: t('questEggWhaleAdjective'),
canBuy: (function(u) {
return u.achievements.quests && (u.achievements.quests.whale != null) > 0;
})
},
Cheetah: {
text: t('questEggCheetahText'),
adjective: t('questEggCheetahAdjective'),
canBuy: (function(u) {
return u.achievements.quests && (u.achievements.quests.cheetah != null) > 0;
})
},
Horse: {
text: t('questEggHorseText'),
adjective: t('questEggHorseAdjective'),
canBuy: (function(u) {
return u.achievements.quests && (u.achievements.quests.horse != null) > 0;
})
},
Frog: {
text: t('questEggFrogText'),
adjective: t('questEggFrogAdjective'),
canBuy: (function(u) {
return u.achievements.quests && (u.achievements.quests.frog != null) > 0;
})
},
Snake: {
text: t('questEggSnakeText'),
adjective: t('questEggSnakeAdjective'),
canBuy: (function(u) {
return u.achievements.quests && (u.achievements.quests.snake != null) > 0;
})
},
Unicorn: {
text: t('questEggUnicornText'),
mountText: t('questEggUnicornMountText'),
adjective: t('questEggUnicornAdjective'),
canBuy: (function(u) {
return u.achievements.quests && (u.achievements.quests.unicorn != null) > 0;
})
},
Sabretooth: {
text: t('questEggSabretoothText'),
adjective: t('questEggSabretoothAdjective'),
canBuy: (function(u) {
return u.achievements.quests && (u.achievements.quests.sabretooth != null) > 0;
})
},
Monkey: {
text: t('questEggMonkeyText'),
adjective: t('questEggMonkeyAdjective'),
canBuy: (function(u) {
return u.achievements.quests && (u.achievements.quests.monkey != null) > 0;
})
},
Snail: {
text: t('questEggSnailText'),
adjective: t('questEggSnailAdjective'),
canBuy: (function(u) {
return u.achievements.quests && (u.achievements.quests.snail != null) > 0;
}),
},
Falcon: {
text: t('questEggFalconText'),
adjective: t('questEggFalconAdjective'),
canBuy: (function(u) {
return u.achievements.quests && (u.achievements.quests.falcon != null) > 0;
}),
},
Treeling: {
text: t('questEggTreelingText'),
adjective: t('questEggTreelingAdjective'),
canBuy: (function(u) {
return u.achievements.quests && (u.achievements.quests.treeling != null) > 0;
}),
},
};
_.each(api.questEggs, function(egg, key) {
return _.defaults(egg, {
canBuy: (function() {
return false;
}),
value: 3,
key: key,
notes: t('eggNotes', {
eggText: egg.text,
eggAdjective: egg.adjective
}),
mountText: egg.text
});
});
api.eggs = _.assign(_.cloneDeep(api.dropEggs), api.questEggs);
api.specialPets = {
'Wolf-Veteran': 'veteranWolf',
'Wolf-Cerberus': 'cerberusPup',
'Dragon-Hydra': 'hydra',
'Turkey-Base': 'turkey',
'BearCub-Polar': 'polarBearPup',
'MantisShrimp-Base': 'mantisShrimp',
'JackOLantern-Base': 'jackolantern',
'Mammoth-Base': 'mammoth',
'Tiger-Veteran': 'veteranTiger',
'Phoenix-Base': 'phoenix',
'Turkey-Gilded': 'gildedTurkey',
'MagicalBee-Base': 'magicalBee',
'Lion-Veteran': 'veteranLion',
};
api.specialMounts = {
'BearCub-Polar': 'polarBear',
'LionCub-Ethereal': 'etherealLion',
'MantisShrimp-Base': 'mantisShrimp',
'Turkey-Base': 'turkey',
'Mammoth-Base': 'mammoth',
'Orca-Base': 'orca',
'Gryphon-RoyalPurple': 'royalPurpleGryphon',
'Phoenix-Base': 'phoenix',
'JackOLantern-Base': 'jackolantern',
'MagicalBee-Base': 'magicalBee',
};
api.timeTravelStable = {
pets: {
'Mammoth-Base': t('mammoth'),
'MantisShrimp-Base': t('mantisShrimp'),
'Phoenix-Base': t('phoenix'),
},
mounts: {
'Mammoth-Base': t('mammoth'),
'MantisShrimp-Base': t('mantisShrimp'),
'Phoenix-Base': t('phoenix'),
}
};
api.dropHatchingPotions = {
Base: {
value: 2,
text: t('hatchingPotionBase')
},
White: {
value: 2,
text: t('hatchingPotionWhite')
},
Desert: {
value: 2,
text: t('hatchingPotionDesert')
},
Red: {
value: 3,
text: t('hatchingPotionRed')
},
Shade: {
value: 3,
text: t('hatchingPotionShade')
},
Skeleton: {
value: 3,
text: t('hatchingPotionSkeleton')
},
Zombie: {
value: 4,
text: t('hatchingPotionZombie')
},
CottonCandyPink: {
value: 4,
text: t('hatchingPotionCottonCandyPink')
},
CottonCandyBlue: {
value: 4,
text: t('hatchingPotionCottonCandyBlue')
},
Golden: {
value: 5,
text: t('hatchingPotionGolden')
}
};
api.premiumHatchingPotions = {
Spooky: {
value: 2,
text: t('hatchingPotionSpooky'),
limited: true,
canBuy: (function() {
return false;
})
},
Peppermint: {
value: 2,
text: t('hatchingPotionPeppermint'),
limited: true,
canBuy: (function() {
return false;
})
},
Floral: {
value: 2,
text: t('hatchingPotionFloral'),
limited: true,
canBuy: (function() {
return true;
}),
},
};
_.each(api.dropHatchingPotions, function(pot, key) {
return _.defaults(pot, {
key: key,
value: 2,
notes: t('hatchingPotionNotes', {
potText: pot.text
}),
premium: false,
limited: false,
canBuy: (function() {
return true;
})
});
});
_.each(api.premiumHatchingPotions, function(pot, key) {
return _.defaults(pot, {
key: key,
value: 2,
notes: t('hatchingPotionNotes', {
potText: pot.text
}),
addlNotes: t('premiumPotionAddlNotes'),
premium: true,
limited: false,
canBuy: (function() {
return true;
})
});
});
api.hatchingPotions = {};
_.merge(api.hatchingPotions, api.dropHatchingPotions);
_.merge(api.hatchingPotions, api.premiumHatchingPotions);
api.pets = _.transform(api.dropEggs, function(m, egg) {
return _.defaults(m, _.transform(api.hatchingPotions, function(m2, pot) {
if (!pot.premium) {
return m2[egg.key + "-" + pot.key] = true;
}
}));
});
api.premiumPets = _.transform(api.dropEggs, function(m, egg) {
return _.defaults(m, _.transform(api.hatchingPotions, function(m2, pot) {
if (pot.premium) {
return m2[egg.key + "-" + pot.key] = true;
}
}));
});
api.questPets = _.transform(api.questEggs, function(m, egg) {
return _.defaults(m, _.transform(api.hatchingPotions, function(m2, pot) {
if (!pot.premium) {
return m2[egg.key + "-" + pot.key] = true;
}
}));
});
api.mounts = _.transform(api.dropEggs, function(m, egg) {
return _.defaults(m, _.transform(api.hatchingPotions, function(m2, pot) {
if (!pot.premium) {
return m2[egg.key + "-" + pot.key] = true;
}
}));
});
api.questMounts = _.transform(api.questEggs, function(m, egg) {
return _.defaults(m, _.transform(api.hatchingPotions, function(m2, pot) {
if (!pot.premium) {
return m2[egg.key + "-" + pot.key] = true;
}
}));
});
api.premiumMounts = _.transform(api.dropEggs, function(m, egg) {
return _.defaults(m, _.transform(api.hatchingPotions, function(m2, pot) {
if (pot.premium) {
return m2[egg.key + "-" + pot.key] = true;
}
}));
});
api.food = {
Meat: {
text: t('foodMeat'),
target: 'Base',
article: '',
canBuy: (function() {
return true;
}),
canDrop: true,
},
Milk: {
text: t('foodMilk'),
target: 'White',
article: '',
canBuy: (function() {
return true;
}),
canDrop: true,
},
Potatoe: {
text: t('foodPotatoe'),
target: 'Desert',
article: 'a ',
canBuy: (function() {
return true;
}),
canDrop: true,
},
Strawberry: {
text: t('foodStrawberry'),
target: 'Red',
article: 'a ',
canBuy: (function() {
return true;
}),
canDrop: true,
},
Chocolate: {
text: t('foodChocolate'),
target: 'Shade',
article: '',
canBuy: (function() {
return true;
}),
canDrop: true,
},
Fish: {
text: t('foodFish'),
target: 'Skeleton',
article: 'a ',
canBuy: (function() {
return true;
}),
canDrop: true,
},
RottenMeat: {
text: t('foodRottenMeat'),
target: 'Zombie',
article: '',
canBuy: (function() {
return true;
}),
canDrop: true,
},
CottonCandyPink: {
text: t('foodCottonCandyPink'),
target: 'CottonCandyPink',
article: '',
canBuy: (function() {
return true;
}),
canDrop: true,
},
CottonCandyBlue: {
text: t('foodCottonCandyBlue'),
target: 'CottonCandyBlue',
article: '',
canBuy: (function() {
return true;
}),
canDrop: true,
},
Honey: {
text: t('foodHoney'),
target: 'Golden',
article: '',
canBuy: (function() {
return true;
}),
canDrop: true,
},
Saddle: {
canBuy: (function() {
return true;
}),
text: t('foodSaddleText'),
value: 5,
notes: t('foodSaddleNotes')
},
Cake_Skeleton: {
text: t('foodCakeSkeleton'),
target: 'Skeleton',
article: ''
},
Cake_Base: {
text: t('foodCakeBase'),
target: 'Base',
article: ''
},
Cake_CottonCandyBlue: {
text: t('foodCakeCottonCandyBlue'),
target: 'CottonCandyBlue',
article: ''
},
Cake_CottonCandyPink: {
text: t('foodCakeCottonCandyPink'),
target: 'CottonCandyPink',
article: ''
},
Cake_Shade: {
text: t('foodCakeShade'),
target: 'Shade',
article: ''
},
Cake_White: {
text: t('foodCakeWhite'),
target: 'White',
article: ''
},
Cake_Golden: {
text: t('foodCakeGolden'),
target: 'Golden',
article: ''
},
Cake_Zombie: {
text: t('foodCakeZombie'),
target: 'Zombie',
article: ''
},
Cake_Desert: {
text: t('foodCakeDesert'),
target: 'Desert',
article: ''
},
Cake_Red: {
text: t('foodCakeRed'),
target: 'Red',
article: ''
},
Candy_Skeleton: {
text: t('foodCandySkeleton'),
target: 'Skeleton',
article: ''
},
Candy_Base: {
text: t('foodCandyBase'),
target: 'Base',
article: ''
},
Candy_CottonCandyBlue: {
text: t('foodCandyCottonCandyBlue'),
target: 'CottonCandyBlue',
article: ''
},
Candy_CottonCandyPink: {
text: t('foodCandyCottonCandyPink'),
target: 'CottonCandyPink',
article: ''
},
Candy_Shade: {
text: t('foodCandyShade'),
target: 'Shade',
article: ''
},
Candy_White: {
text: t('foodCandyWhite'),
target: 'White',
article: ''
},
Candy_Golden: {
text: t('foodCandyGolden'),
target: 'Golden',
article: ''
},
Candy_Zombie: {
text: t('foodCandyZombie'),
target: 'Zombie',
article: ''
},
Candy_Desert: {
text: t('foodCandyDesert'),
target: 'Desert',
article: ''
},
Candy_Red: {
text: t('foodCandyRed'),
target: 'Red',
article: ''
}
};
_.each(api.food, function(food, key) {
return _.defaults(food, {
value: 1,
key: key,
notes: t('foodNotes'),
canBuy: (function() {
return false;
}),
canDrop: false
});
});
api.userCanOwnQuestCategories = USER_CAN_OWN_QUEST_CATEGORIES;
api.quests = {
dilatory: {
text: t("questDilatoryText"),
notes: t("questDilatoryNotes"),
completion: t("questDilatoryCompletion"),
value: 0,
canBuy: (function() {
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: (function() {
return 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
}
},
burnout: {
text: t('questBurnoutText'),
notes: t('questBurnoutNotes'),
completion: t('questBurnoutCompletion'),
completionChat: t('questBurnoutCompletionChat'),
value: 0,
canBuy: (function() {
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: {
canBuy: (function() {
return 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: (function() {
return false;
}),
text: t('questEvilSanta2Text'),
notes: t('questEvilSanta2Notes'),
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: {
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: (function() {
return true;
}),
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')
}
},
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: (function() {
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'),
},
},
};
_.each(api.quests, function(v, key) {
var b;
_.defaults(v, {
key: key,
canBuy: (function() {
return true;
})
});
b = v.boss;
if (b) {
_.defaults(b, {
str: 1,
def: 1
});
if (b.rage) {
return _.defaults(b.rage, {
title: t('bossRageTitle'),
description: t('bossRageDescription')
});
}
}
});
api.questsByLevel = _.sortBy(api.quests, function(quest) {
return quest.lvl || 0;
});
api.appearances = appearances;
api.backgrounds = backgrounds;
api.subscriptionBlocks = {
basic_earned: {
months: 1,
price: 5
},
basic_3mo: {
months: 3,
price: 15
},
basic_6mo: {
months: 6,
price: 30
},
google_6mo: {
months: 6,
price: 24,
discount: true,
original: 30
},
basic_12mo: {
months: 12,
price: 48
}
};
_.each(api.subscriptionBlocks, function(b, k) {
return b.key = k;
});
api.userDefaults = {
habits: [
{
type: 'habit',
text: t('defaultHabit1Text'),
value: 0,
up: true,
down: false,
attribute: 'per'
}, {
type: 'habit',
text: t('defaultHabit2Text'),
value: 0,
up: false,
down: true,
attribute: 'str'
}, {
type: 'habit',
text: t('defaultHabit3Text'),
value: 0,
up: true,
down: true,
attribute: 'str'
}
],
dailys: [],
todos: [
{
type: 'todo',
text: t('defaultTodo1Text'),
notes: t('defaultTodoNotes'),
completed: false,
attribute: 'int'
}
],
rewards: [
{
type: 'reward',
text: t('defaultReward1Text'),
value: 10
}
],
tags: [
{
name: t('defaultTag1')
}, {
name: t('defaultTag2')
}, {
name: t('defaultTag3')
}
]
};
api.faq = faq;