Merge branch 'release' into develop
2
package-lock.json
generated
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "habitica",
|
||||
"version": "4.139.0",
|
||||
"version": "4.140.0",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"name": "habitica",
|
||||
"description": "A habit tracker app which treats your goals like a Role Playing Game.",
|
||||
"version": "4.139.0",
|
||||
"version": "4.140.0",
|
||||
"main": "./website/server/index.js",
|
||||
"dependencies": {
|
||||
"@babel/core": "^7.9.0",
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -1,27 +1,39 @@
|
|||
.promo_april_fools_2020 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: -433px -337px;
|
||||
width: 423px;
|
||||
height: 147px;
|
||||
}
|
||||
.promo_armoire_backgrounds_202004 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: -445px -184px;
|
||||
background-position: 0px -500px;
|
||||
width: 423px;
|
||||
height: 147px;
|
||||
}
|
||||
.promo_egg_quest {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: 0px -500px;
|
||||
background-position: 0px -648px;
|
||||
width: 354px;
|
||||
height: 147px;
|
||||
}
|
||||
.promo_mystery_202004 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: -355px -500px;
|
||||
background-position: -355px -648px;
|
||||
width: 282px;
|
||||
height: 147px;
|
||||
}
|
||||
.promo_seasonal_shop_spring {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: -638px -500px;
|
||||
background-position: -638px -648px;
|
||||
width: 162px;
|
||||
height: 138px;
|
||||
}
|
||||
.promo_shiny_seeds {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: -424px -500px;
|
||||
width: 360px;
|
||||
height: 147px;
|
||||
}
|
||||
.promo_spring_2019 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: 0px -337px;
|
||||
|
|
@ -36,13 +48,13 @@
|
|||
}
|
||||
.promo_spring_potions_2020 {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: -433px -337px;
|
||||
background-position: -445px -184px;
|
||||
width: 423px;
|
||||
height: 147px;
|
||||
}
|
||||
.promo_take_this {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: -151px -648px;
|
||||
background-position: -875px -151px;
|
||||
width: 96px;
|
||||
height: 69px;
|
||||
}
|
||||
|
|
@ -54,7 +66,7 @@
|
|||
}
|
||||
.scene_meditation {
|
||||
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
|
||||
background-position: 0px -648px;
|
||||
background-position: -875px 0px;
|
||||
width: 150px;
|
||||
height: 150px;
|
||||
}
|
||||
|
|
|
|||
|
After Width: | Height: | Size: 2 KiB |
|
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 90 KiB |
|
Before Width: | Height: | Size: 218 KiB After Width: | Height: | Size: 224 KiB |
|
Before Width: | Height: | Size: 170 KiB After Width: | Height: | Size: 169 KiB |
|
Before Width: | Height: | Size: 144 KiB After Width: | Height: | Size: 144 KiB |
|
Before Width: | Height: | Size: 138 KiB After Width: | Height: | Size: 138 KiB |
|
Before Width: | Height: | Size: 147 KiB After Width: | Height: | Size: 145 KiB |
|
Before Width: | Height: | Size: 166 KiB After Width: | Height: | Size: 167 KiB |
|
Before Width: | Height: | Size: 143 KiB After Width: | Height: | Size: 143 KiB |
|
Before Width: | Height: | Size: 152 KiB After Width: | Height: | Size: 153 KiB |
|
Before Width: | Height: | Size: 155 KiB After Width: | Height: | Size: 156 KiB |
|
Before Width: | Height: | Size: 144 KiB After Width: | Height: | Size: 145 KiB |
|
Before Width: | Height: | Size: 184 KiB After Width: | Height: | Size: 184 KiB |
|
Before Width: | Height: | Size: 165 KiB After Width: | Height: | Size: 165 KiB |
|
Before Width: | Height: | Size: 166 KiB After Width: | Height: | Size: 166 KiB |
|
Before Width: | Height: | Size: 99 KiB After Width: | Height: | Size: 104 KiB |
|
|
@ -183,7 +183,7 @@
|
|||
</div>
|
||||
</div>
|
||||
<div
|
||||
v-if="petGroup.key !== 'specialPets' && petGroup.key !== 'wackyPets'"
|
||||
v-if="petGroup.key !== 'specialPets' && !(petGroup.key === 'wackyPets' && selectedSortBy !== 'sortByColor')"
|
||||
class="btn btn-flat btn-show-more"
|
||||
@click="setShowMore(petGroup.key)"
|
||||
>
|
||||
|
|
@ -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 };
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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) %>.",
|
||||
|
|
|
|||
|
|
@ -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’!”<br><br>“Why, it was and is, my dear,” replies the Fool, puzzled. “And I am the most honest of Fools. What's wrong?”<br><br>“There's a giant sugary monster approaching Habit City!”<br><br>“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?”<br><br>“No! It's some sort of... Awful Waffle!”<br><br>“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.<br><br>“Wow, you really creamed that monster,” says Lady Glaciate, impressed.<br><br>“A piece of cake!” beams the April Fool.<br><br>“Kind of a shame, though,” says @beffymaroo. “It looked good enough to eat.”<br><br>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"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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) => {
|
||||
|
|
|
|||
|
|
@ -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',
|
||||
},
|
||||
];
|
||||
},
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@ export default {
|
|||
},
|
||||
|
||||
availableSpells: [
|
||||
'shinySeed',
|
||||
],
|
||||
|
||||
availableQuests: [
|
||||
|
|
|
|||
BIN
website/raw_sprites/spritesmith/quests/bosses/quest_waffle.png
Normal file
|
After Width: | Height: | Size: 5.2 KiB |
|
After Width: | Height: | Size: 976 B |
BIN
website/raw_sprites/spritesmith_large/promo_april_fools_2020.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
website/raw_sprites/spritesmith_large/promo_shiny_seeds.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
|
|
@ -4,7 +4,7 @@ const api = {};
|
|||
|
||||
// @TODO export this const, cannot export it from here because only routes are exported from
|
||||
// controllers
|
||||
const LAST_ANNOUNCEMENT_TITLE = 'APRIL BACKGROUNDS AND ENCHANTED ARMOIRE ITEMS!';
|
||||
const LAST_ANNOUNCEMENT_TITLE = 'CONFECTION HATCHING POTION QUEST, APRIL FOOL BLOG POST, AND SHINY SEEDS!';
|
||||
const worldDmg = { // @TODO
|
||||
bailey: false,
|
||||
};
|
||||
|
|
@ -31,25 +31,63 @@ api.getNews = {
|
|||
<div class="mr-3 ${baileyClass}"></div>
|
||||
<div class="media-body">
|
||||
<h1 class="align-self-center">${res.t('newStuff')}</h1>
|
||||
<h2>4/6/2020 - ${LAST_ANNOUNCEMENT_TITLE}</h2>
|
||||
<h2>4/7/2020 - ${LAST_ANNOUNCEMENT_TITLE}</h2>
|
||||
</div>
|
||||
</div>
|
||||
<hr/>
|
||||
<div class="promo_armoire_backgrounds_202004 center-block"></div>
|
||||
<h3>April Fool's Challenge Winners and Blog Post!</h3>
|
||||
<p>
|
||||
We’ve added three new backgrounds to the Background Shop! Now your avatar can splash in a
|
||||
Rainy Barnyard, enjoy the aroma of a Heather Field, and gaze at shapeshifting Animal
|
||||
Clouds. Check them out under User Icon > Backgrounds on web and Menu > Inventory >
|
||||
Customize Avatar on mobile!
|
||||
The winners of the April Fool's Social Media Challenge have been selected!
|
||||
Congratulations to Silvercat17, RaidingPartyGames, Pangdood, Spacehawk, and VixiMonster!
|
||||
</p>
|
||||
<p>
|
||||
Plus, there’s new Gold-purchasable equipment in the Enchanted Armoire, including the
|
||||
Paper Knight Set. Better work hard on your real-life tasks to earn all the pieces!
|
||||
Enjoy :)
|
||||
Thank you to everyone who shared their awesome pics with their dessert pets! You can see
|
||||
a fun <a href='https://habitica.wordpress.com/2020/04/07/taking-the-cake-dessert-pet-pics-from-habiticas-april-fools-celebration/'
|
||||
target='_blank'>recap of the shenanigans on our blog</a>. Stay tuned to see what wacky antics the Fool gets up to next year!
|
||||
</p>
|
||||
<div class="small mb-3">
|
||||
by QuartzFox, gawrone, ravenlune, shanaqui, katieslug, -Tyr-, and SabreCat
|
||||
</div>
|
||||
<div class="promo_april_fools_2020 center-block"></div>
|
||||
<h3>Confection Magic Hatching Potion Quest!</h3>
|
||||
<p>
|
||||
Oh, no! Just as Habiticans were going back to daily life, missing their cute dessert
|
||||
pets, it looks like some kind of syrupy monstrosity has emerged to threaten the land!
|
||||
</p>
|
||||
<p>
|
||||
Can you help the April Fool save Habitica from the Awful Waffle? Join the battle, and
|
||||
earn special Confection Magic Hatching potions by completing your everyday tasks.
|
||||
</p>
|
||||
<p>
|
||||
You can purchase the limited Confection Magic Hatching Potion Quest from the <a
|
||||
href='/shops/quests'>Quest Shop</a> between now and April 30! Each quest completion
|
||||
awards participants three potions each. Confection pets do not have mount forms, so keep
|
||||
that in mind when you're purchasing!
|
||||
</p>
|
||||
<p>
|
||||
Garden Potions have also returned, if you prefer a healthier treat! You can find them in
|
||||
<a href='/shops/market'>the Market</a> until April 30. Keep in mind that Garden pets also
|
||||
do not have mount forms when deciding how many to purchase.
|
||||
</p>
|
||||
<p>
|
||||
After they're gone, it will be at least a year before the Confection Magic Hatching
|
||||
Potion Quest or the Garden Magic Potions are available again, so be sure to get them now!
|
||||
</p>
|
||||
<div class="small mb-3">by Beffymaroo, Piyo, Viirus, and SabreCat</div>
|
||||
<div class="promo_shiny_seeds center-block"></div>
|
||||
<h3>Shiny Seeds</h3>
|
||||
<p>
|
||||
Throw a Shiny Seed at your friends and they will turn into a cheerful flower until their
|
||||
next cron! You can buy the Seeds in the <a href='/shops/seasonal'>Seasonal Shop</a> with
|
||||
Gold. Plus, if you get transformed by a Shiny Seed, you'll receive the Agricultural
|
||||
Friends badge!
|
||||
</p>
|
||||
<p>
|
||||
Don't want to be a flower? Just buy some Petal-Free Potion from your Rewards column to
|
||||
reverse it.
|
||||
</p>
|
||||
<p>
|
||||
Shiny Seeds will be available in the <a href='/shops/seasonal'>Seasonal Shop</a> until
|
||||
April 30th!
|
||||
</p>
|
||||
<div class="small mb-3">by Lemoness</div>
|
||||
</div>
|
||||
`,
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||