mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-17 22:57:21 +01:00
update(content): add 2024 Spring Fling (#15168)
* update(content): add spring fling images, items, and placeholder text * update(dates) : set canonical dates * update(dates/quests): set canonical dates for both, add egg quest availability * update(date): update quest availability start date * update(content): add magic hatching potions * fix(dates): canonical dates * fix(event): add correct event name to potions * fix(dates): canonical dates * fix(dates): fix UTC offset, remove package.json and package-lock.json * fix(dates): canonical * fix: re-added package.json and package-lock.json * update(content): add gear strings * update(content): add Rogue off-hand string, canonical dates
This commit is contained in:
@@ -12,18 +12,18 @@ export default prefill({
|
||||
pastelHairColors: { setPrice: 5, availableUntil: '2016-01-01' },
|
||||
rainbowHairColors: { setPrice: 5, text: t('rainbowColors') },
|
||||
shimmerHairColors: {
|
||||
setPrice: 5, availableFrom: '2023-04-11T08:00-05:00', availableUntil: EVENTS.spring2023.end, text: t('shimmerColors'),
|
||||
setPrice: 5, availableFrom: '2024-04-16T08:00-05:00', availableUntil: EVENTS.spring2024.end, text: t('shimmerColors'),
|
||||
},
|
||||
hauntedHairColors: {
|
||||
setPrice: 5, availableFrom: '2023-10-03T08:00-04:00', availableUntil: EVENTS.fall2023.end, text: t('hauntedColors'),
|
||||
},
|
||||
winteryHairColors: {
|
||||
setPrice: 5, availableFrom: '2023-01-16T08:00-05:00', availableUntil: EVENTS.winter2024.end, text: t('winteryColors'), // 2024-01-16
|
||||
setPrice: 5, availableFrom: '2023-01-16T08:00-05:00', availableUntil: EVENTS.winter2024.end, text: t('winteryColors'),
|
||||
},
|
||||
rainbowSkins: { setPrice: 5, text: t('rainbowSkins') },
|
||||
animalSkins: { setPrice: 5, text: t('animalSkins') },
|
||||
pastelSkins: {
|
||||
setPrice: 5, availableFrom: '2022-04-11T08:00-05:00', availableUntil: EVENTS.spring2023.end, text: t('pastelSkins'),
|
||||
setPrice: 5, availableFrom: '2024-04-16T08:00-05:00', availableUntil: EVENTS.spring2024.end, text: t('pastelSkins'),
|
||||
},
|
||||
spookySkins: { setPrice: 5, availableUntil: '2016-01-01', text: t('spookySkins') },
|
||||
supernaturalSkins: {
|
||||
@@ -33,6 +33,6 @@ export default prefill({
|
||||
setPrice: 5, availableFrom: '2023-07-11T08:00-05:00', availableUntil: EVENTS.summer2023.end, text: t('splashySkins'),
|
||||
},
|
||||
winterySkins: {
|
||||
setPrice: 5, availableFrom: '2023-01-16T08:00-05:00', availableUntil: EVENTS.winter2024.end, text: t('winterySkins'), // 2024-01-16
|
||||
setPrice: 5, availableFrom: '2023-01-16T08:00-05:00', availableUntil: EVENTS.winter2024.end, text: t('winterySkins'),
|
||||
},
|
||||
});
|
||||
|
||||
@@ -10,11 +10,18 @@ const gemsPromo = {
|
||||
|
||||
export const EVENTS = {
|
||||
noEvent: {
|
||||
start: '2024-03-01T00:00-05:00',
|
||||
end: '2024-03-20T08:00-05:00',
|
||||
start: '2024-05-01T00:00-05:00',
|
||||
end: '2024-06-20T08:00-05:00',
|
||||
season: 'normal',
|
||||
npcImageSuffix: '',
|
||||
},
|
||||
spring2024: {
|
||||
start: '2024-03-21T00:00-04:00',
|
||||
end: '2024-04-30T23:59-04:00',
|
||||
npcImageSuffix: '_spring',
|
||||
season: 'spring',
|
||||
gear: true,
|
||||
},
|
||||
bundle202403: {
|
||||
start: '2024-03-19T00:00-05:00',
|
||||
end: '2024-03-31T08:00-05:00',
|
||||
|
||||
@@ -111,6 +111,11 @@ const SEASONAL_SETS = {
|
||||
'spring2023HummingbirdWarriorSet',
|
||||
'spring2023MoonstoneMageSet',
|
||||
'spring2023LilyHealerSet',
|
||||
|
||||
'spring2024FluoriteWarriorSet',
|
||||
'spring2024HibiscusMageSet',
|
||||
'spring2024BluebirdHealerSet',
|
||||
'spring2024MeltingSnowRogueSet',
|
||||
],
|
||||
|
||||
summer: [
|
||||
|
||||
@@ -858,15 +858,19 @@ const armor = {
|
||||
},
|
||||
winter2024Warrior: {
|
||||
set: 'winter2024PeppermintBarkWarriorSet',
|
||||
canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'winter',
|
||||
},
|
||||
winter2024Mage: {
|
||||
set: 'winter2024NarwhalWizardMageSet',
|
||||
canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'winter',
|
||||
},
|
||||
winter2024Healer: {
|
||||
set: 'winter2024FrozenHealerSet',
|
||||
canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'winter',
|
||||
},
|
||||
winter2024Rogue: {
|
||||
set: 'winter2024SnowyOwlRogueSet',
|
||||
canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'winter',
|
||||
},
|
||||
birthday2024: {
|
||||
text: t('armorSpecialBirthday2024Text'),
|
||||
@@ -874,6 +878,18 @@ const armor = {
|
||||
value: 0,
|
||||
canOwn: ownsItem('armor_special_birthday2024'),
|
||||
},
|
||||
spring2024Warrior: {
|
||||
set: 'spring2024FluoriteWarriorSet',
|
||||
},
|
||||
spring2024Mage: {
|
||||
set: 'spring2024HibiscusMageSet',
|
||||
},
|
||||
spring2024Healer: {
|
||||
set: 'spring2024BluebirdHealerSet',
|
||||
},
|
||||
spring2024Rogue: {
|
||||
set: 'spring2024MeltingSnowRogueSet',
|
||||
},
|
||||
};
|
||||
|
||||
const armorStats = {
|
||||
@@ -2087,15 +2103,19 @@ const head = {
|
||||
},
|
||||
winter2024Healer: {
|
||||
set: 'winter2024FrozenHealerSet',
|
||||
canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'winter',
|
||||
},
|
||||
winter2024Rogue: {
|
||||
set: 'winter2024SnowyOwlRogueSet',
|
||||
canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'winter',
|
||||
},
|
||||
winter2024Warrior: {
|
||||
set: 'winter2024PeppermintBarkWarriorSet',
|
||||
canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'winter',
|
||||
},
|
||||
winter2024Mage: {
|
||||
set: 'winter2024NarwhalWizardMageSet',
|
||||
canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'winter',
|
||||
},
|
||||
nye2023: {
|
||||
text: t('headSpecialNye2023Text'),
|
||||
@@ -2103,6 +2123,18 @@ const head = {
|
||||
value: 0,
|
||||
canOwn: ownsItem('head_special_nye2023'),
|
||||
},
|
||||
spring2024Warrior: {
|
||||
set: 'spring2024FluoriteWarriorSet',
|
||||
},
|
||||
spring2024Mage: {
|
||||
set: 'spring2024HibiscusMageSet',
|
||||
},
|
||||
spring2024Healer: {
|
||||
set: 'spring2024BluebirdHealerSet',
|
||||
},
|
||||
spring2024Rogue: {
|
||||
set: 'spring2024MeltingSnowRogueSet',
|
||||
},
|
||||
};
|
||||
|
||||
const headStats = {
|
||||
@@ -2961,12 +2993,26 @@ const shield = {
|
||||
},
|
||||
winter2024Warrior: {
|
||||
set: 'winter2024PeppermintBarkWarriorSet',
|
||||
canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'winter',
|
||||
},
|
||||
winter2024Rogue: {
|
||||
set: 'winter2024SnowyOwlRogueSet',
|
||||
canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'winter',
|
||||
},
|
||||
winter2024Healer: {
|
||||
set: 'winter2024FrozenHealerSet',
|
||||
canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'winter',
|
||||
},
|
||||
spring2024Warrior: {
|
||||
set: 'spring2024FluoriteWarriorSet',
|
||||
},
|
||||
spring2024Healer: {
|
||||
set: 'spring2024BluebirdHealerSet',
|
||||
},
|
||||
spring2024Rogue: {
|
||||
set: 'spring2024MeltingSnowRogueSet',
|
||||
text: t('shieldSpecialSpring2024RogueText'),
|
||||
notes: t('shieldSpecialSpring2024RogueNotes', { str: 8 }),
|
||||
},
|
||||
};
|
||||
|
||||
@@ -3774,15 +3820,31 @@ const weapon = {
|
||||
},
|
||||
winter2024Rogue: {
|
||||
set: 'winter2024SnowyOwlRogueSet',
|
||||
canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'winter',
|
||||
},
|
||||
winter2024Healer: {
|
||||
set: 'winter2024FrozenHealerSet',
|
||||
canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'winter',
|
||||
},
|
||||
winter2024Warrior: {
|
||||
set: 'winter2024PeppermintBarkWarriorSet',
|
||||
canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'winter',
|
||||
},
|
||||
winter2024Mage: {
|
||||
set: 'winter2024NarwhalWizardMageSet',
|
||||
canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'winter',
|
||||
},
|
||||
spring2024Warrior: {
|
||||
set: 'spring2024FluoriteWarriorSet',
|
||||
},
|
||||
spring2024Mage: {
|
||||
set: 'spring2024HibiscusMageSet',
|
||||
},
|
||||
spring2024Healer: {
|
||||
set: 'spring2024BluebirdHealerSet',
|
||||
},
|
||||
spring2024Rogue: {
|
||||
set: 'spring2024MeltingSnowRogueSet',
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
@@ -74,12 +74,12 @@ const premium = {
|
||||
value: 2,
|
||||
text: t('hatchingPotionShimmer'),
|
||||
limited: true,
|
||||
event: EVENTS.birthday10,
|
||||
event: EVENTS.spring2024,
|
||||
_addlNotes: t('eventAvailability', {
|
||||
date: t('dateEndJanuary'),
|
||||
date: t('dateEndApril'),
|
||||
}),
|
||||
canBuy () {
|
||||
return moment().isBetween(EVENTS.birthday10.start, EVENTS.birthday10.end);
|
||||
return moment().isBetween(EVENTS.spring2024.start, EVENTS.spring2024.end);
|
||||
},
|
||||
},
|
||||
Fairy: {
|
||||
@@ -209,9 +209,9 @@ const premium = {
|
||||
_addlNotes: t('eventAvailability', {
|
||||
date: t('dateEndApril'),
|
||||
}),
|
||||
event: EVENTS.spring2023,
|
||||
event: EVENTS.spring2024,
|
||||
canBuy () {
|
||||
return moment().isBefore(EVENTS.spring2023.end);
|
||||
return moment().isBetween(EVENTS.spring2024.start, EVENTS.spring2024.end);
|
||||
},
|
||||
},
|
||||
Glass: {
|
||||
@@ -278,12 +278,12 @@ const premium = {
|
||||
value: 2,
|
||||
text: t('hatchingPotionCelestial'),
|
||||
limited: true,
|
||||
event: EVENTS.birthday10,
|
||||
event: EVENTS.spring2024,
|
||||
_addlNotes: t('eventAvailability', {
|
||||
date: t('dateStartFebruary'),
|
||||
date: t('dateEndApril'),
|
||||
}),
|
||||
canBuy () {
|
||||
return moment().isBetween(EVENTS.birthday10.start, EVENTS.birthday10.end);
|
||||
return moment().isBetween(EVENTS.spring2024.start, EVENTS.spring2024.end);
|
||||
},
|
||||
},
|
||||
Sunshine: {
|
||||
|
||||
@@ -73,7 +73,7 @@ const QUEST_SEASONAL = {
|
||||
egg: {
|
||||
event: CURRENT_EVENT && CURRENT_EVENT.season === 'spring' ? CURRENT_EVENT : null,
|
||||
canBuy () {
|
||||
return this.event && moment().isBetween('2023-03-28T08:00-05:00', this.event.end);
|
||||
return this.event && moment().isBetween('2024-04-18T08:00-05:00', this.event.end);
|
||||
},
|
||||
text: t('questEggHuntText'),
|
||||
notes: t('questEggHuntNotes'),
|
||||
|
||||
@@ -7,7 +7,7 @@ import { EVENTS } from './constants';
|
||||
// hatching potions and food names should be capitalized lest you break the market
|
||||
const featuredItems = {
|
||||
market () {
|
||||
if (moment().isBetween(EVENTS.potions202402.start, EVENTS.potions202402.end)) {
|
||||
if (moment().isBetween(EVENTS.spring2024.start, EVENTS.spring2024.end)) {
|
||||
return [
|
||||
{
|
||||
type: 'armoire',
|
||||
@@ -15,15 +15,15 @@ const featuredItems = {
|
||||
},
|
||||
{
|
||||
type: 'premiumHatchingPotion',
|
||||
path: 'premiumHatchingPotions.RoseGold',
|
||||
path: 'premiumHatchingPotions.Celestial',
|
||||
},
|
||||
{
|
||||
type: 'premiumHatchingPotion',
|
||||
path: 'premiumHatchingPotions.Cupid',
|
||||
path: 'premiumHatchingPotions.Shimmer',
|
||||
},
|
||||
{
|
||||
type: 'hatchingPotions',
|
||||
path: 'hatchingPotions.Red',
|
||||
type: 'premiumHatchingPotion',
|
||||
path: 'premiumHatchingPotions.Rainbow',
|
||||
},
|
||||
];
|
||||
}
|
||||
@@ -34,15 +34,15 @@ const featuredItems = {
|
||||
},
|
||||
{
|
||||
type: 'food',
|
||||
path: 'food.Chocolate',
|
||||
path: 'food.Fish',
|
||||
},
|
||||
{
|
||||
type: 'hatchingPotions',
|
||||
path: 'hatchingPotions.Desert',
|
||||
path: 'hatchingPotions.Skeleton',
|
||||
},
|
||||
{
|
||||
type: 'eggs',
|
||||
path: 'eggs.Cactus',
|
||||
path: 'eggs.Fox',
|
||||
},
|
||||
];
|
||||
},
|
||||
@@ -79,7 +79,7 @@ const featuredItems = {
|
||||
},
|
||||
];
|
||||
},
|
||||
seasonal: 'winter2021WinterMoonMageSet',
|
||||
seasonal: 'spring2019CloudRogueSet',
|
||||
timeTravelers: [
|
||||
// TODO
|
||||
],
|
||||
|
||||
@@ -352,9 +352,9 @@ spells.special = {
|
||||
previousPurchase: true,
|
||||
target: 'user',
|
||||
notes: t('spellSpecialShinySeedNotes'),
|
||||
event: EVENTS.spring2023,
|
||||
event: EVENTS.spring2024,
|
||||
canOwn () {
|
||||
return moment().isBetween('2023-04-18T08:00-05:00', EVENTS.spring2023.end);
|
||||
return moment().isBetween('2024-04-18T08:00-05:00', EVENTS.spring2024.end);
|
||||
},
|
||||
cast (user, target, req) {
|
||||
if (!user.items.special.shinySeed) throw new NotAuthorized(t('spellNotOwned')(req.language));
|
||||
|
||||
Reference in New Issue
Block a user