diff --git a/habitica-images b/habitica-images index 60b9a912a2..7a26306dc9 160000 --- a/habitica-images +++ b/habitica-images @@ -1 +1 @@ -Subproject commit 60b9a912a2b2b5b5ed3ee7ebf768be0487da21cb +Subproject commit 7a26306dc9ba92d7f5382794f7c5bba919437622 diff --git a/migrations/archive/2023/20231228_nye.js b/migrations/archive/2023/20231228_nye.js new file mode 100644 index 0000000000..abc934366e --- /dev/null +++ b/migrations/archive/2023/20231228_nye.js @@ -0,0 +1,87 @@ +/* eslint-disable no-console */ +const MIGRATION_NAME = '20231228_nye'; +import { model as User } from '../../../website/server/models/user'; +import { v4 as uuid } from 'uuid'; + +const progressCount = 1000; +let count = 0; + +async function updateUser (user) { + count++; + + const set = { migration: MIGRATION_NAME }; + let push = {}; + + if (typeof user.items.gear.owned.head_special_nye2022 !== 'undefined') { + set['items.gear.owned.head_special_nye2023'] = true; + } else if (typeof user.items.gear.owned.head_special_nye2021 !== 'undefined') { + set['items.gear.owned.head_special_nye2022'] = true; + } else if (typeof user.items.gear.owned.head_special_nye2020 !== 'undefined') { + set['items.gear.owned.head_special_nye2021'] = true; + } else if (typeof user.items.gear.owned.head_special_nye2019 !== 'undefined') { + set['items.gear.owned.head_special_nye2020'] = true; + } else if (typeof user.items.gear.owned.head_special_nye2018 !== 'undefined') { + set['items.gear.owned.head_special_nye2019'] = true; + } else if (typeof user.items.gear.owned.head_special_nye2017 !== 'undefined') { + set['items.gear.owned.head_special_nye2018'] = true; + } else if (typeof user.items.gear.owned.head_special_nye2016 !== 'undefined') { + set['items.gear.owned.head_special_nye2017'] = true; + } else if (typeof user.items.gear.owned.head_special_nye2015 !== 'undefined') { + set['items.gear.owned.head_special_nye2016'] = true; + } else if (typeof user.items.gear.owned.head_special_nye2014 !== 'undefined') { + set['items.gear.owned.head_special_nye2015'] = true; + } else if (typeof user.items.gear.owned.head_special_nye !== 'undefined') { + set['items.gear.owned.head_special_nye2014'] = true; + } else { + set['items.gear.owned.head_special_nye'] = true; + } + + push.notifications = { + type: 'ITEM_RECEIVED', + data: { + icon: 'notif_head_special_nye', + title: 'Happy New Year!', + text: 'Check your Equipment for this year\'s party hat!', + destination: 'inventory/equipment', + }, + seen: false, + }; + + if (count % progressCount === 0) console.warn(`${count} ${user._id}`); + + return await User.updateOne({_id: user._id}, {$set: set, $push: push}).exec(); +} + +export default async function processUsers () { + let query = { + 'auth.timestamps.loggedin': { $gt: new Date('2023-12-01') }, + migration: { $ne: MIGRATION_NAME }, + }; + + const fields = { + _id: 1, + items: 1, + }; + + while (true) { // eslint-disable-line no-constant-condition + const users = await User // eslint-disable-line no-await-in-loop + .find(query) + .limit(250) + .sort({_id: 1}) + .select(fields) + .lean() + .exec(); + + if (users.length === 0) { + console.warn('All appropriate users found and modified.'); + console.warn(`\n${count} users processed\n`); + break; + } else { + query._id = { + $gt: users[users.length - 1], + }; + } + + await Promise.all(users.map(updateUser)); // eslint-disable-line no-await-in-loop + } +}; diff --git a/website/client/src/assets/css/sprites/spritesmith-main.css b/website/client/src/assets/css/sprites/spritesmith-main.css index 0614a1dfed..ff4bbc7d57 100644 --- a/website/client/src/assets/css/sprites/spritesmith-main.css +++ b/website/client/src/assets/css/sprites/spritesmith-main.css @@ -33000,6 +33000,26 @@ width: 114px; height: 117px; } +.broad_armor_special_winter2024Healer { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_winter2024Healer.png'); + width: 114px; + height: 90px; +} +.broad_armor_special_winter2024Mage { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_winter2024Mage.png'); + width: 114px; + height: 90px; +} +.broad_armor_special_winter2024Rogue { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_winter2024Rogue.png'); + width: 114px; + height: 90px; +} +.broad_armor_special_winter2024Warrior { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_winter2024Warrior.png'); + width: 114px; + height: 90px; +} .broad_armor_special_yeti { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_yeti.png'); width: 90px; @@ -33060,6 +33080,11 @@ width: 114px; height: 90px; } +.head_special_nye2023 { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_nye2023.png'); + width: 114px; + height: 90px; +} .head_special_ski { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_ski.png'); width: 90px; @@ -33250,6 +33275,26 @@ width: 114px; height: 117px; } +.head_special_winter2024Healer { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_winter2024Healer.png'); + width: 114px; + height: 90px; +} +.head_special_winter2024Mage { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_winter2024Mage.png'); + width: 114px; + height: 90px; +} +.head_special_winter2024Rogue { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_winter2024Rogue.png'); + width: 114px; + height: 90px; +} +.head_special_winter2024Warrior { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_winter2024Warrior.png'); + width: 114px; + height: 90px; +} .head_special_yeti { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_yeti.png'); width: 90px; @@ -33400,6 +33445,21 @@ width: 114px; height: 117px; } +.shield_special_winter2024Healer { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_winter2024Healer.png'); + width: 114px; + height: 90px; +} +.shield_special_winter2024Rogue { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_winter2024Rogue.png'); + width: 114px; + height: 90px; +} +.shield_special_winter2024Warrior { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_winter2024Warrior.png'); + width: 114px; + height: 90px; +} .shield_special_yeti { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_yeti.png'); width: 90px; @@ -33600,6 +33660,26 @@ width: 68px; height: 68px; } +.shop_armor_special_winter2024Healer { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_special_winter2024Healer.png'); + width: 68px; + height: 68px; +} +.shop_armor_special_winter2024Mage { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_special_winter2024Mage.png'); + width: 68px; + height: 68px; +} +.shop_armor_special_winter2024Rogue { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_special_winter2024Rogue.png'); + width: 68px; + height: 68px; +} +.shop_armor_special_winter2024Warrior { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_special_winter2024Warrior.png'); + width: 68px; + height: 68px; +} .shop_armor_special_yeti { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_special_yeti.png'); width: 68px; @@ -33660,6 +33740,11 @@ width: 68px; height: 68px; } +.shop_head_special_nye2023 { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_head_special_nye2023.png'); + width: 68px; + height: 68px; +} .shop_head_special_ski { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_head_special_ski.png'); width: 68px; @@ -33850,6 +33935,26 @@ width: 68px; height: 68px; } +.shop_head_special_winter2024Healer { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_head_special_winter2024Healer.png'); + width: 68px; + height: 68px; +} +.shop_head_special_winter2024Mage { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_head_special_winter2024Mage.png'); + width: 68px; + height: 68px; +} +.shop_head_special_winter2024Rogue { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_head_special_winter2024Rogue.png'); + width: 68px; + height: 68px; +} +.shop_head_special_winter2024Warrior { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_head_special_winter2024Warrior.png'); + width: 68px; + height: 68px; +} .shop_head_special_yeti { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_head_special_yeti.png'); width: 68px; @@ -34000,6 +34105,21 @@ width: 68px; height: 68px; } +.shop_shield_special_winter2024Healer { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_shield_special_winter2024Healer.png'); + width: 68px; + height: 68px; +} +.shop_shield_special_winter2024Rogue { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_shield_special_winter2024Rogue.png'); + width: 68px; + height: 68px; +} +.shop_shield_special_winter2024Warrior { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_shield_special_winter2024Warrior.png'); + width: 68px; + height: 68px; +} .shop_shield_special_yeti { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_shield_special_yeti.png'); width: 68px; @@ -34200,6 +34320,26 @@ width: 68px; height: 68px; } +.shop_weapon_special_winter2024Healer { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_special_winter2024Healer.png'); + width: 68px; + height: 68px; +} +.shop_weapon_special_winter2024Mage { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_special_winter2024Mage.png'); + width: 68px; + height: 68px; +} +.shop_weapon_special_winter2024Rogue { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_special_winter2024Rogue.png'); + width: 68px; + height: 68px; +} +.shop_weapon_special_winter2024Warrior { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_special_winter2024Warrior.png'); + width: 68px; + height: 68px; +} .shop_weapon_special_yeti { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_special_yeti.png'); width: 68px; @@ -34400,6 +34540,26 @@ width: 114px; height: 117px; } +.slim_armor_special_winter2024Healer { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_winter2024Healer.png'); + width: 114px; + height: 90px; +} +.slim_armor_special_winter2024Mage { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_winter2024Mage.png'); + width: 114px; + height: 90px; +} +.slim_armor_special_winter2024Rogue { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_winter2024Rogue.png'); + width: 114px; + height: 90px; +} +.slim_armor_special_winter2024Warrior { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_winter2024Warrior.png'); + width: 114px; + height: 90px; +} .slim_armor_special_yeti { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_yeti.png'); width: 90px; @@ -34600,6 +34760,26 @@ width: 114px; height: 117px; } +.weapon_special_winter2024Healer { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_winter2024Healer.png'); + width: 114px; + height: 90px; +} +.weapon_special_winter2024Mage { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_winter2024Mage.png'); + width: 114px; + height: 90px; +} +.weapon_special_winter2024Rogue { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_winter2024Rogue.png'); + width: 114px; + height: 90px; +} +.weapon_special_winter2024Warrior { + background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_winter2024Warrior.png'); + width: 114px; + height: 90px; +} .weapon_special_yeti { background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_yeti.png'); width: 90px; diff --git a/website/common/locales/en/gear.json b/website/common/locales/en/gear.json index 47cf6657f2..8c48cc8a3b 100644 --- a/website/common/locales/en/gear.json +++ b/website/common/locales/en/gear.json @@ -495,6 +495,15 @@ "weaponSpecialFall2023HealerText": "Log Great Hammer", "weaponSpecialFall2023HealerNotes": "With slow, heavy attacks, this gnarled hammer deals out healing blows instead of damage. Increases Intelligence by <%= int %>. Limited Edition 2023 Fall Gear.", + "weaponSpecialWinter2024RogueText": "Snowy Owl Bracer", + "weaponSpecialWinter2024RogueNotes": "You are equipped with a flurry of feathers and talons! Hoot! Increases Strength by <%= str %>. Limited Edition Winter 2023-2024 Gear.", + "weaponSpecialWinter2024WarriorText": "Candy Club", + "weaponSpecialWinter2024WarriorNotes": "A fine weapon, so long as you can stop yourself from eating it. Increases Strength by <%= str %>. Limited Edition Winter 2023-2024 Gear.", + "weaponSpecialWinter2024MageText": "Narwhal Wand", + "weaponSpecialWinter2024MageNotes": "Thanks to a generous, magical narwhal that sensed your great abilities, you have been gifted a tusk that lets you sense changes happening around you. Increases Intelligence by <%= int %>. Limited Edition Winter 2023-2024 Gear.", + "weaponSpecialWinter2024HealerText": "Torch", + "weaponSpecialWinter2024HealerNotes": "Melt yourself out of this jam in no time! Increases Intelligence by <%= int %>. Limited Edition Winter 2023-2024 Gear.", + "weaponMystery201411Text": "Pitchfork of Feasting", "weaponMystery201411Notes": "Stab your enemies or dig in to your favorite foods - this versatile pitchfork does it all! Confers no benefit. November 2014 Subscriber Item.", "weaponMystery201502Text": "Shimmery Winged Staff of Love and Also Truth", @@ -1202,6 +1211,15 @@ "armorSpecialFall2023HealerText": "Bog Creature Body", "armorSpecialFall2023HealerNotes": "With moss, rock, wood, and bog water merged into one, this outfit is sometimes tough and sometimes spongey (but always intimidating). Increases Constitution by <%= con %>. Limited Edition 2023 Fall Gear.", + "armorSpecialWinter2024RogueText": "Snowy Owl Robes", + "armorSpecialWinter2024RogueNotes": "Whooooo will you be when wearing this robe? Covered in feathers and fluff, you will be both warm and stealthy! Increases Perception by <%= per %>. Limited Edition 2023-2024 Winter Gear.", + "armorSpecialWinter2024WarriorText": "Peppermint Bark Armor", + "armorSpecialWinter2024WarriorNotes": "Turns out chocolate, mint, and frosting are stronger materials than you’d think. Increases Constitution by <%= con %>. Limited Edition 2023-2024 Winter Gear.", + "armorSpecialWinter2024MageText": "Narwhal Wizard Robes", + "armorSpecialWinter2024MageNotes": "Both practical and pretty, these robes will keep you toasty as you perform your magical abilities out in the cold. Increases Intelligence by <%= int %>. Limited Edition 2023-2024 Winter Gear.", + "armorSpecialWinter2024HealerText": "Frozen Armor", + "armorSpecialWinter2024HealerNotes": "This sparkling block of magic ice is at least protective while you figure out your escape. Increases Constitution by <%= con %>. Limited Edition 2023-2024 Winter Gear.", + "armorMystery201402Text": "Messenger Robes", "armorMystery201402Notes": "Shimmering and strong, these robes have many pockets to carry letters. Confers no benefit. February 2014 Subscriber Item.", "armorMystery201403Text": "Forest Walker Armor", @@ -1992,6 +2010,18 @@ "headSpecialFall2023HealerText": "Bog Creature Mask", "headSpecialFall2023HealerNotes": "With eyes as dark as the bog it emerged from, it fixes its gaze upon enemies. Increases Intelligence by <%= int %>. Limited Edition 2023 Fall Gear.", + "headSpecialNye2023Text": "Ludicrous Party Hat", + "headSpecialNye2023Notes": "You've received a Ludicrous Party Hat! Wear it with pride while ringing in the New Year! Confers no benefit.", + + "headSpecialWinter2024RogueText": "Snowy Owl Hood", + "headSpecialWinter2024RogueNotes": "Whooooo will you see when wearing this hood? Well, who WON’T you see? You will capture every movement, every gesture, every detail around you. Increases Perception by <%= per %>. Limited Edition Winter 2023-2024 Gear.", + "headSpecialWinter2024WarriorText": "Peppermint Bark Helm", + "headSpecialWinter2024WarriorNotes": "Never has protecting your noggin been so festively delicious! Increases Strength by <%= str %>. Limited Edition Winter 2023-2024 Gear.", + "headSpecialWinter2024MageText": "Narwhal Wizard Hood", + "headSpecialWinter2024MageNotes": "This fleece-lined hood will protect you from the cold as well as from negative thoughts and vibes. Increases Perception by <%= per %>. Limited Edition Winter 2023-2024 Gear.", + "headSpecialWinter2024HealerText": "Frozen Helm", + "headSpecialWinter2024HealerNotes": "Uh oh, a spell gone wrong has trapped you in ice! Increases Intelligence by <%= int %>. Limited Edition Winter 2023-2024 Gear.", + "headSpecialGaymerxText": "Rainbow Warrior Helm", "headSpecialGaymerxNotes": "In celebration of the GaymerX Conference, this special helmet is decorated with a radiant, colorful rainbow pattern! GaymerX is a game convention celebrating LGTBQ and gaming and is open to everyone.", @@ -2603,6 +2633,11 @@ "shieldSpecialFall2023HealerText": "Mossy Rock", "shieldSpecialFall2023HealerNotes": "With a firm base and a soft top, this is perfect to hurl at enemies or to sit upon when you need a rest from your adventures. Increases Constitution by <%= con %>. Limited Edition 2023 Fall Gear.", + "shieldSpecialWinter2024WarriorText": "Cookie Shield", + "shieldSpecialWinter2024WarriorNotes": "You’re a tough cookie who will never crumble! Increases Constitution by <%= con %>. Limited Edition Winter 2023-2024 Gear.", + "shieldSpecialWinter2024HealerText": "Salt Shaker", + "shieldSpecialWinter2024HealerNotes": "How convenient that you had ice-melting materials handy when you froze! Increases Constitution by <%= con %>. Limited Edition Winter 2023-2024 Gear.", + "shieldMystery201601Text": "Resolution Slayer", "shieldMystery201601Notes": "This blade can be used to parry away all distractions. Confers no benefit. January 2016 Subscriber Item.", "shieldMystery201701Text": "Time-Freezer Shield", diff --git a/website/common/locales/en/limited.json b/website/common/locales/en/limited.json index bf2336ecc1..f56d188b22 100644 --- a/website/common/locales/en/limited.json +++ b/website/common/locales/en/limited.json @@ -207,8 +207,12 @@ "fall2023ScarletWarlockMageSet": "Scarlet Warlock (Mage)", "fall2023WitchsBrewRogueSet": "Witch's Brew (Rogue)", "fall2023BogCreatureHealerSet": "Bog Creature (Healer)", + "winter2024SnowyOwlRogueSet": "Snowy Owl (Rogue)", + "winter2024FrozenHealerSet": "Frozen (Healer)", + "winter2024PeppermintBarkWarriorSet": "Peppermint Bark Set (Warrior)", + "winter2024NarwhalWizardMageSet": "Narwhal Wizard Set (Mage)", "eventAvailability": "Available for purchase until <%= date(locale) %>.", - "eventAvailabilityReturning": "Available for purchase until <%= availableDate(locale) %>. This potion was last available in <%= previousDate(locale) %>.", + "eventAvailabilityReturning": "Available for purchase until <%= availableDate(locale) %>.", "dateEndJanuary": "January 31", "dateEndFebruary": "February 28", "dateEndMarch": "March 31", diff --git a/website/common/script/content/appearance/sets.js b/website/common/script/content/appearance/sets.js index 60254bc8ae..678c705c79 100644 --- a/website/common/script/content/appearance/sets.js +++ b/website/common/script/content/appearance/sets.js @@ -18,7 +18,7 @@ export default prefill({ 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'), + setPrice: 5, availableFrom: '2023-01-16T08:00-05:00', availableUntil: EVENTS.winter2024.end, text: t('winteryColors'), // 2024-01-16 }, rainbowSkins: { setPrice: 5, text: t('rainbowSkins') }, animalSkins: { setPrice: 5, text: t('animalSkins') }, @@ -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-17T08:00-05:00', availableUntil: EVENTS.winter2023.end, text: t('winterySkins'), + setPrice: 5, availableFrom: '2023-01-16T08:00-05:00', availableUntil: EVENTS.winter2024.end, text: t('winterySkins'), // 2024-01-16 }, }); diff --git a/website/common/script/content/bundles.js b/website/common/script/content/bundles.js index ef8e2772b4..e3e1f31c84 100644 --- a/website/common/script/content/bundles.js +++ b/website/common/script/content/bundles.js @@ -78,16 +78,16 @@ const bundles = { winterQuests: { key: 'winterQuests', text: t('winterQuestsText'), - notes: t('winterQuestsNotes', { date: moment(EVENTS.winter2023.end).format('LL') }), + notes: t('winterQuestsNotes', { date: moment(EVENTS.winter2024.end).format('LL') }), addlNotes: t('evilSantaAddlNotes'), bundleKeys: [ 'evilsanta', 'evilsanta2', 'penguin', ], - event: EVENTS.winter2023, + event: EVENTS.winter2024, canBuy () { - return moment().isBetween(EVENTS.winter2023.start, EVENTS.winter2023.end); + return moment().isBetween(EVENTS.winter2024.start, EVENTS.winter2024.end); }, type: 'quests', value: 7, diff --git a/website/common/script/content/constants/events.js b/website/common/script/content/constants/events.js index 93bcadddf2..2520b7c0e9 100644 --- a/website/common/script/content/constants/events.js +++ b/website/common/script/content/constants/events.js @@ -10,11 +10,29 @@ const gemsPromo = { export const EVENTS = { noEvent: { - start: '2023-12-01T00:00-05:00', - end: '2023-12-21T08:00-05:00', + start: '2024-02-01T00:00-05:00', + end: '2024-03-20T08:00-05:00', season: 'normal', npcImageSuffix: '', }, + nye2023: { + start: '2023-12-28T08:00-05:00', + end: '2024-01-04T23:59-05:00', + season: 'nye', + npcImageSuffix: '_nye', + }, + winter2024: { + start: '2023-12-19T08:00-05:00', + end: '2024-01-31T23:59-05:00', + npcImageSuffix: '_winter', + season: 'winter', + gear: true, + }, + g1g12023: { + start: '2023-12-18T08:00-05:00', + end: '2024-01-09T23:59-05:00', + promo: 'g1g1', + }, potions202311: { start: '2023-11-14T08:00-04:00', end: '2023-11-30T23:59-04:00', diff --git a/website/common/script/content/constants/seasonalSets.js b/website/common/script/content/constants/seasonalSets.js index 31d1b63092..e5d4efef31 100644 --- a/website/common/script/content/constants/seasonalSets.js +++ b/website/common/script/content/constants/seasonalSets.js @@ -53,6 +53,10 @@ const SEASONAL_SETS = { 'winter2023FairyLightsMageSet', 'winter2023CardinalHealerSet', + 'winter2024SnowyOwlRogueSet', + 'winter2024PeppermintBarkWarriorSet', + 'winter2024NarwhalWizardMageSet', + 'winter2024FrozenHealerSet', ], spring: [ // spring 2014 diff --git a/website/common/script/content/gear/sets/special/index.js b/website/common/script/content/gear/sets/special/index.js index 28faa567f1..1eb67b6c28 100644 --- a/website/common/script/content/gear/sets/special/index.js +++ b/website/common/script/content/gear/sets/special/index.js @@ -844,15 +844,31 @@ const armor = { }, fall2023Warrior: { set: 'fall2023ScaryMovieWarriorSet', + canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'fall', }, fall2023Healer: { set: 'fall2023BogCreatureHealerSet', + canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'fall', }, fall2023Mage: { set: 'fall2023ScarletWarlockMageSet', + canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'fall', }, fall2023Rogue: { set: 'fall2023WitchsBrewRogueSet', + canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'fall', + }, + winter2024Warrior: { + set: 'winter2024PeppermintBarkWarriorSet', + }, + winter2024Mage: { + set: 'winter2024NarwhalWizardMageSet', + }, + winter2024Healer: { + set: 'winter2024FrozenHealerSet', + }, + winter2024Rogue: { + set: 'winter2024SnowyOwlRogueSet', }, }; @@ -2051,15 +2067,37 @@ const head = { }, fall2023Healer: { set: 'fall2023BogCreatureHealerSet', + canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'fall', }, fall2023Mage: { set: 'fall2023ScarletWarlockMageSet', + canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'fall', }, fall2023Rogue: { set: 'fall2023WitchsBrewRogueSet', + canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'fall', }, fall2023Warrior: { set: 'fall2023ScaryMovieWarriorSet', + canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'fall', + }, + winter2024Healer: { + set: 'winter2024FrozenHealerSet', + }, + winter2024Rogue: { + set: 'winter2024SnowyOwlRogueSet', + }, + winter2024Warrior: { + set: 'winter2024PeppermintBarkWarriorSet', + }, + winter2024Mage: { + set: 'winter2024NarwhalWizardMageSet', + }, + nye2023: { + text: t('headSpecialNye2023Text'), + notes: t('headSpecialNye2023Notes'), + value: 0, + canOwn: ownsItem('head_special_nye2023'), }, }; @@ -2893,26 +2931,38 @@ const shield = { }, summer2023Rogue: { set: 'summer2023GuppyRogueSet', - canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'fall', + canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'summer', }, summer2023Warrior: { set: 'summer2023GoldfishWarriorSet', - canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'fall', + canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'summer', }, summer2023Healer: { set: 'summer2023KelpHealerSet', - canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'fall', + canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'summer', }, fall2023Rogue: { set: 'fall2023WitchsBrewRogueSet', text: t('shieldSpecialFall2023RogueText'), notes: t('shieldSpecialFall2023RogueNotes', { str: 8 }), + canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'fall', }, fall2023Warrior: { set: 'fall2023ScaryMovieWarriorSet', + canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'fall', }, fall2023Healer: { set: 'fall2023BogCreatureHealerSet', + canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'fall', + }, + winter2024Warrior: { + set: 'winter2024PeppermintBarkWarriorSet', + }, + winter2024Rogue: { + set: 'winter2024SnowyOwlRogueSet', + }, + winter2024Healer: { + set: 'winter2024FrozenHealerSet', }, }; @@ -3688,31 +3738,47 @@ const weapon = { }, summer2023Rogue: { set: 'summer2023GuppyRogueSet', - canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'fall', + canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'summer', }, summer2023Warrior: { set: 'summer2023GoldfishWarriorSet', - canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'fall', + canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'summer', }, summer2023Mage: { set: 'summer2023CoralMageSet', - canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'fall', + canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'summer', }, summer2023Healer: { set: 'summer2023KelpHealerSet', - canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'fall', + canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'summer', }, fall2023Rogue: { set: 'fall2023WitchsBrewRogueSet', + canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'fall', }, fall2023Healer: { set: 'fall2023BogCreatureHealerSet', + canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'fall', }, fall2023Warrior: { set: 'fall2023ScaryMovieWarriorSet', + canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'fall', }, fall2023Mage: { set: 'fall2023ScarletWarlockMageSet', + canBuy: () => CURRENT_EVENT && CURRENT_EVENT.season === 'fall', + }, + winter2024Rogue: { + set: 'winter2024SnowyOwlRogueSet', + }, + winter2024Healer: { + set: 'winter2024FrozenHealerSet', + }, + winter2024Warrior: { + set: 'winter2024PeppermintBarkWarriorSet', + }, + winter2024Mage: { + set: 'winter2024NarwhalWizardMageSet', }, }; diff --git a/website/common/script/content/hatching-potions.js b/website/common/script/content/hatching-potions.js index 9ab4e6b34c..1e145abbeb 100644 --- a/website/common/script/content/hatching-potions.js +++ b/website/common/script/content/hatching-potions.js @@ -193,12 +193,12 @@ const premium = { text: t('hatchingPotionPeppermint'), limited: true, _addlNotes: t('eventAvailabilityReturning', { - availableDate: t('dateStartFebruary'), + availableDate: t('dateEndJanuary'), previousDate: t('januaryYYYY', { year: 2022 }), }), - event: EVENTS.birthday10, + event: EVENTS.winter2024, canBuy () { - return moment().isBetween(EVENTS.birthday10.start, EVENTS.birthday10.end); + return moment().isBetween(EVENTS.winter2024.start, EVENTS.winter2024.end); }, }, StarryNight: { @@ -270,13 +270,13 @@ const premium = { value: 2, text: t('hatchingPotionIcySnow'), limited: true, + event: EVENTS.winter2024, _addlNotes: t('eventAvailabilityReturning', { availableDate: t('dateEndJanuary'), - previousDate: t('decemberYYYY', { year: 2018 }), + previousDate: t('novemberYYYY', { year: 2022 }), }), - event: EVENTS.winter2021, canBuy () { - return moment().isBetween('2020-12-22T08:00-04:00', '2021-01-31T20:00-04:00'); + return moment().isBetween(EVENTS.winter2024.start, EVENTS.winter2024.end); }, }, RoseQuartz: { @@ -470,12 +470,11 @@ const premium = { text: t('hatchingPotionStainedGlass'), limited: true, _addlNotes: t('eventAvailabilityReturning', { - availableDate: t('dateStartFebruary'), - previousDate: t('januaryYYYY', { year: 2022 }), + availableDate: t('dateEndJanuary'), }), - event: EVENTS.birthday10, + event: EVENTS.winter2024, canBuy () { - return moment().isBetween(EVENTS.birthday10.start, EVENTS.birthday10.end); + return moment().isBetween(EVENTS.winter2024.start, EVENTS.winter2024.end); }, }, PolkaDot: { diff --git a/website/common/script/content/index.js b/website/common/script/content/index.js index f249bd66a3..13606e5d14 100644 --- a/website/common/script/content/index.js +++ b/website/common/script/content/index.js @@ -127,7 +127,7 @@ api.cardTypes = { nye: { key: 'nye', messageOptions: 5, - yearRound: moment().isBefore('2023-01-02T20:00-05:00'), + yearRound: moment().isBetween(EVENTS.nye2023.start, EVENTS.nye2023.end), }, thankyou: { key: 'thankyou', diff --git a/website/common/script/content/shop-featuredItems.js b/website/common/script/content/shop-featuredItems.js index df70ec2662..42373c7757 100644 --- a/website/common/script/content/shop-featuredItems.js +++ b/website/common/script/content/shop-featuredItems.js @@ -5,7 +5,7 @@ import { EVENTS } from './constants'; // path: 'premiumHatchingPotions.Rainbow', const featuredItems = { market () { - if (moment().isBetween(EVENTS.potions202311.start, EVENTS.potions202311.end)) { + if (moment().isBetween(EVENTS.winter2024.start, EVENTS.winter2024.end)) { return [ { type: 'armoire', @@ -13,15 +13,15 @@ const featuredItems = { }, { type: 'premiumHatchingPotion', - path: 'premiumHatchingPotions.AutumnLeaf', + path: 'premiumHatchingPotions.StainedGlass', }, { type: 'premiumHatchingPotion', - path: 'premiumHatchingPotions.Ember', + path: 'premiumHatchingPotions.Peppermint', }, { type: 'premiumHatchingPotion', - path: 'premiumHatchingPotions.Frost', + path: 'premiumHatchingPotions.IcySnow', }, ]; } @@ -32,32 +32,32 @@ const featuredItems = { }, { type: 'food', - path: 'food.RottenMeat', + path: 'food.Honey', }, { type: 'hatchingPotions', - path: 'hatchingPotions.Zombie', + path: 'hatchingPotions.Golden', }, { type: 'eggs', - path: 'eggs.Cactus', + path: 'eggs.BearCub', }, ]; }, quests () { - if (moment().isBetween(EVENTS.bundle202311.start, EVENTS.bundle202311.end)) { + if (moment().isBetween(EVENTS.winter2024.start, EVENTS.winter2024.end)) { return [ { type: 'bundles', - path: 'bundles.oddballs', + path: 'bundles.winterQuests', }, { type: 'quests', - path: 'quests.gryphon', + path: 'quests.ghost_stag', }, { type: 'quests', - path: 'quests.armadillo', + path: 'quests.penguin', }, ]; } @@ -77,7 +77,7 @@ const featuredItems = { }, ]; }, - seasonal: 'fall2017TrickOrTreatSet', + seasonal: 'winter2021WinterMoonMageSet', timeTravelers: [ // TODO ], diff --git a/website/common/script/content/spells.js b/website/common/script/content/spells.js index e4ccd37c4e..37e2816259 100644 --- a/website/common/script/content/spells.js +++ b/website/common/script/content/spells.js @@ -277,7 +277,7 @@ spells.special = { target: 'user', notes: t('spellSpecialSnowballAuraNotes'), canOwn () { - return moment().isBetween('2022-12-27T08:00-05:00', EVENTS.winter2023.end); + return moment().isBetween('2024-01-09T08:00-05:00', EVENTS.winter2024.end); }, cast (user, target, req) { if (!user.items.special.snowball) throw new NotAuthorized(t('spellNotOwned')(req.language)); @@ -423,7 +423,7 @@ spells.special = { target: 'user', notes: t('nyeCardNotes'), canOwn () { - return moment().isBetween('2022-12-28T08:00-05:00', '2023-01-02T20:00-05:00'); + return moment().isBetween(EVENTS.nye2023.start, EVENTS.nye2023.end); }, cast (user, target) { if (user === target) { diff --git a/website/common/script/libs/shops-seasonal.config.js b/website/common/script/libs/shops-seasonal.config.js index 3f77a98439..4d9f93994b 100644 --- a/website/common/script/libs/shops-seasonal.config.js +++ b/website/common/script/libs/shops-seasonal.config.js @@ -29,22 +29,22 @@ export default { pinnedSets: CURRENT_EVENT ? { - rogue: 'fall2023WitchsBrewRogueSet', - warrior: 'fall2023ScaryMovieWarriorSet', - wizard: 'fall2023ScarletWarlockMageSet', - healer: 'fall2023BogCreatureHealerSet', + rogue: 'winter2024SnowyOwlRogueSet', + warrior: 'winter2024PeppermintBarkWarriorSet', + wizard: 'winter2024NarwhalWizardMageSet', + healer: 'winter2024FrozenHealerSet', } : {}, - availableSpells: CURRENT_EVENT && moment().isBetween('2023-10-03T08:00-04:00', CURRENT_EVENT.end) + availableSpells: CURRENT_EVENT && moment().isBetween('2023-01-09T08:00-04:00', CURRENT_EVENT.end) ? [ - 'spookySparkles', + 'snowball', ] : [], - availableQuests: CURRENT_EVENT && moment().isBetween('2023-07-11T08:00-04:00', CURRENT_EVENT.end) + availableQuests: CURRENT_EVENT && moment().isBetween('2023-01-09T08:00-04:00', CURRENT_EVENT.end) // 2024-01-09 ? [] : [], - featuredSet: 'fall2022HarpyMageSet', + featuredSet: 'winter2019PoinsettiaSet', };