Merge branch 'release' into develop

This commit is contained in:
Sabe Jones 2020-04-07 14:08:41 -05:00
commit f6a80d18b6
47 changed files with 7017 additions and 6880 deletions

2
package-lock.json generated
View file

@ -1,6 +1,6 @@
{
"name": "habitica",
"version": "4.139.0",
"version": "4.140.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {

View file

@ -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",

View file

@ -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;

View file

@ -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;
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 218 KiB

After

Width:  |  Height:  |  Size: 224 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 170 KiB

After

Width:  |  Height:  |  Size: 169 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 KiB

After

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 147 KiB

After

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 166 KiB

After

Width:  |  Height:  |  Size: 167 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 143 KiB

After

Width:  |  Height:  |  Size: 143 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 152 KiB

After

Width:  |  Height:  |  Size: 153 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 155 KiB

After

Width:  |  Height:  |  Size: 156 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 KiB

After

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 184 KiB

After

Width:  |  Height:  |  Size: 184 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 165 KiB

After

Width:  |  Height:  |  Size: 165 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 166 KiB

After

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 KiB

After

Width:  |  Height:  |  Size: 104 KiB

View file

@ -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 };
}

View file

@ -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) %>.",

View file

@ -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"
}

View file

@ -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,

View file

@ -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) => {

View file

@ -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',
},
];
},

View file

@ -19,6 +19,7 @@ export default {
},
availableSpells: [
'shinySeed',
],
availableQuests: [

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 976 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

View file

@ -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>
Weve 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, theres 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>
`,
});

View file

@ -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