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/client/src/components/inventory/stable/index.vue b/website/client/src/components/inventory/stable/index.vue index bce64e00be..101ad6f853 100644 --- a/website/client/src/components/inventory/stable/index.vue +++ b/website/client/src/components/inventory/stable/index.vue @@ -183,7 +183,7 @@
@@ -790,7 +790,7 @@ export default { const pets = this.listAnimals(animalGroup, 'pet', hideMissing, sortBy, searchText); // Don't group special - if (animalGroup.key === 'specialPets' || animalGroup.key === 'wackyPets') { + if (animalGroup.key === 'specialPets' || (animalGroup.key === 'wackyPets' && sortBy !== 'sortByColor')) { return { none: pets }; } 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..f9a867768c 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..02b6ab32b8 100644 --- a/website/common/script/content/hatching-potions.js +++ b/website/common/script/content/hatching-potions.js @@ -284,7 +284,19 @@ const wacky = { Veggie: { text: t('hatchingPotionVeggie'), limited: true, - _season: '_PENDING_', + _addlNotes: t('eventAvailabilityReturning', { + availableDate: t('dateEndMarch'), + previousDate: t('marchYYYY', { year: 2019 }), + }), + canBuy () { + return moment().isBefore('2020-05-02'); + }, + }, + Dessert: { + text: t('hatchingPotionDessert'), + limited: true, + _addlNotes: t('premiumPotionUnlimitedNotes'), + canBuy: hasQuestAchievementFunction('waffle'), }, }; @@ -328,7 +340,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/common/script/content/shop-featuredItems.js b/website/common/script/content/shop-featuredItems.js index 0f6fa8fd8f..572f5cabe7 100644 --- a/website/common/script/content/shop-featuredItems.js +++ b/website/common/script/content/shop-featuredItems.js @@ -23,6 +23,10 @@ const featuredItems = { type: 'premiumHatchingPotion', path: 'premiumHatchingPotions.Celestial', }, + { + type: 'hatchingPotions', + path: 'hatchingPotions.Veggie', + }, ]; } return [ @@ -45,34 +49,34 @@ const featuredItems = { ]; }, quests () { - if (moment().isBefore('2020-04-02')) { + if (moment().isBefore('2020-05-02')) { return [ { - type: 'bundles', - path: 'bundles.hugabug', + type: 'quests', + path: 'quests.waffle', }, { type: 'quests', - path: 'quests.velociraptor', + path: 'quests.trex_undead', }, { type: 'quests', - path: 'quests.taskwoodsTerror1', + path: 'quests.bunny', }, ]; } return [ { type: 'quests', - path: 'quests.badger', + path: 'quests.sheep', }, { type: 'quests', - path: 'quests.ferret', + path: 'quests.seaserpent', }, { type: 'quests', - path: 'quests.sloth', + path: 'quests.silver', }, ]; }, 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/raw_sprites/spritesmith/quests/scrolls/inventory_quest_scroll_waffle.png b/website/raw_sprites/spritesmith/quests/scrolls/inventory_quest_scroll_waffle.png new file mode 100644 index 0000000000..65b62f282e Binary files /dev/null and b/website/raw_sprites/spritesmith/quests/scrolls/inventory_quest_scroll_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