Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| bceccd55bf | |||
| 0116c56abb | |||
| e6b65871e7 | |||
| 873ac53e27 | |||
| 51d20ef7e8 | |||
| 692d02984b |
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "habitica",
|
||||
"version": "4.144.1",
|
||||
"version": "4.145.1",
|
||||
"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.144.1",
|
||||
"version": "4.145.1",
|
||||
"main": "./website/server/index.js",
|
||||
"dependencies": {
|
||||
"@babel/core": "^7.10.2",
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 425 KiB After Width: | Height: | Size: 422 KiB |
|
Before Width: | Height: | Size: 243 KiB After Width: | Height: | Size: 250 KiB |
|
Before Width: | Height: | Size: 163 KiB After Width: | Height: | Size: 167 KiB |
|
Before Width: | Height: | Size: 150 KiB After Width: | Height: | Size: 154 KiB |
|
Before Width: | Height: | Size: 138 KiB After Width: | Height: | Size: 140 KiB |
|
Before Width: | Height: | Size: 137 KiB After Width: | Height: | Size: 130 KiB |
|
Before Width: | Height: | Size: 178 KiB After Width: | Height: | Size: 187 KiB |
|
Before Width: | Height: | Size: 141 KiB After Width: | Height: | Size: 144 KiB |
|
Before Width: | Height: | Size: 154 KiB After Width: | Height: | Size: 151 KiB |
|
Before Width: | Height: | Size: 149 KiB After Width: | Height: | Size: 153 KiB |
|
Before Width: | Height: | Size: 147 KiB After Width: | Height: | Size: 156 KiB |
|
Before Width: | Height: | Size: 180 KiB After Width: | Height: | Size: 157 KiB |
|
Before Width: | Height: | Size: 168 KiB After Width: | Height: | Size: 186 KiB |
|
Before Width: | Height: | Size: 160 KiB After Width: | Height: | Size: 164 KiB |
|
Before Width: | Height: | Size: 126 KiB After Width: | Height: | Size: 153 KiB |
@@ -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) %>.",
|
||||
|
||||
@@ -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. It’s 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. Let’s help it shine.”<br><br>The elemental giggles happily and glows all the brighter as you light up torches and motes of magic. It’s 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 = {
|
||||
|
||||
@@ -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',
|
||||
},
|
||||
];
|
||||
},
|
||||
|
||||
@@ -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 };
|
||||
}
|
||||
|
||||
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 975 B |
|
After Width: | Height: | Size: 2.1 KiB |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 2.5 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 1.8 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 1.9 KiB |
|
After Width: | Height: | Size: 3.5 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 1.8 KiB |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 8.6 KiB |
|
After Width: | Height: | Size: 887 B |
|
After Width: | Height: | Size: 1.0 KiB |
|
After Width: | Height: | Size: 1.0 KiB |
|
After Width: | Height: | Size: 942 B |
|
After Width: | Height: | Size: 811 B |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 937 B |
|
After Width: | Height: | Size: 1.0 KiB |
|
After Width: | Height: | Size: 1.0 KiB |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 871 B |
|
After Width: | Height: | Size: 5.6 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 = '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>
|
||||
We’ve 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, there’s 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>
|
||||
`,
|
||||
});
|
||||
|
||||