Revert "allow eggs to have a release date"

This reverts commit 6d13a257dd.
This commit is contained in:
Phillip Thelen
2024-06-11 18:19:11 +02:00
parent 544d67e7e5
commit b83f62bd82
11 changed files with 97 additions and 153 deletions

View File

@@ -64,7 +64,7 @@ describe('armoire', () => {
delete require.cache[require.resolve('../../website/common/script/content/gear/sets/armoire')]; delete require.cache[require.resolve('../../website/common/script/content/gear/sets/armoire')];
clock = sinon.useFakeTimers(new Date('2024-02-07T09:00:00.000Z')); clock = sinon.useFakeTimers(new Date('2024-02-07T09:00:00.000Z'));
const febuaryItems = makeArmoireIitemList(); const febuaryItems = makeArmoireIitemList();
expect(febuaryItems.length).to.equal(384); expect(febuaryItems.length).to.equal(381);
}); });
it('sets have at least 2 items', () => { it('sets have at least 2 items', () => {

View File

@@ -5,26 +5,21 @@ import {
expectValidTranslationString, expectValidTranslationString,
} from '../helpers/content.helper'; } from '../helpers/content.helper';
import eggs from '../../website/common/script/content/eggs'; import * as eggs from '../../website/common/script/content/eggs';
describe('eggs', () => { describe('eggs', () => {
let clock; describe('all', () => {
it('is a combination of drop and quest eggs', () => {
const dropNumber = Object.keys(eggs.drops).length;
const questNumber = Object.keys(eggs.quests).length;
const allNumber = Object.keys(eggs.all).length;
afterEach(() => { expect(allNumber).to.be.greaterThan(0);
if (clock) { expect(allNumber).to.equal(dropNumber + questNumber);
clock.restore();
}
}); });
const eggTypes = [
'drops',
'quests',
];
eggTypes.forEach(eggType => {
describe(eggType, () => {
it('contains basic information about each egg', () => { it('contains basic information about each egg', () => {
each(eggs[eggType], (egg, key) => { each(eggs.all, (egg, key) => {
expectValidTranslationString(egg.text); expectValidTranslationString(egg.text);
expectValidTranslationString(egg.adjective); expectValidTranslationString(egg.adjective);
expectValidTranslationString(egg.mountText); expectValidTranslationString(egg.mountText);
@@ -36,20 +31,3 @@ describe('eggs', () => {
}); });
}); });
}); });
it('does not contain unreleased eggs', () => {
clock = sinon.useFakeTimers(new Date('2024-05-20'));
const questEggs = eggs.quests;
expect(questEggs.Giraffe).to.not.exist;
});
it('Releases eggs when appropriate without needing restarting', () => {
clock = sinon.useFakeTimers(new Date('2024-05-20'));
const mayEggs = eggs.quests;
clock.restore();
clock = sinon.useFakeTimers(new Date('2024-06-20'));
const juneEggs = eggs.quests;
expect(juneEggs.Giraffe).to.exist;
expect(Object.keys(mayEggs).length).to.equal(Object.keys(juneEggs).length - 1);
});
});

View File

@@ -7,20 +7,11 @@ import {
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 * as stable from '../../website/common/script/content/stable';
import eggs from '../../website/common/script/content/eggs'; import * as eggs from '../../website/common/script/content/eggs';
import potions from '../../website/common/script/content/hatching-potions'; import * as potions from '../../website/common/script/content/hatching-potions';
describe('stable', () => { describe('stable', () => {
describe('dropPets', () => { describe('dropPets', () => {
let clock;
beforeEach(() => {
clock = sinon.useFakeTimers(new Date('2020-05-20'));
});
afterEach(() => {
clock.restore();
});
it('contains a pet for each drop potion * each drop egg', () => { it('contains a pet for each drop potion * each drop egg', () => {
const numberOfDropPotions = Object.keys(potions.drops).length; const numberOfDropPotions = Object.keys(potions.drops).length;
const numberOfDropEggs = Object.keys(eggs.drops).length; const numberOfDropEggs = Object.keys(eggs.drops).length;

View File

@@ -1,19 +0,0 @@
export const ARMOIRE_RELEASE_DATES = {
somethingSpooky: { year: 2023, month: 10 },
cookingImplementsTwo: { year: 2023, month: 11 },
greenTrapper: { year: 2023, month: 12 },
schoolUniform: { year: 2024, month: 1 },
whiteLoungeWear: { year: 2024, month: 2 },
hatterSet: { year: 2024, month: 3 },
optimistSet: { year: 2024, month: 4 },
pottersSet: { year: 2024, month: 5 },
beachsideSet: { year: 2024, month: 6 },
};
export const EGGS_RELEASE_DATES = {
Giraffe: { year: 2024, month: 6, day: 1 },
};
export const HATCHING_POTIONS_RELEASE_DATES = {
Koi: { year: 2024, month: 6, day: 1 },
};

View File

@@ -1,10 +1,7 @@
import assign from 'lodash/assign';
import defaults from 'lodash/defaults'; import defaults from 'lodash/defaults';
import each from 'lodash/each'; import each from 'lodash/each';
import assign from 'lodash/assign';
import t from './translation'; import t from './translation';
import { filterReleased } from './is_released';
import { EGGS_RELEASE_DATES } from './constants/releaseDates';
import datedMemoize from '../fns/datedMemoize';
function applyEggDefaults (set, config) { function applyEggDefaults (set, config) {
each(set, (egg, key) => { each(set, (egg, key) => {
@@ -413,20 +410,10 @@ applyEggDefaults(quests, {
}, },
}); });
function filterEggs (eggs) { const all = assign({}, drops, quests);
return filterReleased(eggs, 'key', EGGS_RELEASE_DATES);
}
const memoizedFilter = datedMemoize(filterEggs); export {
drops,
export default { quests,
get drops () { all,
return memoizedFilter({ memoizeConfig: true, identifier: 'drops' }, drops);
},
get quests () {
return memoizedFilter({ memoizeConfig: true, identifier: 'quests' }, quests);
},
get all () {
return assign({}, this.drops, this.quests);
},
}; };

View File

@@ -2,13 +2,12 @@ import defaults from 'lodash/defaults';
import find from 'lodash/find'; import find from 'lodash/find';
import forEach from 'lodash/forEach'; import forEach from 'lodash/forEach';
import moment from 'moment'; import moment from 'moment';
import nconf from 'nconf';
import upperFirst from 'lodash/upperFirst'; import upperFirst from 'lodash/upperFirst';
import { ownsItem } from '../gear-helper'; import { ownsItem } from '../gear-helper';
import { ATTRIBUTES } from '../../../constants'; import { ATTRIBUTES } from '../../../constants';
import t from '../../translation'; import t from '../../translation';
import memoize from '../../../fns/datedMemoize'; import memoize from '../../../fns/datedMemoize';
import { ARMOIRE_RELEASE_DATES as releaseDates } from '../../constants/releaseDates';
import { buildReleaseDate } from '../../is_released';
const armor = { const armor = {
lunarArmor: { lunarArmor: {
@@ -1834,7 +1833,19 @@ const weapon = {
}, },
}; };
const SWITCHOVER_TIME = nconf.get('CONTENT_SWITCHOVER_TIME_OFFSET') || 0;
const releaseDay = 7; const releaseDay = 7;
const releaseDates = {
somethingSpooky: { year: 2023, month: 10 },
cookingImplementsTwo: { year: 2023, month: 11 },
greenTrapper: { year: 2023, month: 12 },
schoolUniform: { year: 2024, month: 1 },
whiteLoungeWear: { year: 2024, month: 2 },
hatterSet: { year: 2024, month: 3 },
optimistSet: { year: 2024, month: 4 },
pottersSet: { year: 2024, month: 5 },
beachsideSet: { year: 2024, month: 6 },
};
forEach({ forEach({
armor, armor,
@@ -1879,12 +1890,12 @@ forEach({
function updateReleased (type) { function updateReleased (type) {
const today = moment(); const today = moment();
const releaseDateEndPart = `${String(releaseDay).padStart(2, '0')}T${String(SWITCHOVER_TIME).padStart(2, '0')}:00-0500`;
const returnType = {}; const returnType = {};
forEach(type, (gearItem, gearKey) => { forEach(type, (gearItem, gearKey) => {
let released; let released;
if (releaseDates[gearItem.set]) { if (releaseDates[gearItem.set]) {
const components = releaseDates[gearItem.set]; const releaseDateString = `${releaseDates[gearItem.set].year}-${String(releaseDates[gearItem.set].month).padStart(2, '0')}-${releaseDateEndPart}`;
const releaseDateString = buildReleaseDate(components.year, components.month, releaseDay);
released = today.isAfter(releaseDateString); released = today.isAfter(releaseDateString);
} else { } else {
released = true; released = true;

View File

@@ -18,8 +18,8 @@ import {
import achievements from './achievements'; import achievements from './achievements';
import eggs from './eggs'; import * as eggs from './eggs';
import hatchingPotions from './hatching-potions'; import * as hatchingPotions from './hatching-potions';
import * as stable from './stable'; import * as stable from './stable';
import gear from './gear'; import gear from './gear';
import { quests, questsByLevel, userCanOwnQuestCategories } from './quests'; import { quests, questsByLevel, userCanOwnQuestCategories } from './quests';

View File

@@ -1,30 +0,0 @@
import moment from 'moment';
import filter from 'lodash/filter';
import { pickBy } from 'lodash';
import nconf from 'nconf';
const SWITCHOVER_TIME = nconf.get('CONTENT_SWITCHOVER_TIME_OFFSET') || 0;
const releaseDateEndPart = `T${String(SWITCHOVER_TIME).padStart(2, '0')}:00-0000`;
export function buildReleaseDate (year, month, day = 1) {
return `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')}${releaseDateEndPart}`;
}
function isReleased (item, fieldName, releaseDateMap, releaseByDefault) {
if (releaseDateMap[item[fieldName]]) {
const release = releaseDateMap[item[fieldName]];
if (release.day) {
return moment().isAfter(moment(buildReleaseDate(release.year, release.month, release.day)));
}
return moment().isAfter(releaseDateMap[item[fieldName]]);
}
return releaseByDefault;
}
export function filterReleased (items, fieldName, releaseDateMap, releaseByDefault = true) {
if (typeof items === 'object') {
return pickBy(items, item => isReleased(item, fieldName, releaseDateMap, releaseByDefault));
}
return filter(items, item => isReleased(item, fieldName, releaseDateMap, releaseByDefault));
}

View File

@@ -1,14 +1,21 @@
import each from 'lodash/each'; import each from 'lodash/each';
import moment from 'moment'; import moment from 'moment';
import { EVENTS } from './constants/events'; import { EVENTS } from './constants/events';
import allEggs from './eggs'; import {
import allPotions from './hatching-potions'; drops as dropEggs,
quests as questEggs,
} from './eggs';
import {
drops as dropPotions,
premium as premiumPotions,
wacky as wackyPotions,
} from './hatching-potions';
import t from './translation'; import t from './translation';
const petInfo = {}; const petInfo = {};
const mountInfo = {}; const mountInfo = {};
function constructSet (type, eggs, potions, hasMounts = true) { function constructSet (type, eggs, potions) {
const pets = {}; const pets = {};
const mounts = {}; const mounts = {};
@@ -30,24 +37,52 @@ function constructSet (type, eggs, potions, hasMounts = true) {
potion: potion.text, potion: potion.text,
egg: egg.text, egg: egg.text,
})); }));
pets[key] = true;
if (hasMounts) {
mountInfo[key] = getAnimalData(t('mountName', { mountInfo[key] = getAnimalData(t('mountName', {
potion: potion.text, potion: potion.text,
mount: egg.mountText, mount: egg.mountText,
})); }));
pets[key] = true;
mounts[key] = true; mounts[key] = true;
}
}); });
}); });
if (hasMounts) {
return [pets, mounts]; return [pets, mounts];
} }
function constructPetOnlySet (type, eggs, potions) {
const pets = {};
each(eggs, egg => {
each(potions, potion => {
const key = `${egg.key}-${potion.key}`;
function getAnimalData (text) {
return {
key,
type,
potion: potion.key,
egg: egg.key,
text,
};
}
petInfo[key] = getAnimalData(t('petName', {
potion: potion.text,
egg: egg.text,
}));
pets[key] = true;
});
});
return pets; return pets;
} }
const [dropPets, dropMounts] = constructSet('drop', dropEggs, dropPotions);
const [premiumPets, premiumMounts] = constructSet('premium', dropEggs, premiumPotions);
const [questPets, questMounts] = constructSet('quest', questEggs, dropPotions);
const wackyPets = constructPetOnlySet('wacky', dropEggs, wackyPotions);
const canFindSpecial = { const canFindSpecial = {
pets: { pets: {
// Veteran Pet Ladder - awarded on major updates // Veteran Pet Ladder - awarded on major updates
@@ -123,11 +158,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',

View File

@@ -33,10 +33,6 @@ const memoize = fn => {
identifier = config.identifier; identifier = config.identifier;
} }
} }
if (identifier.length === 0) {
identifier = args.filter(arg => typeof arg === 'string').join('-');
}
} }
if (!checkedDate) { if (!checkedDate) {
checkedDate = new Date(); checkedDate = new Date();

View File

@@ -1,10 +1,10 @@
import allEggs from '../content/eggs'; import { drops as eggs } from '../content/eggs';
import allPotions from '../content/hatching-potions'; import { drops as hatchingPotions } from '../content/hatching-potions';
import randomVal from '../libs/randomVal'; import randomVal from '../libs/randomVal';
export default function firstDrops (user) { export default function firstDrops (user) {
const eggDrop = randomVal(allEggs.drops); const eggDrop = randomVal(eggs);
const potionDrop = randomVal(allPotions.drops); const potionDrop = randomVal(hatchingPotions);
user.items.eggs = { user.items.eggs = {
...user.items.eggs, ...user.items.eggs,