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