mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-16 06:07:21 +01:00
feat(content): prebuild Fall Festival (#14869)
* feat(content): prebuild Fall Festival * fix(typos): because 2023 is not the same as 2024 * feat(css): having stylesheets is important * feat(content): ready for review & testing * fix(tests): account for Sept 09 bundle * fix(gala): use multi event list more fix a couple of strings too * feat(content): Warrior and Rogue text also fix timing of quest bundle feature * fix(strings): correct stat boosts * fix(content): missing mage also adds missing margin to purchase gems button in buy modal --------- Co-authored-by: SabreCat <sabe@habitica.com>
This commit is contained in:
@@ -15,7 +15,7 @@ export default prefill({
|
||||
setPrice: 5, availableFrom: '2023-04-11T08:00-05:00', availableUntil: EVENTS.spring2023.end, text: t('shimmerColors'),
|
||||
},
|
||||
hauntedHairColors: {
|
||||
setPrice: 5, availableFrom: '2022-10-04T08:00-04:00', availableUntil: EVENTS.fall2022.end, text: t('hauntedColors'),
|
||||
setPrice: 5, availableFrom: '2023-10-03T08:00-04:00', availableUntil: EVENTS.fall2023.end, text: t('hauntedColors'),
|
||||
},
|
||||
winteryHairColors: {
|
||||
setPrice: 5, availableFrom: '2023-01-17T08:00-05:00', availableUntil: EVENTS.winter2023.end, text: t('winteryColors'),
|
||||
@@ -27,7 +27,7 @@ export default prefill({
|
||||
},
|
||||
spookySkins: { setPrice: 5, availableUntil: '2016-01-01', text: t('spookySkins') },
|
||||
supernaturalSkins: {
|
||||
setPrice: 5, availableFrom: '2022-10-04T08:00-04:00', availableUntil: EVENTS.fall2022.end, text: t('supernaturalSkins'),
|
||||
setPrice: 5, availableFrom: '2023-10-03T08:00-04:00', availableUntil: EVENTS.fall2023.end, text: t('supernaturalSkins'),
|
||||
},
|
||||
splashySkins: {
|
||||
setPrice: 5, availableFrom: '2023-07-11T08:00-05:00', availableUntil: EVENTS.summer2023.end, text: t('splashySkins'),
|
||||
|
||||
@@ -251,14 +251,15 @@ const bundles = {
|
||||
sandySidekicks: {
|
||||
key: 'sandySidekicks',
|
||||
text: t('sandySidekicksText'),
|
||||
notes: t('sandySidekicksNotes', { date: moment('2020-10-31').format('LL') }),
|
||||
notes: t('sandySidekicksNotes', { date: moment('2023-10-31').format('LL') }),
|
||||
bundleKeys: [
|
||||
'armadillo',
|
||||
'snake',
|
||||
'spider',
|
||||
],
|
||||
event: EVENTS.bundle202310,
|
||||
canBuy () {
|
||||
return moment().isBetween('2020-10-13', '2020-11-02');
|
||||
return moment().isBetween(EVENTS.bundle202310.start, EVENTS.bundle202310.end);
|
||||
},
|
||||
type: 'quests',
|
||||
value: 7,
|
||||
|
||||
@@ -10,11 +10,26 @@ const gemsPromo = {
|
||||
|
||||
export const EVENTS = {
|
||||
noEvent: {
|
||||
start: '2023-08-01T23:59-04:00',
|
||||
end: '2023-09-12T08:00-04:00',
|
||||
start: '2023-11-01T23:59-04:00',
|
||||
end: '2023-12-21T08:00-04:00',
|
||||
season: 'normal',
|
||||
npcImageSuffix: '',
|
||||
},
|
||||
bundle202310: {
|
||||
start: '2023-10-17T08:00-04:00',
|
||||
end: '2023-10-31T23:59-04:00',
|
||||
},
|
||||
potions202310: {
|
||||
start: '2023-09-21T08:00-04:00',
|
||||
end: '2023-10-31T23:59-04:00',
|
||||
},
|
||||
fall2023: {
|
||||
start: '2023-09-21T08:00-04:00',
|
||||
end: '2023-10-31T23:59-04:00',
|
||||
npcImageSuffix: '_fall',
|
||||
season: 'fall',
|
||||
gear: true,
|
||||
},
|
||||
bundle202309: {
|
||||
start: '2023-09-12T08:00-04:00',
|
||||
end: '2023-09-30T23:59-04:00',
|
||||
|
||||
@@ -209,6 +209,11 @@ const SEASONAL_SETS = {
|
||||
'fall2022OrcWarriorSet',
|
||||
'fall2022HarpyMageSet',
|
||||
'fall2022WatcherHealerSet',
|
||||
|
||||
'fall2023WitchsBrewRogueSet',
|
||||
'fall2023BogCreatureHealerSet',
|
||||
'fall2023ScaryMovieWarriorSet',
|
||||
'fall2023ScarletWarlockMageSet',
|
||||
],
|
||||
};
|
||||
|
||||
|
||||
@@ -828,15 +828,31 @@ const armor = {
|
||||
},
|
||||
summer2023Rogue: {
|
||||
set: 'summer2023GuppyRogueSet',
|
||||
canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'summer',
|
||||
},
|
||||
summer2023Warrior: {
|
||||
set: 'summer2023GoldfishWarriorSet',
|
||||
canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'summer',
|
||||
},
|
||||
summer2023Mage: {
|
||||
set: 'summer2023CoralMageSet',
|
||||
canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'summer',
|
||||
},
|
||||
summer2023Healer: {
|
||||
set: 'summer2023KelpHealerSet',
|
||||
canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'summer',
|
||||
},
|
||||
fall2023Warrior: {
|
||||
set: 'fall2023ScaryMovieWarriorSet',
|
||||
},
|
||||
fall2023Healer: {
|
||||
set: 'fall2023BogCreatureHealerSet',
|
||||
},
|
||||
fall2023Mage: {
|
||||
set: 'fall2023ScarletWarlockMageSet',
|
||||
},
|
||||
fall2023Rogue: {
|
||||
set: 'fall2023WitchsBrewRogueSet',
|
||||
},
|
||||
};
|
||||
|
||||
@@ -2019,15 +2035,31 @@ const head = {
|
||||
},
|
||||
summer2023Rogue: {
|
||||
set: 'summer2023GuppyRogueSet',
|
||||
canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'summer',
|
||||
},
|
||||
summer2023Warrior: {
|
||||
set: 'summer2023GoldfishWarriorSet',
|
||||
canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'summer',
|
||||
},
|
||||
summer2023Mage: {
|
||||
set: 'summer2023CoralMageSet',
|
||||
canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'summer',
|
||||
},
|
||||
summer2023Healer: {
|
||||
set: 'summer2023KelpHealerSet',
|
||||
canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'summer',
|
||||
},
|
||||
fall2023Healer: {
|
||||
set: 'fall2023BogCreatureHealerSet',
|
||||
},
|
||||
fall2023Mage: {
|
||||
set: 'fall2023ScarletWarlockMageSet',
|
||||
},
|
||||
fall2023Rogue: {
|
||||
set: 'fall2023WitchsBrewRogueSet',
|
||||
},
|
||||
fall2023Warrior: {
|
||||
set: 'fall2023ScaryMovieWarriorSet',
|
||||
},
|
||||
};
|
||||
|
||||
@@ -2861,12 +2893,26 @@ const shield = {
|
||||
},
|
||||
summer2023Rogue: {
|
||||
set: 'summer2023GuppyRogueSet',
|
||||
canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'fall',
|
||||
},
|
||||
summer2023Warrior: {
|
||||
set: 'summer2023GoldfishWarriorSet',
|
||||
canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'fall',
|
||||
},
|
||||
summer2023Healer: {
|
||||
set: 'summer2023KelpHealerSet',
|
||||
canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'fall',
|
||||
},
|
||||
fall2023Rogue: {
|
||||
set: 'fall2023WitchsBrewRogueSet',
|
||||
text: t('shieldSpecialFall2023RogueText'),
|
||||
notes: t('shieldSpecialFall2023RogueNotes', { str: 8 }),
|
||||
},
|
||||
fall2023Warrior: {
|
||||
set: 'fall2023ScaryMovieWarriorSet',
|
||||
},
|
||||
fall2023Healer: {
|
||||
set: 'fall2023BogCreatureHealerSet',
|
||||
},
|
||||
};
|
||||
|
||||
@@ -3642,15 +3688,31 @@ const weapon = {
|
||||
},
|
||||
summer2023Rogue: {
|
||||
set: 'summer2023GuppyRogueSet',
|
||||
canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'fall',
|
||||
},
|
||||
summer2023Warrior: {
|
||||
set: 'summer2023GoldfishWarriorSet',
|
||||
canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'fall',
|
||||
},
|
||||
summer2023Mage: {
|
||||
set: 'summer2023CoralMageSet',
|
||||
canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'fall',
|
||||
},
|
||||
summer2023Healer: {
|
||||
set: 'summer2023KelpHealerSet',
|
||||
canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'fall',
|
||||
},
|
||||
fall2023Rogue: {
|
||||
set: 'fall2023WitchsBrewRogueSet',
|
||||
},
|
||||
fall2023Healer: {
|
||||
set: 'fall2023BogCreatureHealerSet',
|
||||
},
|
||||
fall2023Warrior: {
|
||||
set: 'fall2023ScaryMovieWarriorSet',
|
||||
},
|
||||
fall2023Mage: {
|
||||
set: 'fall2023ScarletWarlockMageSet',
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
@@ -153,13 +153,13 @@ const premium = {
|
||||
value: 2,
|
||||
text: t('hatchingPotionSpooky'),
|
||||
limited: true,
|
||||
event: EVENTS.fall2021,
|
||||
event: EVENTS.fall2023,
|
||||
_addlNotes: t('eventAvailabilityReturning', {
|
||||
availableDate: t('dateEndOctober'),
|
||||
previousDate: t('septemberYYYY', { year: 2019 }),
|
||||
previousDate: t('octoberYYYY', { year: 2021 }),
|
||||
}),
|
||||
canBuy () {
|
||||
return moment().isBefore(EVENTS.fall2021.end);
|
||||
return moment().isBetween(EVENTS.fall2023.start, EVENTS.fall2023.end);
|
||||
},
|
||||
},
|
||||
Ghost: {
|
||||
@@ -244,13 +244,13 @@ const premium = {
|
||||
value: 2,
|
||||
text: t('hatchingPotionGlow'),
|
||||
limited: true,
|
||||
event: EVENTS.birthday10,
|
||||
event: EVENTS.fall2023,
|
||||
_addlNotes: t('eventAvailabilityReturning', {
|
||||
availableDate: t('dateStartFebruary'),
|
||||
previousDate: t('octoberYYYY', { year: 2021 }),
|
||||
availableDate: t('dateEndOctober'),
|
||||
previousDate: t('januaryYYYY', { year: 2023 }),
|
||||
}),
|
||||
canBuy () {
|
||||
return moment().isBetween(EVENTS.birthday10.start, EVENTS.birthday10.end);
|
||||
return moment().isBetween(EVENTS.fall2023.start, EVENTS.fall2023.end);
|
||||
},
|
||||
},
|
||||
Frost: {
|
||||
@@ -436,13 +436,13 @@ const premium = {
|
||||
value: 2,
|
||||
text: t('hatchingPotionVampire'),
|
||||
limited: true,
|
||||
event: EVENTS.birthday10,
|
||||
event: EVENTS.fall2023,
|
||||
_addlNotes: t('eventAvailabilityReturning', {
|
||||
availableDate: t('dateStartFebruary'),
|
||||
previousDate: t('octoberYYYY', { year: 2022 }),
|
||||
availableDate: t('dateEndOctober'),
|
||||
previousDate: t('januaryYYYY', { year: 2023 }),
|
||||
}),
|
||||
canBuy () {
|
||||
return moment().isBetween(EVENTS.birthday10.start, EVENTS.birthday10.end);
|
||||
return moment().isBetween(EVENTS.fall2023.start, EVENTS.fall2023.end);
|
||||
},
|
||||
},
|
||||
AutumnLeaf: {
|
||||
|
||||
@@ -5,7 +5,7 @@ import { EVENTS } from './constants';
|
||||
// path: 'premiumHatchingPotions.Rainbow',
|
||||
const featuredItems = {
|
||||
market () {
|
||||
if (moment().isBetween(EVENTS.potions202308.start, EVENTS.potions202308.end)) {
|
||||
if (moment().isBetween(EVENTS.fall2023.start, EVENTS.fall2023.end)) {
|
||||
return [
|
||||
{
|
||||
type: 'armoire',
|
||||
@@ -13,15 +13,15 @@ const featuredItems = {
|
||||
},
|
||||
{
|
||||
type: 'premiumHatchingPotion',
|
||||
path: 'premiumHatchingPotions.Thunderstorm',
|
||||
path: 'premiumHatchingPotions.Glow',
|
||||
},
|
||||
{
|
||||
type: 'premiumHatchingPotion',
|
||||
path: 'premiumHatchingPotions.Porcelain',
|
||||
path: 'premiumHatchingPotions.Spooky',
|
||||
},
|
||||
{
|
||||
type: 'hatchingPotions',
|
||||
path: 'hatchingPotions.Zombie',
|
||||
type: 'premiumHatchingPotion',
|
||||
path: 'premiumHatchingPotions.Vampire',
|
||||
},
|
||||
];
|
||||
}
|
||||
@@ -32,7 +32,7 @@ const featuredItems = {
|
||||
},
|
||||
{
|
||||
type: 'food',
|
||||
path: 'food.Meat',
|
||||
path: 'food.RottenMeat',
|
||||
},
|
||||
{
|
||||
type: 'hatchingPotions',
|
||||
@@ -40,40 +40,24 @@ const featuredItems = {
|
||||
},
|
||||
{
|
||||
type: 'eggs',
|
||||
path: 'eggs.Fox',
|
||||
path: 'eggs.Cactus',
|
||||
},
|
||||
];
|
||||
},
|
||||
quests () {
|
||||
if (moment().isBetween(EVENTS.bundle202309.start, EVENTS.bundle202309.end)) {
|
||||
if (moment().isBetween(EVENTS.bundle202310.start, EVENTS.bundle202310.end)) {
|
||||
return [
|
||||
{
|
||||
type: 'bundles',
|
||||
path: 'bundles.featheredFriends',
|
||||
path: 'bundles.sandySidekicks',
|
||||
},
|
||||
{
|
||||
type: 'quests',
|
||||
path: 'quests.pterodactyl',
|
||||
path: 'quests.beetle',
|
||||
},
|
||||
{
|
||||
type: 'quests',
|
||||
path: 'quests.trex',
|
||||
},
|
||||
];
|
||||
}
|
||||
if (moment().isBetween('2023-03-28T08:00-05:00', EVENTS.spring2023.end)) {
|
||||
return [
|
||||
{
|
||||
type: 'quests',
|
||||
path: 'quests.egg',
|
||||
},
|
||||
{
|
||||
type: 'quests',
|
||||
path: 'quests.yarn',
|
||||
},
|
||||
{
|
||||
type: 'quests',
|
||||
path: 'quests.ghost_stag',
|
||||
path: 'quests.frog',
|
||||
},
|
||||
];
|
||||
}
|
||||
@@ -93,7 +77,7 @@ const featuredItems = {
|
||||
},
|
||||
];
|
||||
},
|
||||
seasonal: 'summer2022MantaRayMageSet',
|
||||
seasonal: 'fall2017TrickOrTreatSet',
|
||||
timeTravelers: [
|
||||
// TODO
|
||||
],
|
||||
|
||||
@@ -313,7 +313,7 @@ spells.special = {
|
||||
target: 'user',
|
||||
notes: t('spellSpecialSpookySparklesNotes'),
|
||||
canOwn () {
|
||||
return moment().isBetween('2021-10-11T08:00-04:00', EVENTS.fall2022.end);
|
||||
return moment().isBetween('2023-10-03T08:00-04:00', EVENTS.fall2023.end);
|
||||
},
|
||||
cast (user, target, req) {
|
||||
if (!user.items.special.spookySparkles) throw new NotAuthorized(t('spellNotOwned')(req.language));
|
||||
|
||||
Reference in New Issue
Block a user