Compare commits

..

6 Commits

Author SHA1 Message Date
Sabe Jones bceccd55bf 4.145.1 2020-06-16 13:35:51 -05:00
Sabe Jones 0116c56abb chore(news): Bailey 2020-06-16 13:35:32 -05:00
Sabe Jones e6b65871e7 4.145.0 2020-06-11 16:38:15 -05:00
Sabe Jones 873ac53e27 Squashed commit of the following:
commit f461c07ca7997362512a366eebc7d3a8fba854ee
Author: Sabe Jones <sabrecat@gmail.com>
Date:   Thu Jun 11 16:37:14 2020 -0500

    fix(sprites): wolf alignment

commit 6ceb4ba6d1ea62892e9b335307043d78971328d0
Author: Sabe Jones <sabrecat@gmail.com>
Date:   Thu Jun 11 14:53:07 2020 -0500

    chore(sprites): compile

commit 8b517309f531c7f151c5c18a5ca9847ab7aa5dbb
Author: Sabe Jones <sabrecat@gmail.com>
Date:   Thu Jun 11 14:52:49 2020 -0500

    feat(content): Fluorite Magic Hatching Potion and quest
2020-06-11 16:38:05 -05:00
Sabe Jones 51d20ef7e8 4.144.1 2020-06-09 15:27:43 -05:00
Matteo Pagliazzi 692d02984b unlock: fix unlocking hair items 2020-06-09 22:13:22 +02:00
82 changed files with 9149 additions and 8790 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "habitica",
"version": "4.144.1",
"version": "4.145.1",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "habitica",
"description": "A habit tracker app which treats your goals like a Role Playing Game.",
"version": "4.144.1",
"version": "4.145.1",
"main": "./website/server/index.js",
"dependencies": {
"@babel/core": "^7.10.2",
+67
View File
@@ -10,6 +10,8 @@ describe('shared.ops.unlock', () => {
const unlockGearSetPath = 'items.gear.owned.headAccessory_special_bearEars,items.gear.owned.headAccessory_special_cactusEars,items.gear.owned.headAccessory_special_foxEars,items.gear.owned.headAccessory_special_lionEars,items.gear.owned.headAccessory_special_pandaEars,items.gear.owned.headAccessory_special_pigEars,items.gear.owned.headAccessory_special_tigerEars,items.gear.owned.headAccessory_special_wolfEars';
const backgroundUnlockPath = 'background.giant_florals';
const backgroundSetUnlockPath = 'background.archery_range,background.giant_florals,background.rainbows_end';
const hairUnlockPath = 'hair.color.rainbow,hair.color.yellow,hair.color.green,hair.color.purple,hair.color.blue,hair.color.TRUred';
const facialHairUnlockPath = 'hair.mustache.1,hair.mustache.2,hair.beard.1,hair.beard.2,hair.beard.3';
const usersStartingGems = 50 / 4;
beforeEach(() => {
@@ -206,6 +208,40 @@ describe('shared.ops.unlock', () => {
expect(user.balance).to.equal(usersStartingGems - 1.25);
});
it('unlocks a full set of hair items', () => {
user.purchased.hair.color = {};
const initialHairColors = Object.keys(user.purchased.hair.color).length;
const [, message] = unlock(user, { query: { path: hairUnlockPath } });
expect(message).to.equal(i18n.t('unlocked'));
const individualPaths = hairUnlockPath.split(',');
individualPaths.forEach(path => {
expect(get(user.purchased, path)).to.be.true;
});
expect(Object.keys(user.purchased.hair.color).length)
.to.equal(initialHairColors + individualPaths.length);
expect(user.balance).to.equal(usersStartingGems - 1.25);
});
it('unlocks the facial hair set', () => {
user.purchased.hair.mustache = {};
user.purchased.hair.beard = {};
const initialMustache = Object.keys(user.purchased.hair.mustache).length;
const initialBeard = Object.keys(user.purchased.hair.mustache).length;
const [, message] = unlock(user, { query: { path: facialHairUnlockPath } });
expect(message).to.equal(i18n.t('unlocked'));
const individualPaths = facialHairUnlockPath.split(',');
individualPaths.forEach(path => {
expect(get(user.purchased, path)).to.be.true;
});
expect(Object.keys(user.purchased.hair.mustache).length + Object.keys(user.purchased.hair.beard).length) // eslint-disable-line max-len
.to.equal(initialMustache + initialBeard + individualPaths.length);
expect(user.balance).to.equal(usersStartingGems - 1.25);
});
it('unlocks a full set of gear', () => {
const initialGear = Object.keys(user.items.gear.owned).length;
const [, message] = unlock(user, { query: { path: unlockGearSetPath } });
@@ -246,6 +282,37 @@ describe('shared.ops.unlock', () => {
expect(user.balance).to.equal(usersStartingGems - 0.5);
});
it('unlocks an item (hair color)', () => {
user.purchased.hair.color = {};
const path = hairUnlockPath.split(',')[0];
const initialColorHair = Object.keys(user.purchased.hair.color).length;
const [, message] = unlock(user, { query: { path } });
expect(message).to.equal(i18n.t('unlocked'));
expect(Object.keys(user.purchased.hair.color).length).to.equal(initialColorHair + 1);
expect(get(user.purchased, path)).to.be.true;
expect(user.balance).to.equal(usersStartingGems - 0.5);
});
it('unlocks an item (facial hair)', () => {
user.purchased.hair.mustache = {};
user.purchased.hair.beard = {};
const path = facialHairUnlockPath.split(',')[0];
const initialMustache = Object.keys(user.purchased.hair.mustache).length;
const initialBeard = Object.keys(user.purchased.hair.beard).length;
const [, message] = unlock(user, { query: { path } });
expect(message).to.equal(i18n.t('unlocked'));
expect(Object.keys(user.purchased.hair.mustache).length).to.equal(initialMustache + 1);
expect(Object.keys(user.purchased.hair.beard).length).to.equal(initialBeard);
expect(get(user.purchased, path)).to.be.true;
expect(user.balance).to.equal(usersStartingGems - 0.5);
});
it('unlocks an item (gear)', () => {
const path = unlockGearSetPath.split(',')[0];
const initialGear = Object.keys(user.items.gear.owned).length;
@@ -1,24 +1,30 @@
.promo_armoire_backgrounds_202006 {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -259px 0px;
background-position: -340px 0px;
width: 423px;
height: 147px;
}
.promo_mystery_202006 {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: 0px -259px;
background-position: -340px -148px;
width: 282px;
height: 147px;
}
.promo_take_this {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -259px -148px;
background-position: -623px -148px;
width: 96px;
height: 69px;
}
.scene_hiking {
.scene_achievement {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: 0px 0px;
width: 339px;
height: 210px;
}
.scene_hiking {
background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: 0px -211px;
width: 258px;
height: 258px;
}
@@ -1,94 +1,100 @@
.quest_bunny {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: 0px -1546px;
background-position: 0px -1543px;
width: 210px;
height: 186px;
}
.quest_butterfly {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1320px -660px;
background-position: -1320px -220px;
width: 219px;
height: 219px;
}
.quest_cheetah {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -440px 0px;
background-position: -220px -892px;
width: 219px;
height: 219px;
}
.quest_cow {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1760px 0px;
background-position: -1762px -175px;
width: 174px;
height: 213px;
}
.quest_dilatory {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -440px -232px;
background-position: -220px -232px;
width: 219px;
height: 219px;
}
.quest_dilatoryDistress1 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -222px -1332px;
background-position: 0px -1332px;
width: 210px;
height: 210px;
}
.quest_dilatoryDistress2 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1760px -422px;
background-position: -1762px -1083px;
width: 150px;
height: 150px;
}
.quest_dilatoryDistress3 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: 0px -452px;
background-position: -660px -220px;
width: 219px;
height: 219px;
}
.quest_dilatory_derby {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -220px -232px;
background-position: 0px -232px;
width: 219px;
height: 219px;
}
.quest_dolphin {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -220px -452px;
background-position: 0px -452px;
width: 219px;
height: 219px;
}
.quest_dustbunnies {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -440px -452px;
background-position: -220px -452px;
width: 219px;
height: 219px;
}
.quest_egg {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1760px -214px;
background-position: -1762px -573px;
width: 165px;
height: 207px;
}
.quest_evilsanta {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1760px -875px;
background-position: -1762px -1234px;
width: 118px;
height: 131px;
}
.quest_evilsanta2 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -880px -220px;
background-position: -880px 0px;
width: 219px;
height: 219px;
}
.quest_falcon {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -880px -440px;
background-position: -880px -220px;
width: 219px;
height: 219px;
}
.quest_ferret {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -880px -440px;
width: 219px;
height: 219px;
}
.quest_fluorite {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: 0px -672px;
width: 219px;
@@ -96,7 +102,7 @@
}
.quest_frog {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: 0px -1332px;
background-position: -1540px 0px;
width: 221px;
height: 213px;
}
@@ -114,7 +120,7 @@
}
.quest_goldenknight2 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -462px -1546px;
background-position: -1305px -1332px;
width: 250px;
height: 150px;
}
@@ -126,7 +132,7 @@
}
.quest_gryphon {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -876px -1332px;
background-position: -871px -1332px;
width: 216px;
height: 177px;
}
@@ -144,13 +150,13 @@
}
.quest_hedgehog {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -433px -1332px;
background-position: -211px -1332px;
width: 219px;
height: 186px;
}
.quest_hippo {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -220px -892px;
background-position: -220px 0px;
width: 219px;
height: 219px;
}
@@ -168,7 +174,7 @@
}
.quest_kraken {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1093px -1332px;
background-position: -654px -1332px;
width: 216px;
height: 177px;
}
@@ -186,19 +192,19 @@
}
.quest_lostMasterclasser3 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1320px -220px;
background-position: -1100px 0px;
width: 219px;
height: 219px;
}
.quest_mayhemMistiflying1 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1760px -724px;
background-position: -1762px -781px;
width: 150px;
height: 150px;
}
.quest_mayhemMistiflying2 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -220px 0px;
background-position: -1320px -660px;
width: 219px;
height: 219px;
}
@@ -216,7 +222,7 @@
}
.quest_moon1 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1540px -437px;
background-position: -1540px -431px;
width: 216px;
height: 216px;
}
@@ -252,61 +258,61 @@
}
.quest_nudibranch {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1540px -871px;
background-position: -1540px -214px;
width: 216px;
height: 216px;
}
.quest_octopus {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -653px -1332px;
background-position: -431px -1332px;
width: 222px;
height: 177px;
}
.quest_owl {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1540px 0px;
background-position: -220px -1112px;
width: 219px;
height: 219px;
}
.quest_peacock {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1540px -220px;
background-position: -1540px -648px;
width: 216px;
height: 216px;
}
.quest_penguin {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: 0px -1733px;
background-position: -1762px -389px;
width: 190px;
height: 183px;
}
.quest_pterodactyl {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -220px -1112px;
background-position: -220px -672px;
width: 219px;
height: 219px;
}
.quest_rat {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1320px -440px;
background-position: -660px 0px;
width: 219px;
height: 219px;
}
.quest_robot {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -880px -892px;
background-position: -440px -232px;
width: 219px;
height: 219px;
}
.quest_rock {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1540px -654px;
background-position: -1540px -865px;
width: 216px;
height: 216px;
}
.quest_rooster {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1527px -1332px;
background-position: -1762px 0px;
width: 213px;
height: 174px;
}
@@ -318,25 +324,25 @@
}
.quest_sabretooth {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1100px -220px;
background-position: -1320px -440px;
width: 219px;
height: 219px;
}
.quest_seaserpent {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -880px -672px;
background-position: -880px -892px;
width: 219px;
height: 219px;
}
.quest_sheep {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -220px -672px;
background-position: -1100px -220px;
width: 219px;
height: 219px;
}
.quest_silver {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -880px 0px;
background-position: -880px -672px;
width: 219px;
height: 219px;
}
@@ -348,49 +354,37 @@
}
.quest_sloth {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -660px -220px;
background-position: -440px -452px;
width: 219px;
height: 219px;
}
.quest_snail {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1540px -1088px;
background-position: -1540px -1082px;
width: 219px;
height: 213px;
}
.quest_snake {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1310px -1332px;
background-position: -1088px -1332px;
width: 216px;
height: 177px;
}
.quest_spider {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -211px -1546px;
background-position: -211px -1543px;
width: 250px;
height: 150px;
}
.quest_squirrel {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -660px 0px;
background-position: -440px 0px;
width: 219px;
height: 219px;
}
.quest_stoikalmCalamity1 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1760px -573px;
background-position: -1762px -932px;
width: 150px;
height: 150px;
}
.quest_stoikalmCalamity2 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: 0px -232px;
width: 219px;
height: 219px;
}
.quest_stoikalmCalamity3 {
background-image: url('~@/assets/images/sprites/spritesmith-main-13.png');
background-position: -1100px 0px;
width: 219px;
height: 219px;
}
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.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 425 KiB

After

Width:  |  Height:  |  Size: 422 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 243 KiB

After

Width:  |  Height:  |  Size: 250 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 163 KiB

After

Width:  |  Height:  |  Size: 167 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 150 KiB

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 137 KiB

After

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 178 KiB

After

Width:  |  Height:  |  Size: 187 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 141 KiB

After

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 154 KiB

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 149 KiB

After

Width:  |  Height:  |  Size: 153 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 147 KiB

After

Width:  |  Height:  |  Size: 156 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 180 KiB

After

Width:  |  Height:  |  Size: 157 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 168 KiB

After

Width:  |  Height:  |  Size: 186 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 160 KiB

After

Width:  |  Height:  |  Size: 164 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 126 KiB

After

Width:  |  Height:  |  Size: 153 KiB

+1
View File
@@ -300,6 +300,7 @@
"hatchingPotionRuby": "Ruby",
"hatchingPotionBirchBark": "Birch Bark",
"hatchingPotionDessert": "Confection",
"hatchingPotionFluorite": "Fluorite",
"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) %>.",
+8 -1
View File
@@ -809,5 +809,12 @@
"questWaffleUnlockText": "Unlocks Confection Hatching Potions for purchase in the Market",
"jungleBuddiesText": "Jungle Buddies Quest Bundle",
"jungleBuddiesNotes": "Contains 'Monstrous Mandrill and the Mischief Monkeys', 'The Somnolent Sloth', and 'The Tangle Tree'. Available until <%= date %>."
"jungleBuddiesNotes": "Contains 'Monstrous Mandrill and the Mischief Monkeys', 'The Somnolent Sloth', and 'The Tangle Tree'. Available until <%= date %>.",
"questFluoriteText": "A Bright Fluorite Fright",
"questFluoriteNotes": "Unusual minerals are in high demand these days, so you and a few friends have trekked deep into the mines of the Meandering Mountains, in search of exciting ores. Its a long and boring expedition, until @-Tyr- stumbles over a large rock, sitting right in the middle of the tunnel.<br><br>“This should help brighten things up,” says @nirbhao, before conjuring up an orb of light.<br><br>A warm brightness fills the tunnel, but something odd starts happening to that large rock. Feeding on the magical light, it begins to glow with fluorescent blues, greens and purples. Then it rears upright into a vaguely humanoid shape, complete with glowing red eyes fixed right on you! You jump into action with flashing spells and shining weapons.",
"questFluoriteCompletion": "As you do battle, the crystal creature seems more and more distracted by the light show you are creating. “So shiny…” it mutters.<br><br>“Of course!” @nirbhao exclaims. “It must be a fluorite elemental. All they want is light to let them glow. Lets help it shine.”<br><br>The elemental giggles happily and glows all the brighter as you light up torches and motes of magic. Its so glad to be shining again that it leads you to a rich deposit of fluorite crystals.<br><br>“This is the perfect ingredient for a new hatching potion,” says @nirbhao. “One which will make our pets as bright as our new fluorescent friend.”",
"questFluoriteBoss": "Fluorite Elemental",
"questFluoriteDropFluoritePotion": "Fluorite Hatching Potion",
"questFluoriteUnlockText": "Unlocks Fluorite Hatching Potions for purchase in the Market"
}
@@ -298,6 +298,13 @@ const premium = {
date: t('dateEndMarch'),
}),
},
Fluorite: {
value: 2,
text: t('hatchingPotionFluorite'),
limited: true,
canBuy: hasQuestAchievementFunction('fluorite'),
_addlNotes: t('premiumPotionUnlimitedNotes'),
},
};
const wacky = {
+32
View File
@@ -3615,6 +3615,38 @@ const quests = {
unlock: t('questWaffleUnlockText'),
},
},
fluorite: {
text: t('questFluoriteText'),
notes: t('questFluoriteNotes'),
completion: t('questFluoriteCompletion'),
value: 4,
category: 'hatchingPotion',
boss: {
name: t('questFluoriteBoss'),
hp: 1200,
str: 2,
},
drop: {
items: [
{
type: 'hatchingPotions',
key: 'Fluorite',
text: t('questFluoriteDropFluoritePotion'),
}, {
type: 'hatchingPotions',
key: 'Fluorite',
text: t('questFluoriteDropFluoritePotion'),
}, {
type: 'hatchingPotions',
key: 'Fluorite',
text: t('questFluoriteDropFluoritePotion'),
},
],
gp: 70,
exp: 750,
unlock: t('questFluoriteUnlockText'),
},
},
};
each(quests, (v, key) => {
@@ -1,34 +1,8 @@
import moment from 'moment';
// Magic Hatching Potions are configured like this:
// type: 'premiumHatchingPotion', // note no "s" at the end
// path: 'premiumHatchingPotions.Rainbow',
const featuredItems = {
market () {
if (moment().isBefore('2020-05-02')) {
return [
{
type: 'armoire',
path: 'armoire',
},
{
type: 'premiumHatchingPotion',
path: 'premiumHatchingPotions.BirchBark',
},
{
type: 'premiumHatchingPotion',
path: 'premiumHatchingPotions.Shimmer',
},
{
type: 'premiumHatchingPotion',
path: 'premiumHatchingPotions.Celestial',
},
{
type: 'premiumHatchingPotion',
path: 'hatchingPotions.Veggie',
},
];
}
return [
{
type: 'armoire',
@@ -49,34 +23,18 @@ const featuredItems = {
];
},
quests () {
if (moment().isBefore('2020-05-02')) {
return [
{
type: 'quests',
path: 'quests.waffle',
},
{
type: 'quests',
path: 'quests.trex_undead',
},
{
type: 'quests',
path: 'quests.bunny',
},
];
}
return [
{
type: 'quests',
path: 'quests.sheep',
path: 'quests.rock',
},
{
type: 'quests',
path: 'quests.seaserpent',
path: 'quests.peacock',
},
{
type: 'quests',
path: 'quests.silver',
path: 'quests.fluorite',
},
];
},
+66 -14
View File
@@ -28,12 +28,16 @@ function invalidSet (req) {
* Return an item given its path and the type of set
*/
function getItemByPath (path, setType) {
const itemKey = splitPathItem(path)[1];
const item = setType === 'gear'
? content.gear.flat[itemKey]
: content.appearances[setType][itemKey];
const [itemPathParent, itemKey] = splitPathItem(path);
return item;
if (setType === 'gear') return content.gear.flat[itemKey];
if (setType === 'hair') {
// itemPathParent is in this format: hair.purple
const hairType = itemPathParent.split('.')[1];
return content.appearances.hair[hairType][itemKey];
}
return content.appearances[setType][itemKey];
}
/**
@@ -48,6 +52,25 @@ function getSetType (firstPath, req) {
return invalidSet(req);
}
/**
* Return the items and paths for a set given the set,
* a list of items of the type and a prefix for the path.
*/
function getItemsAndPathsForSet (set, itemsCollection, pathPrefix) {
const items = [];
const paths = [];
Object.keys(itemsCollection).forEach(possibleItemKey => {
const possibleItem = itemsCollection[possibleItemKey];
if (possibleItem && possibleItem.set && possibleItem.set.key === set.key) {
items.push(possibleItem);
paths.push(`${pathPrefix}.${possibleItem.key}`);
}
});
return { items, paths };
}
/**
* Return the set of items to unlock given the path of the first item in the set.
*/
@@ -78,16 +101,45 @@ function getSet (setType, firstPath, req) {
const { set } = item;
if (!set || set.setPrice === 0) return invalidSet(req);
const items = [];
const paths = [];
// The facialHair set is split between hair.mustache and hair.beards
if (setType === 'hair' && set.key === 'facialHair') {
const items = [];
const paths = [];
Object.keys(content.appearances[setType]).forEach(possibleItemKey => {
const possibleItem = content.appearances[setType][possibleItemKey];
if (possibleItem && possibleItem.set && possibleItem.set.key === set.key) {
items.push(possibleItem);
paths.push(`${setType}.${possibleItem.key}`);
}
});
const { mustache } = content.appearances.hair;
const mustachePrefix = 'hair.mustache';
const {
items: mustacheItems,
paths: mustachePaths,
} = getItemsAndPathsForSet(set, mustache, mustachePrefix);
const { beard } = content.appearances.hair;
const beardPrefix = 'hair.beard';
const {
items: beardItems,
paths: beardPaths,
} = getItemsAndPathsForSet(set, beard, beardPrefix);
items.push(...beardItems, ...mustacheItems);
paths.push(...beardPaths, ...mustachePaths);
return { items, paths, set };
}
let pathPrefix = setType;
let itemsCollection = content.appearances[setType];
if (setType === 'hair') { // hair sets are nested like hair.color.item
const nestedSet = firstPath.split('.')[1];
itemsCollection = itemsCollection[nestedSet];
pathPrefix = `${pathPrefix}.${nestedSet}`;
}
const { items, paths } = getItemsAndPathsForSet(set, itemsCollection, pathPrefix);
return { items, paths, set };
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 975 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 887 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 942 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 811 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 937 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 871 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

+10 -15
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 = 'JUNE BACKGROUNDS AND ARMOIRE ITEMS!';
const LAST_ANNOUNCEMENT_TITLE = 'BLOG POST: WIKI SPOTLIGHT ON CARDS';
const worldDmg = { // @TODO
bailey: false,
};
@@ -31,25 +31,20 @@ api.getNews = {
<div class="mr-3 ${baileyClass}"></div>
<div class="media-body">
<h1 class="align-self-center">${res.t('newStuff')}</h1>
<h2>6/9/2020 - ${LAST_ANNOUNCEMENT_TITLE}</h2>
<h2>6/16/2020 - ${LAST_ANNOUNCEMENT_TITLE}</h2>
</div>
</div>
<hr/>
<div class="promo_armoire_backgrounds_202006 center-block"></div>
<div class="scene_achievement center-block"></div>
<p>
Weve added three new backgrounds to the Background Shop! Now your avatar can sunbathe
next to a Salt Lake, splash in the Relaxation River, and set sail for adventure on a
Viking Ship. Check them out under User Icon > Backgrounds on web and Menu > Inventory >
Customize Avatar on mobile!
This month's <a href='https://habitica.wordpress.com/2020/06/10/cards/' target='_blank'>
featured Wiki article</a> is about Cards! We hope that it will help you as you bond with
your partymates. Be sure to check it out, and let us know what you think by reaching out
on <a href='https://twitter.com/habitica' target='_blank'>Twitter</a>, <a
href='http://blog.habitrpg.com' target='_blank'>Tumblr</a>, and <a
href='https://facebook.com/habitica' target='_blank'>Facebook</a>.
</p>
<p>
Plus, theres new Gold-purchasable equipment in the Enchanted Armoire, including the
Lifeguard Accessory Set. Better work hard on your real-life tasks to earn all the pieces!
Enjoy :)
</p>
<div class="small mb-3">
by Pixel Storm, ravenlune, -Tyr-, katieslug, jjgame83, gawrone, shanaqui, and SabreCat
</div>
<div class="small mb-3">by shanaqui and the Wiki Wizards</div>
</div>
`,
});