diff --git a/website/client/src/assets/css/sprites.css b/website/client/src/assets/css/sprites.css index ae92a2249d..f3ba66580d 100755 --- a/website/client/src/assets/css/sprites.css +++ b/website/client/src/assets/css/sprites.css @@ -4,6 +4,12 @@ height: 219px; } +.Pet_HatchingPotion_Dessert { + background: url("~@/assets/images/animated/Pet_HatchingPotion_Dessert.gif") no-repeat; + width: 68px; + height: 68px; +} + .Pet_HatchingPotion_Veggie { background: url("~@/assets/images/animated/Pet_HatchingPotion_Veggie.gif") no-repeat; width: 68px; diff --git a/website/client/src/assets/images/animated/Pet-HatchingPotion-Dessert.gif b/website/client/src/assets/images/animated/Pet-HatchingPotion-Dessert.gif new file mode 100644 index 0000000000..4ac1c8e5be Binary files /dev/null and b/website/client/src/assets/images/animated/Pet-HatchingPotion-Dessert.gif differ diff --git a/website/common/locales/en/content.json b/website/common/locales/en/content.json index d41aaf67d5..c7445fb395 100644 --- a/website/common/locales/en/content.json +++ b/website/common/locales/en/content.json @@ -299,6 +299,7 @@ "hatchingPotionAurora": "Aurora", "hatchingPotionRuby": "Ruby", "hatchingPotionBirchBark": "Birch Bark", + "hatchingPotionDessert": "Confection", "hatchingPotionNotes": "Pour this on an egg, and it will hatch as a <%= potText(locale) %> pet.", "premiumPotionAddlNotes": "Not usable on quest pet eggs. Available for purchase until <%= date(locale) %>.", diff --git a/website/common/locales/en/questsContent.json b/website/common/locales/en/questsContent.json index ce798a7aaf..1db1b182fd 100644 --- a/website/common/locales/en/questsContent.json +++ b/website/common/locales/en/questsContent.json @@ -796,5 +796,15 @@ "questRubyCollectVenusRunes": "Venus Runes", "questRubyCollectRubyGems": "Ruby Gems", "questRubyDropRubyPotion": "Ruby Hatching Potion", - "questRubyUnlockText": "Unlocks Ruby Hatching Potions for purchase in the Market" + "questRubyUnlockText": "Unlocks Ruby Hatching Potions for purchase in the Market", + + "questWaffleText": "Waffling with the Fool: Disaster Breakfast!", + "questWaffleNotes": "“April Fool!” storms a flustered Lady Glaciate. “You said your dessert-themed prank was ‘over with and completely cleaned up’!”

“Why, it was and is, my dear,” replies the Fool, puzzled. “And I am the most honest of Fools. What's wrong?”

“There's a giant sugary monster approaching Habit City!”

“Hmm,” muses the Fool. “I did raid a few lairs for the mystic reagents for my last event. Maybe I attracted some unwanted attention. Is it the Saccharine Serpent? The Torte-oise? Tiramisu Rex?”

“No! It's some sort of... Awful Waffle!”

“Huh. That's a new one! Perhaps it spawned from all the ambient shenanigan energy.” He turns to you and @beffymaroo with a lopsided smile. “I don't suppose you'd be available for some heroics?”", + "questWaffleCompletion": "Battered and buttered but triumphant, you savor sweet victory as the Awful Waffle collapses into a pool of sticky goo.

“Wow, you really creamed that monster,” says Lady Glaciate, impressed.

“A piece of cake!” beams the April Fool.

“Kind of a shame, though,” says @beffymaroo. “It looked good enough to eat.”

The Fool takes a set of potion bottles from somewhere in his cape, fills them with the syrupy leavings of the Waffle, and mixes in a pinch of sparkling dust. The liquid swirls with color--new Hatching Potions! He tosses them into your arms. “All that adventure has given me an appetite. Who wants to join me for breakfast?”", + "questWaffleBoss": "Awful Waffle", + "questWaffleRageTitle": "Maple Mire", + "questWaffleRageDescription": "Maple Mire: This bar fills when you don't complete your Dailies. When it is full, the Awful Waffle will set back the party's attack progress!", + "questWaffleRageEffect": "`Awful Waffle uses MAPLE MIRE!` Sticky sappy syrup slows your swings and spells!", + "questWaffleDropDessertPotion": "Confection Hatching Potion", + "questWaffleUnlockText": "Unlocks Confection Hatching Potions for purchase in the Market", } diff --git a/website/common/script/content/hatching-potions.js b/website/common/script/content/hatching-potions.js index 5229dfb3d5..7ac5b5ba77 100644 --- a/website/common/script/content/hatching-potions.js +++ b/website/common/script/content/hatching-potions.js @@ -286,6 +286,12 @@ const wacky = { limited: true, _season: '_PENDING_', }, + Dessert: { + text: t('hatchingPotionDessert'), + limited: true, + _season: '_PENDING_', + canBuy: hasQuestAchievementFunction('waffle'), + }, }; each(drops, (pot, key) => { @@ -328,7 +334,7 @@ each(wacky, (pot, key) => { notes: t('hatchingPotionNotes', { potText: pot.text, }), - _addlNotes: pot._seasont && pot._season !== '_PENDING_' ? t('eventAvailability', { + _addlNotes: pot._season && pot._season !== '_PENDING_' ? t('eventAvailability', { date: t(`dateEnd${pot._season}`), }) : null, premium: false, diff --git a/website/common/script/content/quests.js b/website/common/script/content/quests.js index dd9330e266..eb85629b6d 100644 --- a/website/common/script/content/quests.js +++ b/website/common/script/content/quests.js @@ -3578,6 +3578,45 @@ const quests = { unlock: t('questRubyUnlockText'), }, }, + waffle: { + text: t('questWaffleText'), + notes: t('questWaffleNotes'), + completion: t('questWaffleCompletion'), + value: 4, + category: 'hatchingPotion', + boss: { + name: t('questWaffleBoss'), + hp: 500, + str: 2, + rage: { + title: t('questWaffleRageTitle'), + description: t('questWaffleRageDescription'), + value: 50, + progressDrain: 0.5, + effect: t('questWaffleRageEffect'), + }, + }, + drop: { + items: [ + { + type: 'hatchingPotions', + key: 'Dessert', + text: t('questWaffleDropDessertPotion'), + }, { + type: 'hatchingPotions', + key: 'Dessert', + text: t('questWaffleDropDessertPotion'), + }, { + type: 'hatchingPotions', + key: 'Dessert', + text: t('questWaffleDropDessertPotion'), + }, + ], + gp: 40, + exp: 500, + unlock: t('questWaffleUnlockText'), + }, + }, }; each(quests, (v, key) => { diff --git a/website/raw_sprites/spritesmith/quests/bosses/quest_waffle.png b/website/raw_sprites/spritesmith/quests/bosses/quest_waffle.png new file mode 100644 index 0000000000..6d6ba6cd91 Binary files /dev/null and b/website/raw_sprites/spritesmith/quests/bosses/quest_waffle.png differ diff --git a/website/server/models/group.js b/website/server/models/group.js index 32c12d5b7a..a4e4d1b79d 100644 --- a/website/server/models/group.js +++ b/website/server/models/group.js @@ -1057,16 +1057,18 @@ schema.methods._processBossQuest = async function processBossQuest (options) { if (quest.boss.rage.mpDrain) { updates.$set = { 'stats.mp': 0 }; } + if (quest.boss.rage.progressDrain) { + updates.$mul = { 'party.quest.progress.up': quest.boss.rage.progressDrain }; + } } } - await User.update( + await User.updateMany( { _id: { $in: this.getParticipatingQuestMembers() }, }, updates, - { multi: true }, ).exec(); // Apply changes the currently cronning user locally // so we don't have to reload it to get the updated state