mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-19 15:48:04 +01:00
correctly memoize conent api
This commit is contained in:
154
test/content/index.test.js
Normal file
154
test/content/index.test.js
Normal file
@@ -0,0 +1,154 @@
|
|||||||
|
import content from '../../website/common/script/content';
|
||||||
|
|
||||||
|
describe('content index', () => {
|
||||||
|
let clock;
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
if (clock) {
|
||||||
|
clock.restore();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Releases eggs when appropriate without needing restarting', () => {
|
||||||
|
clock = sinon.useFakeTimers(new Date('2024-06-20'));
|
||||||
|
const mayEggs = content.eggs;
|
||||||
|
expect(mayEggs.Chameleon).to.not.exist;
|
||||||
|
clock.restore();
|
||||||
|
clock = sinon.useFakeTimers(new Date('2024-07-20'));
|
||||||
|
const juneEggs = content.eggs;
|
||||||
|
expect(juneEggs.Chameleon).to.exist;
|
||||||
|
expect(Object.keys(mayEggs).length, '').to.equal(Object.keys(juneEggs).length - 1);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Releases hatching potions when appropriate without needing restarting', () => {
|
||||||
|
clock = sinon.useFakeTimers(new Date('2024-05-20'));
|
||||||
|
const mayHatchingPotions = content.hatchingPotions;
|
||||||
|
expect(mayHatchingPotions.Koi).to.not.exist;
|
||||||
|
clock.restore();
|
||||||
|
clock = sinon.useFakeTimers(new Date('2024-06-20'));
|
||||||
|
const juneHatchingPotions = content.hatchingPotions;
|
||||||
|
expect(juneHatchingPotions.Koi).to.exist;
|
||||||
|
expect(Object.keys(mayHatchingPotions).length, '').to.equal(Object.keys(juneHatchingPotions).length - 1);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Releases armoire gear when appropriate without needing restarting', () => {
|
||||||
|
clock = sinon.useFakeTimers(new Date('2024-06-20'));
|
||||||
|
const juneGear = content.gear.flat;
|
||||||
|
expect(juneGear.armor_armoire_corsairsCoatAndCape).to.not.exist;
|
||||||
|
clock.restore();
|
||||||
|
clock = sinon.useFakeTimers(new Date('2024-07-10'));
|
||||||
|
const julyGear = content.gear.flat;
|
||||||
|
expect(julyGear.armor_armoire_corsairsCoatAndCape).to.exist;
|
||||||
|
expect(Object.keys(juneGear).length, '').to.equal(Object.keys(julyGear).length - 3);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Releases pets gear when appropriate without needing restarting', () => {
|
||||||
|
clock = sinon.useFakeTimers(new Date('2024-06-20'));
|
||||||
|
const junePets = content.petInfo;
|
||||||
|
expect(junePets['Chameleon-Base']).to.not.exist;
|
||||||
|
clock.restore();
|
||||||
|
clock = sinon.useFakeTimers(new Date('2024-07-10'));
|
||||||
|
const julyPets = content.petInfo;
|
||||||
|
expect(julyPets['Chameleon-Base']).to.exist;
|
||||||
|
expect(Object.keys(junePets).length, '').to.equal(Object.keys(julyPets).length - 10);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Releases mounts gear when appropriate without needing restarting', () => {
|
||||||
|
clock = sinon.useFakeTimers(new Date('2024-06-20'));
|
||||||
|
const juneMounts = content.mountInfo;
|
||||||
|
expect(juneMounts['Chameleon-Base']).to.not.exist;
|
||||||
|
clock.restore();
|
||||||
|
clock = sinon.useFakeTimers(new Date('2024-07-10'));
|
||||||
|
const julyMounts = content.mountInfo;
|
||||||
|
expect(julyMounts['Chameleon-Base']).to.exist;
|
||||||
|
expect(Object.keys(juneMounts).length, '').to.equal(Object.keys(julyMounts).length - 10);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('marks regular food as buyable and droppable without any events', () => {
|
||||||
|
clock = sinon.useFakeTimers(new Date('2024-06-20'));
|
||||||
|
const { food } = content;
|
||||||
|
Object.keys(food).forEach(key => {
|
||||||
|
if (key === 'Saddle') {
|
||||||
|
expect(food[key].canBuy(), `${key} canBuy`).to.be.true;
|
||||||
|
expect(food[key].canDrop, `${key} canDrop`).to.be.false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let expected = true;
|
||||||
|
if (key.startsWith('Cake_')) {
|
||||||
|
expected = false;
|
||||||
|
} else if (key.startsWith('Candy_')) {
|
||||||
|
expected = false;
|
||||||
|
} else if (key.startsWith('Pie_')) {
|
||||||
|
expected = false;
|
||||||
|
}
|
||||||
|
expect(food[key].canBuy(), `${key} canBuy`).to.equal(expected);
|
||||||
|
expect(food[key].canDrop, `${key} canDrop`).to.equal(expected);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('marks candy as buyable and droppable during habitoween', () => {
|
||||||
|
clock = sinon.useFakeTimers(new Date('2024-10-31'));
|
||||||
|
const { food } = content;
|
||||||
|
Object.keys(food).forEach(key => {
|
||||||
|
if (key === 'Saddle') {
|
||||||
|
expect(food[key].canBuy(), `${key} canBuy`).to.be.true;
|
||||||
|
expect(food[key].canDrop, `${key} canDrop`).to.be.false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let expected = false;
|
||||||
|
if (key.startsWith('Cake_')) {
|
||||||
|
expected = false;
|
||||||
|
} else if (key.startsWith('Candy_')) {
|
||||||
|
expected = true;
|
||||||
|
} else if (key.startsWith('Pie_')) {
|
||||||
|
expected = false;
|
||||||
|
}
|
||||||
|
expect(food[key].canBuy(), `${key} canBuy`).to.equal(expected);
|
||||||
|
expect(food[key].canDrop, `${key} canDrop`).to.equal(expected);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('marks cake as buyable and droppable during birthday', () => {
|
||||||
|
clock = sinon.useFakeTimers(new Date('2024-01-31'));
|
||||||
|
const { food } = content;
|
||||||
|
Object.keys(food).forEach(key => {
|
||||||
|
if (key === 'Saddle') {
|
||||||
|
expect(food[key].canBuy(), `${key} canBuy`).to.be.true;
|
||||||
|
expect(food[key].canDrop, `${key} canDrop`).to.be.false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let expected = false;
|
||||||
|
if (key.startsWith('Cake_')) {
|
||||||
|
expected = true;
|
||||||
|
} else if (key.startsWith('Candy_')) {
|
||||||
|
expected = false;
|
||||||
|
} else if (key.startsWith('Pie_')) {
|
||||||
|
expected = false;
|
||||||
|
}
|
||||||
|
expect(food[key].canBuy(), `${key} canBuy`).to.equal(expected);
|
||||||
|
expect(food[key].canDrop, `${key} canDrop`).to.equal(expected);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('marks pie as buyable and droppable during pi day', () => {
|
||||||
|
clock = sinon.useFakeTimers(new Date('2024-03-14'));
|
||||||
|
const { food } = content;
|
||||||
|
Object.keys(food).forEach(key => {
|
||||||
|
if (key === 'Saddle') {
|
||||||
|
expect(food[key].canBuy(), `${key} canBuy`).to.be.true;
|
||||||
|
expect(food[key].canDrop, `${key} canDrop`).to.be.false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let expected = false;
|
||||||
|
if (key.startsWith('Cake_')) {
|
||||||
|
expected = false;
|
||||||
|
} else if (key.startsWith('Candy_')) {
|
||||||
|
expected = false;
|
||||||
|
} else if (key.startsWith('Pie_')) {
|
||||||
|
expected = true;
|
||||||
|
}
|
||||||
|
expect(food[key].canBuy(), `${key} canBuy`).to.equal(expected);
|
||||||
|
expect(food[key].canDrop, `${key} canDrop`).to.equal(expected);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -6,7 +6,7 @@ import {
|
|||||||
} from '../helpers/content.helper';
|
} from '../helpers/content.helper';
|
||||||
import t from '../../website/common/script/content/translation';
|
import t from '../../website/common/script/content/translation';
|
||||||
|
|
||||||
import * as stable from '../../website/common/script/content/stable';
|
import stable from '../../website/common/script/content/stable';
|
||||||
import eggs from '../../website/common/script/content/eggs';
|
import eggs from '../../website/common/script/content/eggs';
|
||||||
import potions from '../../website/common/script/content/hatching-potions';
|
import potions from '../../website/common/script/content/hatching-potions';
|
||||||
|
|
||||||
|
|||||||
@@ -320,7 +320,7 @@
|
|||||||
<script>
|
<script>
|
||||||
import each from 'lodash/each';
|
import each from 'lodash/each';
|
||||||
import * as quests from '@/../../common/script/content/quests';
|
import * as quests from '@/../../common/script/content/quests';
|
||||||
import { mountInfo, petInfo } from '@/../../common/script/content/stable';
|
import stable from '@/../../common/script/content/stable';
|
||||||
import content from '@/../../common/script/content';
|
import content from '@/../../common/script/content';
|
||||||
import gear from '@/../../common/script/content/gear';
|
import gear from '@/../../common/script/content/gear';
|
||||||
import styleHelper from '@/mixins/styleHelper';
|
import styleHelper from '@/mixins/styleHelper';
|
||||||
@@ -330,6 +330,8 @@ import userLink from '../userLink';
|
|||||||
import PurchaseHistoryTable from '../ui/purchaseHistoryTable.vue';
|
import PurchaseHistoryTable from '../ui/purchaseHistoryTable.vue';
|
||||||
import { userStateMixin } from '../../mixins/userState';
|
import { userStateMixin } from '../../mixins/userState';
|
||||||
|
|
||||||
|
const { mountInfo, petInfo } = stable;
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
userLink,
|
userLink,
|
||||||
|
|||||||
@@ -80,7 +80,7 @@
|
|||||||
</style>
|
</style>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { mountInfo } from '@/../../common/script/content/stable';
|
import stable from '@/../../common/script/content/stable';
|
||||||
import markdownDirective from '@/directives/markdown';
|
import markdownDirective from '@/directives/markdown';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@@ -105,7 +105,7 @@ export default {
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
openDialog (mountKey) {
|
openDialog (mountKey) {
|
||||||
this.mount = mountInfo[mountKey];
|
this.mount = stable.mountInfo[mountKey];
|
||||||
this.$root.$emit('bv::show::modal', 'mount-raised-modal');
|
this.$root.$emit('bv::show::modal', 'mount-raised-modal');
|
||||||
},
|
},
|
||||||
close () {
|
close () {
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ import achievements from './achievements';
|
|||||||
|
|
||||||
import eggs from './eggs';
|
import eggs from './eggs';
|
||||||
import hatchingPotions from './hatching-potions';
|
import hatchingPotions from './hatching-potions';
|
||||||
import * as stable from './stable';
|
import stable from './stable';
|
||||||
import gear from './gear';
|
import gear from './gear';
|
||||||
import { quests, questsByLevel, userCanOwnQuestCategories } from './quests';
|
import { quests, questsByLevel, userCanOwnQuestCategories } from './quests';
|
||||||
|
|
||||||
@@ -38,6 +38,7 @@ import { REPEATING_EVENTS, getRepeatingEvents } from './constants/events';
|
|||||||
import loginIncentives from './loginIncentives';
|
import loginIncentives from './loginIncentives';
|
||||||
|
|
||||||
import officialPinnedItems from './officialPinnedItems';
|
import officialPinnedItems from './officialPinnedItems';
|
||||||
|
import memoize from '../fns/datedMemoize';
|
||||||
|
|
||||||
const api = {};
|
const api = {};
|
||||||
|
|
||||||
@@ -165,9 +166,15 @@ api.cardTypes = {
|
|||||||
|
|
||||||
api.special = api.spells.special;
|
api.special = api.spells.special;
|
||||||
|
|
||||||
api.dropEggs = eggs.drops;
|
Object.defineProperty(api, 'dropEggs', {
|
||||||
api.questEggs = eggs.quests;
|
get () { return eggs.drops; },
|
||||||
api.eggs = eggs.all;
|
});
|
||||||
|
Object.defineProperty(api, 'questEggs', {
|
||||||
|
get () { return eggs.quests; },
|
||||||
|
});
|
||||||
|
Object.defineProperty(api, 'eggs', {
|
||||||
|
get () { return eggs.all; },
|
||||||
|
});
|
||||||
|
|
||||||
api.timeTravelStable = {
|
api.timeTravelStable = {
|
||||||
pets: {
|
pets: {
|
||||||
@@ -186,298 +193,339 @@ api.timeTravelStable = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
api.dropHatchingPotions = hatchingPotions.drops;
|
Object.defineProperty(api, 'dropHatchingPotions', {
|
||||||
api.premiumHatchingPotions = hatchingPotions.premium;
|
get () { return hatchingPotions.drops; },
|
||||||
api.wackyHatchingPotions = hatchingPotions.wacky;
|
|
||||||
api.hatchingPotions = hatchingPotions.all;
|
|
||||||
|
|
||||||
api.pets = stable.dropPets;
|
|
||||||
api.premiumPets = stable.premiumPets;
|
|
||||||
api.questPets = stable.questPets;
|
|
||||||
api.specialPets = stable.specialPets;
|
|
||||||
api.wackyPets = stable.wackyPets;
|
|
||||||
api.petInfo = stable.petInfo;
|
|
||||||
|
|
||||||
api.mounts = stable.dropMounts;
|
|
||||||
api.questMounts = stable.questMounts;
|
|
||||||
api.premiumMounts = stable.premiumMounts;
|
|
||||||
api.specialMounts = stable.specialMounts;
|
|
||||||
api.mountInfo = stable.mountInfo;
|
|
||||||
|
|
||||||
api.food = {
|
|
||||||
Meat: {
|
|
||||||
text: t('foodMeat'),
|
|
||||||
textA: t('foodMeatA'),
|
|
||||||
textThe: t('foodMeatThe'),
|
|
||||||
target: 'Base',
|
|
||||||
},
|
|
||||||
Milk: {
|
|
||||||
text: t('foodMilk'),
|
|
||||||
textA: t('foodMilkA'),
|
|
||||||
textThe: t('foodMilkThe'),
|
|
||||||
target: 'White',
|
|
||||||
},
|
|
||||||
Potatoe: {
|
|
||||||
text: t('foodPotatoe'),
|
|
||||||
textA: t('foodPotatoeA'),
|
|
||||||
textThe: t('foodPotatoeThe'),
|
|
||||||
target: 'Desert',
|
|
||||||
},
|
|
||||||
Strawberry: {
|
|
||||||
text: t('foodStrawberry'),
|
|
||||||
textA: t('foodStrawberryA'),
|
|
||||||
textThe: t('foodStrawberryThe'),
|
|
||||||
target: 'Red',
|
|
||||||
},
|
|
||||||
Chocolate: {
|
|
||||||
text: t('foodChocolate'),
|
|
||||||
textA: t('foodChocolateA'),
|
|
||||||
textThe: t('foodChocolateThe'),
|
|
||||||
target: 'Shade',
|
|
||||||
},
|
|
||||||
Fish: {
|
|
||||||
text: t('foodFish'),
|
|
||||||
textA: t('foodFishA'),
|
|
||||||
textThe: t('foodFishThe'),
|
|
||||||
target: 'Skeleton',
|
|
||||||
},
|
|
||||||
RottenMeat: {
|
|
||||||
text: t('foodRottenMeat'),
|
|
||||||
textA: t('foodRottenMeatA'),
|
|
||||||
textThe: t('foodRottenMeatThe'),
|
|
||||||
target: 'Zombie',
|
|
||||||
},
|
|
||||||
CottonCandyPink: {
|
|
||||||
text: t('foodCottonCandyPink'),
|
|
||||||
textA: t('foodCottonCandyPinkA'),
|
|
||||||
textThe: t('foodCottonCandyPinkThe'),
|
|
||||||
target: 'CottonCandyPink',
|
|
||||||
},
|
|
||||||
CottonCandyBlue: {
|
|
||||||
text: t('foodCottonCandyBlue'),
|
|
||||||
textA: t('foodCottonCandyBlueA'),
|
|
||||||
textThe: t('foodCottonCandyBlueThe'),
|
|
||||||
target: 'CottonCandyBlue',
|
|
||||||
},
|
|
||||||
Honey: {
|
|
||||||
text: t('foodHoney'),
|
|
||||||
textA: t('foodHoneyA'),
|
|
||||||
textThe: t('foodHoneyThe'),
|
|
||||||
target: 'Golden',
|
|
||||||
},
|
|
||||||
Saddle: {
|
|
||||||
sellWarningNote: t('foodSaddleSellWarningNote'),
|
|
||||||
text: t('foodSaddleText'),
|
|
||||||
value: 5,
|
|
||||||
notes: t('foodSaddleNotes'),
|
|
||||||
canDrop: false,
|
|
||||||
},
|
|
||||||
/* eslint-disable camelcase */
|
|
||||||
Cake_Skeleton: {
|
|
||||||
text: t('foodCakeSkeleton'),
|
|
||||||
textA: t('foodCakeSkeletonA'),
|
|
||||||
textThe: t('foodCakeSkeletonThe'),
|
|
||||||
target: 'Skeleton',
|
|
||||||
},
|
|
||||||
Cake_Base: {
|
|
||||||
text: t('foodCakeBase'),
|
|
||||||
textA: t('foodCakeBaseA'),
|
|
||||||
textThe: t('foodCakeBaseThe'),
|
|
||||||
target: 'Base',
|
|
||||||
},
|
|
||||||
Cake_CottonCandyBlue: {
|
|
||||||
text: t('foodCakeCottonCandyBlue'),
|
|
||||||
textA: t('foodCakeCottonCandyBlueA'),
|
|
||||||
textThe: t('foodCakeCottonCandyBlueThe'),
|
|
||||||
target: 'CottonCandyBlue',
|
|
||||||
},
|
|
||||||
Cake_CottonCandyPink: {
|
|
||||||
text: t('foodCakeCottonCandyPink'),
|
|
||||||
textA: t('foodCakeCottonCandyPinkA'),
|
|
||||||
textThe: t('foodCakeCottonCandyPinkThe'),
|
|
||||||
target: 'CottonCandyPink',
|
|
||||||
},
|
|
||||||
Cake_Shade: {
|
|
||||||
text: t('foodCakeShade'),
|
|
||||||
textA: t('foodCakeShadeA'),
|
|
||||||
textThe: t('foodCakeShadeThe'),
|
|
||||||
target: 'Shade',
|
|
||||||
},
|
|
||||||
Cake_White: {
|
|
||||||
text: t('foodCakeWhite'),
|
|
||||||
textA: t('foodCakeWhiteA'),
|
|
||||||
textThe: t('foodCakeWhiteThe'),
|
|
||||||
target: 'White',
|
|
||||||
},
|
|
||||||
Cake_Golden: {
|
|
||||||
text: t('foodCakeGolden'),
|
|
||||||
textA: t('foodCakeGoldenA'),
|
|
||||||
textThe: t('foodCakeGoldenThe'),
|
|
||||||
target: 'Golden',
|
|
||||||
},
|
|
||||||
Cake_Zombie: {
|
|
||||||
text: t('foodCakeZombie'),
|
|
||||||
textA: t('foodCakeZombieA'),
|
|
||||||
textThe: t('foodCakeZombieThe'),
|
|
||||||
target: 'Zombie',
|
|
||||||
},
|
|
||||||
Cake_Desert: {
|
|
||||||
text: t('foodCakeDesert'),
|
|
||||||
textA: t('foodCakeDesertA'),
|
|
||||||
textThe: t('foodCakeDesertThe'),
|
|
||||||
target: 'Desert',
|
|
||||||
},
|
|
||||||
Cake_Red: {
|
|
||||||
text: t('foodCakeRed'),
|
|
||||||
textA: t('foodCakeRedA'),
|
|
||||||
textThe: t('foodCakeRedThe'),
|
|
||||||
target: 'Red',
|
|
||||||
},
|
|
||||||
Candy_Skeleton: {
|
|
||||||
text: t('foodCandySkeleton'),
|
|
||||||
textA: t('foodCandySkeletonA'),
|
|
||||||
textThe: t('foodCandySkeletonThe'),
|
|
||||||
target: 'Skeleton',
|
|
||||||
},
|
|
||||||
Candy_Base: {
|
|
||||||
text: t('foodCandyBase'),
|
|
||||||
textA: t('foodCandyBaseA'),
|
|
||||||
textThe: t('foodCandyBaseThe'),
|
|
||||||
target: 'Base',
|
|
||||||
},
|
|
||||||
Candy_CottonCandyBlue: {
|
|
||||||
text: t('foodCandyCottonCandyBlue'),
|
|
||||||
textA: t('foodCandyCottonCandyBlueA'),
|
|
||||||
textThe: t('foodCandyCottonCandyBlueThe'),
|
|
||||||
target: 'CottonCandyBlue',
|
|
||||||
},
|
|
||||||
Candy_CottonCandyPink: {
|
|
||||||
text: t('foodCandyCottonCandyPink'),
|
|
||||||
textA: t('foodCandyCottonCandyPinkA'),
|
|
||||||
textThe: t('foodCandyCottonCandyPinkThe'),
|
|
||||||
target: 'CottonCandyPink',
|
|
||||||
},
|
|
||||||
Candy_Shade: {
|
|
||||||
text: t('foodCandyShade'),
|
|
||||||
textA: t('foodCandyShadeA'),
|
|
||||||
textThe: t('foodCandyShadeThe'),
|
|
||||||
target: 'Shade',
|
|
||||||
},
|
|
||||||
Candy_White: {
|
|
||||||
text: t('foodCandyWhite'),
|
|
||||||
textA: t('foodCandyWhiteA'),
|
|
||||||
textThe: t('foodCandyWhiteThe'),
|
|
||||||
target: 'White',
|
|
||||||
},
|
|
||||||
Candy_Golden: {
|
|
||||||
text: t('foodCandyGolden'),
|
|
||||||
textA: t('foodCandyGoldenA'),
|
|
||||||
textThe: t('foodCandyGoldenThe'),
|
|
||||||
target: 'Golden',
|
|
||||||
},
|
|
||||||
Candy_Zombie: {
|
|
||||||
text: t('foodCandyZombie'),
|
|
||||||
textA: t('foodCandyZombieA'),
|
|
||||||
textThe: t('foodCandyZombieThe'),
|
|
||||||
target: 'Zombie',
|
|
||||||
},
|
|
||||||
Candy_Desert: {
|
|
||||||
text: t('foodCandyDesert'),
|
|
||||||
textA: t('foodCandyDesertA'),
|
|
||||||
textThe: t('foodCandyDesertThe'),
|
|
||||||
target: 'Desert',
|
|
||||||
},
|
|
||||||
Candy_Red: {
|
|
||||||
text: t('foodCandyRed'),
|
|
||||||
textA: t('foodCandyRedA'),
|
|
||||||
textThe: t('foodCandyRedThe'),
|
|
||||||
target: 'Red',
|
|
||||||
},
|
|
||||||
Pie_Skeleton: {
|
|
||||||
text: t('foodPieSkeleton'),
|
|
||||||
textA: t('foodPieSkeletonA'),
|
|
||||||
textThe: t('foodPieSkeletonThe'),
|
|
||||||
target: 'Skeleton',
|
|
||||||
},
|
|
||||||
Pie_Base: {
|
|
||||||
text: t('foodPieBase'),
|
|
||||||
textA: t('foodPieBaseA'),
|
|
||||||
textThe: t('foodPieBaseThe'),
|
|
||||||
target: 'Base',
|
|
||||||
},
|
|
||||||
Pie_CottonCandyBlue: {
|
|
||||||
text: t('foodPieCottonCandyBlue'),
|
|
||||||
textA: t('foodPieCottonCandyBlueA'),
|
|
||||||
textThe: t('foodPieCottonCandyBlueThe'),
|
|
||||||
target: 'CottonCandyBlue',
|
|
||||||
},
|
|
||||||
Pie_CottonCandyPink: {
|
|
||||||
text: t('foodPieCottonCandyPink'),
|
|
||||||
textA: t('foodPieCottonCandyPinkA'),
|
|
||||||
textThe: t('foodPieCottonCandyPinkThe'),
|
|
||||||
target: 'CottonCandyPink',
|
|
||||||
},
|
|
||||||
Pie_Shade: {
|
|
||||||
text: t('foodPieShade'),
|
|
||||||
textA: t('foodPieShadeA'),
|
|
||||||
textThe: t('foodPieShadeThe'),
|
|
||||||
target: 'Shade',
|
|
||||||
},
|
|
||||||
Pie_White: {
|
|
||||||
text: t('foodPieWhite'),
|
|
||||||
textA: t('foodPieWhiteA'),
|
|
||||||
textThe: t('foodPieWhiteThe'),
|
|
||||||
target: 'White',
|
|
||||||
},
|
|
||||||
Pie_Golden: {
|
|
||||||
text: t('foodPieGolden'),
|
|
||||||
textA: t('foodPieGoldenA'),
|
|
||||||
textThe: t('foodPieGoldenThe'),
|
|
||||||
target: 'Golden',
|
|
||||||
},
|
|
||||||
Pie_Zombie: {
|
|
||||||
text: t('foodPieZombie'),
|
|
||||||
textA: t('foodPieZombieA'),
|
|
||||||
textThe: t('foodPieZombieThe'),
|
|
||||||
target: 'Zombie',
|
|
||||||
},
|
|
||||||
Pie_Desert: {
|
|
||||||
text: t('foodPieDesert'),
|
|
||||||
textA: t('foodPieDesertA'),
|
|
||||||
textThe: t('foodPieDesertThe'),
|
|
||||||
target: 'Desert',
|
|
||||||
},
|
|
||||||
Pie_Red: {
|
|
||||||
text: t('foodPieRed'),
|
|
||||||
textA: t('foodPieRedA'),
|
|
||||||
textThe: t('foodPieRedThe'),
|
|
||||||
target: 'Red',
|
|
||||||
},
|
|
||||||
/* eslint-enable camelcase */
|
|
||||||
};
|
|
||||||
|
|
||||||
let FOOD_SEASON = 'Normal';
|
|
||||||
getRepeatingEvents(moment()).forEach(event => {
|
|
||||||
if (event.foodSeason) {
|
|
||||||
FOOD_SEASON = event.foodSeason;
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
each(api.food, (food, key) => {
|
Object.defineProperty(api, 'premiumHatchingPotions', {
|
||||||
let foodType = 'Normal';
|
get () { return hatchingPotions.premium; },
|
||||||
if (key.startsWith('Cake_')) {
|
});
|
||||||
foodType = 'Cake';
|
Object.defineProperty(api, 'wackyHatchingPotions', {
|
||||||
} else if (key.startsWith('Candy_')) {
|
get () { return hatchingPotions.wacky; },
|
||||||
foodType = 'Candy';
|
});
|
||||||
} else if (key.startsWith('Pie_')) {
|
Object.defineProperty(api, 'hatchingPotions', {
|
||||||
foodType = 'Pie';
|
get () { return hatchingPotions.all; },
|
||||||
}
|
});
|
||||||
defaults(food, {
|
|
||||||
value: 1,
|
Object.defineProperty(api, 'dropPets', {
|
||||||
key,
|
get () { return stable.dropPets; },
|
||||||
notes: t('foodNotes'),
|
});
|
||||||
canBuy: () => FOOD_SEASON === foodType,
|
Object.defineProperty(api, 'premiumPets', {
|
||||||
canDrop: FOOD_SEASON === foodType,
|
get () { return stable.premiumPets; },
|
||||||
|
});
|
||||||
|
Object.defineProperty(api, 'questPets', {
|
||||||
|
get () { return stable.questPets; },
|
||||||
|
});
|
||||||
|
Object.defineProperty(api, 'specialPets', {
|
||||||
|
get () { return stable.specialPets; },
|
||||||
|
});
|
||||||
|
Object.defineProperty(api, 'wackyPets', {
|
||||||
|
get () { return stable.wackyPets; },
|
||||||
|
});
|
||||||
|
Object.defineProperty(api, 'petInfo', {
|
||||||
|
get () { return stable.petInfo; },
|
||||||
|
});
|
||||||
|
|
||||||
|
Object.defineProperty(api, 'dropMounts', {
|
||||||
|
get () { return stable.dropMounts; },
|
||||||
|
});
|
||||||
|
Object.defineProperty(api, 'premiumMounts', {
|
||||||
|
get () { return stable.premiumMounts; },
|
||||||
|
});
|
||||||
|
Object.defineProperty(api, 'questMounts', {
|
||||||
|
get () { return stable.questMounts; },
|
||||||
|
});
|
||||||
|
Object.defineProperty(api, 'specialMounts', {
|
||||||
|
get () { return stable.specialMounts; },
|
||||||
|
});
|
||||||
|
Object.defineProperty(api, 'mountInfo', {
|
||||||
|
get () { return stable.mountInfo; },
|
||||||
|
});
|
||||||
|
|
||||||
|
function buildFood() {
|
||||||
|
const food = {
|
||||||
|
Meat: {
|
||||||
|
text: t('foodMeat'),
|
||||||
|
textA: t('foodMeatA'),
|
||||||
|
textThe: t('foodMeatThe'),
|
||||||
|
target: 'Base',
|
||||||
|
},
|
||||||
|
Milk: {
|
||||||
|
text: t('foodMilk'),
|
||||||
|
textA: t('foodMilkA'),
|
||||||
|
textThe: t('foodMilkThe'),
|
||||||
|
target: 'White',
|
||||||
|
},
|
||||||
|
Potatoe: {
|
||||||
|
text: t('foodPotatoe'),
|
||||||
|
textA: t('foodPotatoeA'),
|
||||||
|
textThe: t('foodPotatoeThe'),
|
||||||
|
target: 'Desert',
|
||||||
|
},
|
||||||
|
Strawberry: {
|
||||||
|
text: t('foodStrawberry'),
|
||||||
|
textA: t('foodStrawberryA'),
|
||||||
|
textThe: t('foodStrawberryThe'),
|
||||||
|
target: 'Red',
|
||||||
|
},
|
||||||
|
Chocolate: {
|
||||||
|
text: t('foodChocolate'),
|
||||||
|
textA: t('foodChocolateA'),
|
||||||
|
textThe: t('foodChocolateThe'),
|
||||||
|
target: 'Shade',
|
||||||
|
},
|
||||||
|
Fish: {
|
||||||
|
text: t('foodFish'),
|
||||||
|
textA: t('foodFishA'),
|
||||||
|
textThe: t('foodFishThe'),
|
||||||
|
target: 'Skeleton',
|
||||||
|
},
|
||||||
|
RottenMeat: {
|
||||||
|
text: t('foodRottenMeat'),
|
||||||
|
textA: t('foodRottenMeatA'),
|
||||||
|
textThe: t('foodRottenMeatThe'),
|
||||||
|
target: 'Zombie',
|
||||||
|
},
|
||||||
|
CottonCandyPink: {
|
||||||
|
text: t('foodCottonCandyPink'),
|
||||||
|
textA: t('foodCottonCandyPinkA'),
|
||||||
|
textThe: t('foodCottonCandyPinkThe'),
|
||||||
|
target: 'CottonCandyPink',
|
||||||
|
},
|
||||||
|
CottonCandyBlue: {
|
||||||
|
text: t('foodCottonCandyBlue'),
|
||||||
|
textA: t('foodCottonCandyBlueA'),
|
||||||
|
textThe: t('foodCottonCandyBlueThe'),
|
||||||
|
target: 'CottonCandyBlue',
|
||||||
|
},
|
||||||
|
Honey: {
|
||||||
|
text: t('foodHoney'),
|
||||||
|
textA: t('foodHoneyA'),
|
||||||
|
textThe: t('foodHoneyThe'),
|
||||||
|
target: 'Golden',
|
||||||
|
},
|
||||||
|
Saddle: {
|
||||||
|
sellWarningNote: t('foodSaddleSellWarningNote'),
|
||||||
|
text: t('foodSaddleText'),
|
||||||
|
value: 5,
|
||||||
|
notes: t('foodSaddleNotes'),
|
||||||
|
canBuy: () => true,
|
||||||
|
canDrop: false,
|
||||||
|
},
|
||||||
|
/* eslint-disable camelcase */
|
||||||
|
Cake_Skeleton: {
|
||||||
|
text: t('foodCakeSkeleton'),
|
||||||
|
textA: t('foodCakeSkeletonA'),
|
||||||
|
textThe: t('foodCakeSkeletonThe'),
|
||||||
|
target: 'Skeleton',
|
||||||
|
},
|
||||||
|
Cake_Base: {
|
||||||
|
text: t('foodCakeBase'),
|
||||||
|
textA: t('foodCakeBaseA'),
|
||||||
|
textThe: t('foodCakeBaseThe'),
|
||||||
|
target: 'Base',
|
||||||
|
},
|
||||||
|
Cake_CottonCandyBlue: {
|
||||||
|
text: t('foodCakeCottonCandyBlue'),
|
||||||
|
textA: t('foodCakeCottonCandyBlueA'),
|
||||||
|
textThe: t('foodCakeCottonCandyBlueThe'),
|
||||||
|
target: 'CottonCandyBlue',
|
||||||
|
},
|
||||||
|
Cake_CottonCandyPink: {
|
||||||
|
text: t('foodCakeCottonCandyPink'),
|
||||||
|
textA: t('foodCakeCottonCandyPinkA'),
|
||||||
|
textThe: t('foodCakeCottonCandyPinkThe'),
|
||||||
|
target: 'CottonCandyPink',
|
||||||
|
},
|
||||||
|
Cake_Shade: {
|
||||||
|
text: t('foodCakeShade'),
|
||||||
|
textA: t('foodCakeShadeA'),
|
||||||
|
textThe: t('foodCakeShadeThe'),
|
||||||
|
target: 'Shade',
|
||||||
|
},
|
||||||
|
Cake_White: {
|
||||||
|
text: t('foodCakeWhite'),
|
||||||
|
textA: t('foodCakeWhiteA'),
|
||||||
|
textThe: t('foodCakeWhiteThe'),
|
||||||
|
target: 'White',
|
||||||
|
},
|
||||||
|
Cake_Golden: {
|
||||||
|
text: t('foodCakeGolden'),
|
||||||
|
textA: t('foodCakeGoldenA'),
|
||||||
|
textThe: t('foodCakeGoldenThe'),
|
||||||
|
target: 'Golden',
|
||||||
|
},
|
||||||
|
Cake_Zombie: {
|
||||||
|
text: t('foodCakeZombie'),
|
||||||
|
textA: t('foodCakeZombieA'),
|
||||||
|
textThe: t('foodCakeZombieThe'),
|
||||||
|
target: 'Zombie',
|
||||||
|
},
|
||||||
|
Cake_Desert: {
|
||||||
|
text: t('foodCakeDesert'),
|
||||||
|
textA: t('foodCakeDesertA'),
|
||||||
|
textThe: t('foodCakeDesertThe'),
|
||||||
|
target: 'Desert',
|
||||||
|
},
|
||||||
|
Cake_Red: {
|
||||||
|
text: t('foodCakeRed'),
|
||||||
|
textA: t('foodCakeRedA'),
|
||||||
|
textThe: t('foodCakeRedThe'),
|
||||||
|
target: 'Red',
|
||||||
|
},
|
||||||
|
Candy_Skeleton: {
|
||||||
|
text: t('foodCandySkeleton'),
|
||||||
|
textA: t('foodCandySkeletonA'),
|
||||||
|
textThe: t('foodCandySkeletonThe'),
|
||||||
|
target: 'Skeleton',
|
||||||
|
},
|
||||||
|
Candy_Base: {
|
||||||
|
text: t('foodCandyBase'),
|
||||||
|
textA: t('foodCandyBaseA'),
|
||||||
|
textThe: t('foodCandyBaseThe'),
|
||||||
|
target: 'Base',
|
||||||
|
},
|
||||||
|
Candy_CottonCandyBlue: {
|
||||||
|
text: t('foodCandyCottonCandyBlue'),
|
||||||
|
textA: t('foodCandyCottonCandyBlueA'),
|
||||||
|
textThe: t('foodCandyCottonCandyBlueThe'),
|
||||||
|
target: 'CottonCandyBlue',
|
||||||
|
},
|
||||||
|
Candy_CottonCandyPink: {
|
||||||
|
text: t('foodCandyCottonCandyPink'),
|
||||||
|
textA: t('foodCandyCottonCandyPinkA'),
|
||||||
|
textThe: t('foodCandyCottonCandyPinkThe'),
|
||||||
|
target: 'CottonCandyPink',
|
||||||
|
},
|
||||||
|
Candy_Shade: {
|
||||||
|
text: t('foodCandyShade'),
|
||||||
|
textA: t('foodCandyShadeA'),
|
||||||
|
textThe: t('foodCandyShadeThe'),
|
||||||
|
target: 'Shade',
|
||||||
|
},
|
||||||
|
Candy_White: {
|
||||||
|
text: t('foodCandyWhite'),
|
||||||
|
textA: t('foodCandyWhiteA'),
|
||||||
|
textThe: t('foodCandyWhiteThe'),
|
||||||
|
target: 'White',
|
||||||
|
},
|
||||||
|
Candy_Golden: {
|
||||||
|
text: t('foodCandyGolden'),
|
||||||
|
textA: t('foodCandyGoldenA'),
|
||||||
|
textThe: t('foodCandyGoldenThe'),
|
||||||
|
target: 'Golden',
|
||||||
|
},
|
||||||
|
Candy_Zombie: {
|
||||||
|
text: t('foodCandyZombie'),
|
||||||
|
textA: t('foodCandyZombieA'),
|
||||||
|
textThe: t('foodCandyZombieThe'),
|
||||||
|
target: 'Zombie',
|
||||||
|
},
|
||||||
|
Candy_Desert: {
|
||||||
|
text: t('foodCandyDesert'),
|
||||||
|
textA: t('foodCandyDesertA'),
|
||||||
|
textThe: t('foodCandyDesertThe'),
|
||||||
|
target: 'Desert',
|
||||||
|
},
|
||||||
|
Candy_Red: {
|
||||||
|
text: t('foodCandyRed'),
|
||||||
|
textA: t('foodCandyRedA'),
|
||||||
|
textThe: t('foodCandyRedThe'),
|
||||||
|
target: 'Red',
|
||||||
|
},
|
||||||
|
Pie_Skeleton: {
|
||||||
|
text: t('foodPieSkeleton'),
|
||||||
|
textA: t('foodPieSkeletonA'),
|
||||||
|
textThe: t('foodPieSkeletonThe'),
|
||||||
|
target: 'Skeleton',
|
||||||
|
},
|
||||||
|
Pie_Base: {
|
||||||
|
text: t('foodPieBase'),
|
||||||
|
textA: t('foodPieBaseA'),
|
||||||
|
textThe: t('foodPieBaseThe'),
|
||||||
|
target: 'Base',
|
||||||
|
},
|
||||||
|
Pie_CottonCandyBlue: {
|
||||||
|
text: t('foodPieCottonCandyBlue'),
|
||||||
|
textA: t('foodPieCottonCandyBlueA'),
|
||||||
|
textThe: t('foodPieCottonCandyBlueThe'),
|
||||||
|
target: 'CottonCandyBlue',
|
||||||
|
},
|
||||||
|
Pie_CottonCandyPink: {
|
||||||
|
text: t('foodPieCottonCandyPink'),
|
||||||
|
textA: t('foodPieCottonCandyPinkA'),
|
||||||
|
textThe: t('foodPieCottonCandyPinkThe'),
|
||||||
|
target: 'CottonCandyPink',
|
||||||
|
},
|
||||||
|
Pie_Shade: {
|
||||||
|
text: t('foodPieShade'),
|
||||||
|
textA: t('foodPieShadeA'),
|
||||||
|
textThe: t('foodPieShadeThe'),
|
||||||
|
target: 'Shade',
|
||||||
|
},
|
||||||
|
Pie_White: {
|
||||||
|
text: t('foodPieWhite'),
|
||||||
|
textA: t('foodPieWhiteA'),
|
||||||
|
textThe: t('foodPieWhiteThe'),
|
||||||
|
target: 'White',
|
||||||
|
},
|
||||||
|
Pie_Golden: {
|
||||||
|
text: t('foodPieGolden'),
|
||||||
|
textA: t('foodPieGoldenA'),
|
||||||
|
textThe: t('foodPieGoldenThe'),
|
||||||
|
target: 'Golden',
|
||||||
|
},
|
||||||
|
Pie_Zombie: {
|
||||||
|
text: t('foodPieZombie'),
|
||||||
|
textA: t('foodPieZombieA'),
|
||||||
|
textThe: t('foodPieZombieThe'),
|
||||||
|
target: 'Zombie',
|
||||||
|
},
|
||||||
|
Pie_Desert: {
|
||||||
|
text: t('foodPieDesert'),
|
||||||
|
textA: t('foodPieDesertA'),
|
||||||
|
textThe: t('foodPieDesertThe'),
|
||||||
|
target: 'Desert',
|
||||||
|
},
|
||||||
|
Pie_Red: {
|
||||||
|
text: t('foodPieRed'),
|
||||||
|
textA: t('foodPieRedA'),
|
||||||
|
textThe: t('foodPieRedThe'),
|
||||||
|
target: 'Red',
|
||||||
|
},
|
||||||
|
/* eslint-enable camelcase */
|
||||||
|
};
|
||||||
|
|
||||||
|
let FOOD_SEASON = 'Normal';
|
||||||
|
getRepeatingEvents(moment()).forEach(event => {
|
||||||
|
if (event.foodSeason) {
|
||||||
|
FOOD_SEASON = event.foodSeason;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
each(food, (foodItem, key) => {
|
||||||
|
let foodType = 'Normal';
|
||||||
|
if (key.startsWith('Cake_')) {
|
||||||
|
foodType = 'Cake';
|
||||||
|
} else if (key.startsWith('Candy_')) {
|
||||||
|
foodType = 'Candy';
|
||||||
|
} else if (key.startsWith('Pie_')) {
|
||||||
|
foodType = 'Pie';
|
||||||
|
}
|
||||||
|
defaults(foodItem, {
|
||||||
|
value: 1,
|
||||||
|
key,
|
||||||
|
notes: t('foodNotes'),
|
||||||
|
canBuy: () => FOOD_SEASON === foodType,
|
||||||
|
canDrop: FOOD_SEASON === foodType,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
return food;
|
||||||
|
}
|
||||||
|
|
||||||
|
const memoizedBuildFood = memoize(buildFood);
|
||||||
|
|
||||||
|
Object.defineProperty(api, 'food', {
|
||||||
|
get () { return memoizedBuildFood(); },
|
||||||
});
|
});
|
||||||
|
|
||||||
api.appearances = appearances;
|
api.appearances = appearances;
|
||||||
|
|||||||
@@ -4,11 +4,9 @@ import { EVENTS } from './constants/events';
|
|||||||
import allEggs from './eggs';
|
import allEggs from './eggs';
|
||||||
import allPotions from './hatching-potions';
|
import allPotions from './hatching-potions';
|
||||||
import t from './translation';
|
import t from './translation';
|
||||||
|
import memoize from '../fns/datedMemoize';
|
||||||
|
|
||||||
const petInfo = {};
|
function constructSet (type, eggs, potions, petInfo, mountInfo, hasMounts = true) {
|
||||||
const mountInfo = {};
|
|
||||||
|
|
||||||
function constructSet (type, eggs, potions, hasMounts = true) {
|
|
||||||
const pets = {};
|
const pets = {};
|
||||||
const mounts = {};
|
const mounts = {};
|
||||||
|
|
||||||
@@ -123,11 +121,6 @@ const canFindSpecial = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
const [dropPets, dropMounts] = constructSet('drop', allEggs.drops, allPotions.drops);
|
|
||||||
const [premiumPets, premiumMounts] = constructSet('premium', allEggs.drops, allPotions.premium);
|
|
||||||
const [questPets, questMounts] = constructSet('quest', allEggs.quests, allPotions.drops);
|
|
||||||
const wackyPets = constructSet('wacky', allEggs.drops, allPotions.wacky, false);
|
|
||||||
|
|
||||||
const specialPets = {
|
const specialPets = {
|
||||||
'Wolf-Veteran': 'veteranWolf',
|
'Wolf-Veteran': 'veteranWolf',
|
||||||
'Wolf-Cerberus': 'cerberusPup',
|
'Wolf-Cerberus': 'cerberusPup',
|
||||||
@@ -178,44 +171,88 @@ const specialMounts = {
|
|||||||
'JackOLantern-RoyalPurple': 'royalPurpleJackolantern',
|
'JackOLantern-RoyalPurple': 'royalPurpleJackolantern',
|
||||||
};
|
};
|
||||||
|
|
||||||
each(specialPets, (translationString, key) => {
|
function buildInfo () {
|
||||||
petInfo[key] = {
|
const petInfo = {};
|
||||||
key,
|
const mountInfo = {};
|
||||||
type: 'special',
|
|
||||||
text: t(translationString),
|
|
||||||
canFind: canFindSpecial.pets[key],
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
Object.assign(petInfo['Gryphatrice-Jubilant'], {
|
const [dropPets, dropMounts] = constructSet('drop', allEggs.drops, allPotions.drops, petInfo, mountInfo);
|
||||||
canBuy () {
|
const [premiumPets, premiumMounts] = constructSet('premium', allEggs.drops, allPotions.premium, petInfo, mountInfo);
|
||||||
return moment().isBetween(EVENTS.birthday10.start, EVENTS.birthday10.end);
|
const [questPets, questMounts] = constructSet('quest', allEggs.quests, allPotions.drops, petInfo, mountInfo);
|
||||||
|
const wackyPets = constructSet('wacky', allEggs.drops, allPotions.wacky, petInfo, mountInfo, false);
|
||||||
|
|
||||||
|
each(specialPets, (translationString, key) => {
|
||||||
|
petInfo[key] = {
|
||||||
|
key,
|
||||||
|
type: 'special',
|
||||||
|
text: t(translationString),
|
||||||
|
canFind: canFindSpecial.pets[key],
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
Object.assign(petInfo['Gryphatrice-Jubilant'], {
|
||||||
|
canBuy () {
|
||||||
|
return moment().isBetween(EVENTS.birthday10.start, EVENTS.birthday10.end);
|
||||||
|
},
|
||||||
|
currency: 'gems',
|
||||||
|
event: 'birthday10',
|
||||||
|
value: 60,
|
||||||
|
purchaseType: 'pets',
|
||||||
|
});
|
||||||
|
|
||||||
|
each(specialMounts, (translationString, key) => {
|
||||||
|
mountInfo[key] = {
|
||||||
|
key,
|
||||||
|
type: 'special',
|
||||||
|
text: t(translationString),
|
||||||
|
canFind: canFindSpecial.mounts[key],
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
dropPets,
|
||||||
|
premiumPets,
|
||||||
|
questPets,
|
||||||
|
wackyPets,
|
||||||
|
dropMounts,
|
||||||
|
questMounts,
|
||||||
|
premiumMounts,
|
||||||
|
specialPets,
|
||||||
|
specialMounts,
|
||||||
|
petInfo,
|
||||||
|
mountInfo,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
const memoizedBuildInfo = memoize(buildInfo);
|
||||||
|
|
||||||
|
export default {
|
||||||
|
get dropPets () {
|
||||||
|
return memoizedBuildInfo().dropPets;
|
||||||
|
},
|
||||||
|
get premiumPets () {
|
||||||
|
return memoizedBuildInfo().premiumPets;
|
||||||
|
},
|
||||||
|
get questPets () {
|
||||||
|
return memoizedBuildInfo().questPets;
|
||||||
|
},
|
||||||
|
get wackyPets () {
|
||||||
|
return memoizedBuildInfo().wackyPets;
|
||||||
|
},
|
||||||
|
get dropMounts () {
|
||||||
|
return memoizedBuildInfo().dropMounts;
|
||||||
|
},
|
||||||
|
get questMounts () {
|
||||||
|
return memoizedBuildInfo().questMounts;
|
||||||
|
},
|
||||||
|
get premiumMounts () {
|
||||||
|
return memoizedBuildInfo().premiumMounts;
|
||||||
|
},
|
||||||
|
get petInfo () {
|
||||||
|
return memoizedBuildInfo().petInfo;
|
||||||
|
},
|
||||||
|
get mountInfo () {
|
||||||
|
return memoizedBuildInfo().mountInfo;
|
||||||
},
|
},
|
||||||
currency: 'gems',
|
|
||||||
event: 'birthday10',
|
|
||||||
value: 60,
|
|
||||||
purchaseType: 'pets',
|
|
||||||
});
|
|
||||||
|
|
||||||
each(specialMounts, (translationString, key) => {
|
|
||||||
mountInfo[key] = {
|
|
||||||
key,
|
|
||||||
type: 'special',
|
|
||||||
text: t(translationString),
|
|
||||||
canFind: canFindSpecial.mounts[key],
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
export {
|
|
||||||
dropPets,
|
|
||||||
premiumPets,
|
|
||||||
questPets,
|
|
||||||
wackyPets,
|
|
||||||
dropMounts,
|
|
||||||
questMounts,
|
|
||||||
premiumMounts,
|
|
||||||
specialPets,
|
specialPets,
|
||||||
specialMounts,
|
specialMounts,
|
||||||
petInfo,
|
|
||||||
mountInfo,
|
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user