Merge branch 'release' into develop

This commit is contained in:
Sabe Jones
2018-03-20 22:57:52 +00:00
116 changed files with 7726 additions and 7093 deletions

2
package-lock.json generated
View File

@@ -1,6 +1,6 @@
{
"name": "habitica",
"version": "4.31.0",
"version": "4.32.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.31.0",
"version": "4.32.0",
"main": "./website/server/index.js",
"dependencies": {
"@slack/client": "^3.8.1",

View File

@@ -32,4 +32,11 @@ describe('GET /world-state', () => {
},
});
});
it('returns a string representing the current season for NPC sprites', async () => {
const res = await requester().get('/world-state');
expect(res).to.have.nested.property('npcImageSuffix');
expect(res.npcImageSuffix).to.be.a('string');
});
});

View File

@@ -1,78 +1,60 @@
.promo_armoire_background_201803 {
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: 0px -735px;
background-position: -142px -327px;
width: 141px;
height: 441px;
}
.promo_cupid_potions {
.promo_egg_hunt {
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -284px -735px;
width: 138px;
height: 441px;
}
.promo_dysheartener {
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -441px 0px;
width: 730px;
height: 170px;
}
.promo_hippogriff {
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -1172px -587px;
width: 105px;
height: 105px;
background-position: -814px 0px;
width: 354px;
height: 147px;
}
.promo_hugabug_bundle {
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -1172px 0px;
background-position: -583px -408px;
width: 141px;
height: 441px;
}
.promo_mystery_201802 {
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: 0px -327px;
background-position: -441px 0px;
width: 372px;
height: 196px;
}
.promo_rainbow_potions {
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -142px -735px;
background-position: -441px -408px;
width: 141px;
height: 441px;
}
.promo_seasonalshop_broken {
.promo_seasonalshop_spring {
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -751px -171px;
width: 198px;
height: 147px;
background-position: -814px -148px;
width: 162px;
height: 138px;
}
.promo_spring_fling_2018 {
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: 0px -327px;
width: 141px;
height: 588px;
}
.promo_take_this {
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -950px -171px;
background-position: -977px -148px;
width: 114px;
height: 87px;
}
.promo_valentines {
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -441px -171px;
width: 309px;
height: 147px;
}
.scene_achievement {
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: 0px -524px;
background-position: -441px -197px;
width: 339px;
height: 210px;
}
.scene_coding {
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -373px -327px;
width: 150px;
height: 150px;
}
.scene_sweeping {
background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png');
background-position: -1172px -442px;
background-position: -814px -287px;
width: 138px;
height: 144px;
}

View File

@@ -1,12 +1,54 @@
.quest_TEMPLATE_FOR_MISSING_IMAGE {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -251px -1519px;
background-position: -832px -1519px;
width: 221px;
height: 39px;
}
.quest_atom3 {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -211px -1519px;
width: 216px;
height: 180px;
}
.quest_axolotl {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -1320px -660px;
width: 219px;
height: 219px;
}
.quest_badger {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -220px -892px;
width: 219px;
height: 219px;
}
.quest_basilist {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -642px -1519px;
width: 189px;
height: 141px;
}
.quest_beetle {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -1322px -1112px;
width: 204px;
height: 201px;
}
.quest_bunny {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: 0px -1519px;
width: 210px;
height: 186px;
}
.quest_butterfly {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -440px -232px;
width: 219px;
height: 219px;
}
.quest_cheetah {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -440px -672px;
background-position: -660px 0px;
width: 219px;
height: 219px;
}
@@ -18,7 +60,7 @@
}
.quest_dilatory {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: 0px -232px;
background-position: -220px -452px;
width: 219px;
height: 219px;
}
@@ -30,55 +72,55 @@
}
.quest_dilatoryDistress2 {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -1932px -1023px;
background-position: -1757px -573px;
width: 150px;
height: 150px;
}
.quest_dilatoryDistress3 {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -660px 0px;
background-position: -880px 0px;
width: 219px;
height: 219px;
}
.quest_dilatory_derby {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -440px 0px;
background-position: 0px -452px;
width: 219px;
height: 219px;
}
.quest_dustbunnies {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -660px -220px;
background-position: -880px -220px;
width: 219px;
height: 219px;
}
.quest_egg {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -1932px -362px;
background-position: -1757px -214px;
width: 165px;
height: 207px;
}
.quest_evilsanta {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -1932px -1174px;
background-position: -1757px -1026px;
width: 118px;
height: 131px;
}
.quest_evilsanta2 {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -440px -452px;
background-position: -220px -672px;
width: 219px;
height: 219px;
}
.quest_falcon {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -660px -452px;
background-position: -440px -672px;
width: 219px;
height: 219px;
}
.quest_ferret {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -880px 0px;
background-position: -660px -672px;
width: 219px;
height: 219px;
}
@@ -90,19 +132,19 @@
}
.quest_ghost_stag {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -880px -440px;
background-position: -1100px 0px;
width: 219px;
height: 219px;
}
.quest_goldenknight1 {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: 0px -672px;
background-position: -1100px -220px;
width: 219px;
height: 219px;
}
.quest_goldenknight2 {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -1311px -1332px;
background-position: -1345px -1332px;
width: 250px;
height: 150px;
}
@@ -120,13 +162,13 @@
}
.quest_guineapig {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -880px -672px;
background-position: -220px 0px;
width: 219px;
height: 219px;
}
.quest_harpy {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -1100px 0px;
background-position: -440px -892px;
width: 219px;
height: 219px;
}
@@ -138,103 +180,103 @@
}
.quest_hippo {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -1100px -440px;
background-position: -880px -892px;
width: 219px;
height: 219px;
}
.quest_horse {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -1100px -660px;
background-position: -1100px -892px;
width: 219px;
height: 219px;
}
.quest_kraken {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -877px -1332px;
background-position: -443px -1332px;
width: 216px;
height: 177px;
}
.quest_lostMasterclasser1 {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -220px -892px;
background-position: -1320px -220px;
width: 219px;
height: 219px;
}
.quest_lostMasterclasser2 {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -440px -892px;
background-position: -1320px -440px;
width: 219px;
height: 219px;
}
.quest_lostMasterclasser3 {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -660px -892px;
background-position: -1100px -660px;
width: 219px;
height: 219px;
}
.quest_mayhemMistiflying1 {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -1932px -570px;
background-position: -1757px -875px;
width: 150px;
height: 150px;
}
.quest_mayhemMistiflying2 {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -1100px -892px;
background-position: 0px -1112px;
width: 219px;
height: 219px;
}
.quest_mayhemMistiflying3 {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -1320px 0px;
background-position: -220px -1112px;
width: 219px;
height: 219px;
}
.quest_monkey {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -1320px -220px;
background-position: -440px -1112px;
width: 219px;
height: 219px;
}
.quest_moon1 {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -1540px -651px;
background-position: -1540px 0px;
width: 216px;
height: 216px;
}
.quest_moon2 {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -220px 0px;
background-position: -660px -892px;
width: 219px;
height: 219px;
}
.quest_moon3 {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -1320px -880px;
background-position: -880px -672px;
width: 219px;
height: 219px;
}
.quest_moonstone1 {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: 0px -1112px;
background-position: 0px -672px;
width: 219px;
height: 219px;
}
.quest_moonstone2 {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -220px -1112px;
background-position: -440px -452px;
width: 219px;
height: 219px;
}
.quest_moonstone3 {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -440px -1112px;
background-position: -660px -220px;
width: 219px;
height: 219px;
}
.quest_nudibranch {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -1540px -434px;
background-position: -1540px -868px;
width: 216px;
height: 216px;
}
@@ -246,67 +288,67 @@
}
.quest_owl {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -1320px -660px;
background-position: -220px -232px;
width: 219px;
height: 219px;
}
.quest_peacock {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -1540px -217px;
background-position: -1540px -434px;
width: 216px;
height: 216px;
}
.quest_penguin {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -1932px -178px;
background-position: 0px -1706px;
width: 190px;
height: 183px;
}
.quest_pterodactyl {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -1320px -440px;
background-position: 0px -232px;
width: 219px;
height: 219px;
}
.quest_rat {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -880px -892px;
background-position: -660px -1112px;
width: 219px;
height: 219px;
}
.quest_rock {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -1540px -868px;
background-position: -1540px -217px;
width: 216px;
height: 216px;
}
.quest_rooster {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: 0px -1670px;
background-position: -428px -1519px;
width: 213px;
height: 174px;
}
.quest_sabretooth {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: 0px -892px;
background-position: -1320px -880px;
width: 219px;
height: 219px;
}
.quest_sheep {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -1100px -220px;
background-position: -1320px 0px;
width: 219px;
height: 219px;
}
.quest_slime {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -660px -672px;
background-position: 0px -892px;
width: 219px;
height: 219px;
}
.quest_sloth {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -220px -672px;
background-position: -1100px -440px;
width: 219px;
height: 219px;
}
@@ -318,85 +360,49 @@
}
.quest_snake {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -1322px -1112px;
background-position: -877px -1332px;
width: 216px;
height: 177px;
}
.quest_spider {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: 0px -1519px;
background-position: -1094px -1332px;
width: 250px;
height: 150px;
}
.quest_stoikalmCalamity1 {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -1932px -721px;
background-position: -1757px -422px;
width: 150px;
height: 150px;
}
.quest_stoikalmCalamity2 {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -880px -220px;
background-position: -880px -440px;
width: 219px;
height: 219px;
}
.quest_stoikalmCalamity3 {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -220px -452px;
background-position: -660px -452px;
width: 219px;
height: 219px;
}
.quest_taskwoodsTerror1 {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -1932px -872px;
background-position: -1757px -724px;
width: 150px;
height: 150px;
}
.quest_taskwoodsTerror2 {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -1540px 0px;
background-position: -1540px -651px;
width: 216px;
height: 216px;
}
.quest_taskwoodsTerror3 {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: 0px -452px;
width: 219px;
height: 219px;
}
.quest_treeling {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -443px -1332px;
width: 216px;
height: 177px;
}
.quest_trex {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -1932px 0px;
width: 204px;
height: 177px;
}
.quest_trex_undead {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -1094px -1332px;
width: 216px;
height: 177px;
}
.quest_triceratops {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -440px -232px;
width: 219px;
height: 219px;
}
.quest_turtle {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -220px -232px;
width: 219px;
height: 219px;
}
.quest_unicorn {
background-image: url('~assets/images/sprites/spritesmith-main-10.png');
background-position: -660px -1112px;
background-position: -440px 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.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 193 KiB

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 441 KiB

After

Width:  |  Height:  |  Size: 423 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 200 KiB

After

Width:  |  Height:  |  Size: 207 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 155 KiB

After

Width:  |  Height:  |  Size: 157 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 143 KiB

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 142 KiB

After

Width:  |  Height:  |  Size: 137 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: 148 KiB

After

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 158 KiB

After

Width:  |  Height:  |  Size: 160 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 152 KiB

After

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 177 KiB

After

Width:  |  Height:  |  Size: 182 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 163 KiB

After

Width:  |  Height:  |  Size: 160 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 KiB

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 143 KiB

After

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 119 KiB

After

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 169 KiB

After

Width:  |  Height:  |  Size: 158 KiB

View File

@@ -1,9 +1,9 @@
// this variables are used to determine which shop npc/backgrounds should be loaded
// possible values are: normal, fall, habitoween, thanksgiving, winter, nye, birthday, valentines
// possible values are: normal, fall, habitoween, thanksgiving, winter, nye, birthday, valentines, spring
// more to be added on future seasons
$npc_market_flavor: 'normal';
$npc_quests_flavor: 'normal';
$npc_seasonal_flavor: 'normal';
$npc_timetravelers_flavor: 'normal';
$npc_tavern_flavor: 'normal';
$npc_market_flavor: 'spring';
$npc_quests_flavor: 'spring';
$npc_seasonal_flavor: 'spring';
$npc_timetravelers_flavor: 'spring';
$npc_tavern_flavor: 'spring';

View File

@@ -21,7 +21,6 @@
span(:class="member.preferences.size + '_shirt_' + member.preferences.shirt")
span.head_0
span(:class="member.preferences.size + '_' + getGearClass('armor')")
span.head_0
span(:class="getGearClass('back_collar')")
span(:class="getGearClass('body')")
template(v-for="type in ['bangs', 'base', 'mustache', 'beard']")

View File

@@ -42,7 +42,7 @@
:item="item"
)
.purchase-amount
.purchase-amount(v-if='item.value > 0')
.how-many-to-buy(v-if='showAmountToBuy(item)')
strong {{ $t('howManyToBuy') }}
div(v-if='showAmountToBuy(item)')

View File

@@ -467,7 +467,7 @@ export default {
},
async mounted () {
const worldState = await this.$store.dispatch('worldState:getWorldState');
this.broken = worldState.worldBoss.extra.worldDmg.market;
this.broken = worldState && worldState.worldBoss && worldState.worldBoss.extra && worldState.worldBoss.extra.worldDmg && worldState.worldBoss.extra.worldDmg.market;
},
computed: {
...mapState({

View File

@@ -123,7 +123,7 @@ export default {
key: 'keysToBoth',
text: this.$t('keyToBoth'),
notes: this.$t('keyToBothDesc'),
value: 6,
value: 0,
currency: 'gems',
class: 'key_to_both',
locked: false,

View File

@@ -400,7 +400,7 @@ export default {
},
async mounted () {
const worldState = await this.$store.dispatch('worldState:getWorldState');
this.broken = worldState.worldBoss.extra.worldDmg.quests;
this.broken = worldState && worldState.worldBoss && worldState.worldBoss.extra && worldState.worldBoss.extra.worldDmg && worldState.worldBoss.extra.worldDmg.quests;
},
computed: {
...mapState({

View File

@@ -23,8 +23,7 @@
)
.standard-page
div.featuredItems
.background(:class="{opened: seasonal.opened && !broken, broken: broken}")
.background(:class="{cracked: broken, broken: broken}")
.background(:class="{opened: seasonal.opened}")
div.npc
div.featured-label
span.rectangle
@@ -373,7 +372,7 @@
},
async mounted () {
const worldState = await this.$store.dispatch('worldState:getWorldState');
this.broken = worldState.worldBoss.extra.worldDmg.seasonalShop;
this.broken = worldState && worldState.worldBoss && worldState.worldBoss.extra && worldState.worldBoss.extra.worldDmg && worldState.worldBoss.extra.worldDmg.seasonalShop;
},
computed: {
...mapState({

View File

@@ -276,6 +276,15 @@
"weaponSpecialWinter2018HealerText": "Mistletoe Wand",
"weaponSpecialWinter2018HealerNotes": "This mistletoe ball is sure to enchant and delight passersby! Increases Intelligence by <%= int %>. Limited Edition 2017-2018 Winter Gear.",
"weaponSpecialSpring2018RogueText": "Buoyant Bullrush",
"weaponSpecialSpring2018RogueNotes": "What might appear to be cute cattails are actually quite effective weapons in the right wings. Increases Strength by <%= str %>. Limited Edition 2018 Spring Gear.",
"weaponSpecialSpring2018WarriorText": "Axe of Daybreak",
"weaponSpecialSpring2018WarriorNotes": "Made of bright gold, this axe is mighty enough to attack the reddest task! Increases Strength by <%= str %>. Limited Edition 2018 Spring Gear.",
"weaponSpecialSpring2018MageText": "Tulip Stave",
"weaponSpecialSpring2018MageNotes": "This magic flower never wilts! Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition 2018 Spring Gear.",
"weaponSpecialSpring2018HealerText": "Garnet Rod",
"weaponSpecialSpring2018HealerNotes": "The stones in this staff will focus your power when you cast healing spells! Increases Intelligence by <%= int %>. Limited Edition 2018 Spring Gear.",
"weaponMystery201411Text": "Pitchfork of Feasting",
"weaponMystery201411Notes": "Stab your enemies or dig in to your favorite foods - this versatile pitchfork does it all! Confers no benefit. November 2014 Subscriber Item.",
"weaponMystery201502Text": "Shimmery Winged Staff of Love and Also Truth",
@@ -605,6 +614,15 @@
"armorSpecialWinter2018HealerText": "Mistletoe Robes",
"armorSpecialWinter2018HealerNotes": "These robes are woven with spells for extra holiday joy. Increases Constitution by <%= con %>. Limited Edition 2017-2018 Winter Gear.",
"armorSpecialSpring2018RogueText": "Feather Suit",
"armorSpecialSpring2018RogueNotes": "This fluffy yellow costume will trick your enemies into thinking you're just a harmless ducky! Increases Perception by <%= per %>. Limited Edition 2018 Spring Gear.",
"armorSpecialSpring2018WarriorText": "Armor of Dawn",
"armorSpecialSpring2018WarriorNotes": "This colorful plate is forged with the sunrise's fire. Increases Constitution by <%= con %>. Limited Edition 2018 Spring Gear.",
"armorSpecialSpring2018MageText": "Tulip Robe",
"armorSpecialSpring2018MageNotes": "Your spell casting can only improve while clad in these soft, silky petals. Increases Intelligence by <%= int %>. Limited Edition 2018 Spring Gear.",
"armorSpecialSpring2018HealerText": "Garnet Armor",
"armorSpecialSpring2018HealerNotes": "Let this bright armor infuse your heart with power for healing. Increases Constitution by <%= con %>. Limited Edition 2018 Spring Gear.",
"armorMystery201402Text": "Messenger Robes",
"armorMystery201402Notes": "Shimmering and strong, these robes have many pockets to carry letters. Confers no benefit. February 2014 Subscriber Item.",
"armorMystery201403Text": "Forest Walker Armor",
@@ -1005,6 +1023,15 @@
"headSpecialWinter2018HealerText": "Mistletoe Hood",
"headSpecialWinter2018HealerNotes": "This fancy hood will keep you warm with happy holiday feelings! Increases Intelligence by <%= int %>. Limited Edition 2017-2018 Winter Gear.",
"headSpecialSpring2018RogueText": "Duck-Billed Helm",
"headSpecialSpring2018RogueNotes": "Quack quack! Your cuteness belies your clever and sneaky nature. Increases Perception by <%= per %>. Limited Edition 2018 Spring Gear.",
"headSpecialSpring2018WarriorText": "Helm of Rays",
"headSpecialSpring2018WarriorNotes": "The brightness of this helm will dazzle any enemies nearby! Increases Strength by <%= str %>. Limited Edition 2018 Spring Gear.",
"headSpecialSpring2018MageText": "Tulip Helm",
"headSpecialSpring2018MageNotes": "The fancy petals of this helm will grant you special springtime magic. Increases Perception by <%= per %>. Limited Edition 2018 Spring Gear.",
"headSpecialSpring2018HealerText": "Garnet Circlet",
"headSpecialSpring2018HealerNotes": "The polished gems of this circlet will enhance your mental energy. Increases Intelligence by <%= int %>. Limited Edition 2018 Spring Gear.",
"headSpecialGaymerxText": "Rainbow Warrior Helm",
"headSpecialGaymerxNotes": "In celebration of the GaymerX Conference, this special helmet is decorated with a radiant, colorful rainbow pattern! GaymerX is a game convention celebrating LGTBQ and gaming and is open to everyone.",
@@ -1334,6 +1361,11 @@
"shieldSpecialWinter2018HealerText": "Mistletoe Bell",
"shieldSpecialWinter2018HealerNotes": "What's that sound? The sound of warmth and cheer for all to hear! Increases Constitution by <%= con %>. Limited Edition 2017-2018 Winter Gear.",
"shieldSpecialSpring2018WarriorText": "Shield of the Morning",
"shieldSpecialSpring2018WarriorNotes": "This sturdy shield glows with the glory of first light. Increases Constitution by <%= con %>. Limited Edition 2018 Spring Gear.",
"shieldSpecialSpring2018HealerText": "Garnet Shield",
"shieldSpecialSpring2018HealerNotes": "Despite its fancy appearance, this garnet shield is quite durable! Increases Constitution by <%= con %>. Limited Edition 2018 Spring Gear.",
"shieldMystery201601Text": "Resolution Slayer",
"shieldMystery201601Notes": "This blade can be used to parry away all distractions. Confers no benefit. January 2016 Subscriber Item.",
"shieldMystery201701Text": "Time-Freezer Shield",

View File

@@ -29,10 +29,10 @@
"seasonalShopClosedTitle": "<%= linkStart %>Leslie<%= linkEnd %>",
"seasonalShopTitle": "<%= linkStart %>Seasonal Sorceress<%= linkEnd %>",
"seasonalShopClosedText": "The Seasonal Shop is currently closed!! Its only open during Habiticas four Grand Galas.",
"seasonalShopText": "Happy Spring Fling!! Would you like to buy some rare items? Theyll only be available until April 30th!",
"seasonalShopSummerText": "Happy Summer Splash!! Would you like to buy some rare items? Theyll only be available until July 31st!",
"seasonalShopFallText": "Happy Fall Festival!! Would you like to buy some rare items? Theyll only be available until October 31st!",
"seasonalShopWinterText": "Happy Winter Wonderland!! Would you like to buy some rare items? Theyll only be available until January 31st!",
"seasonalShopSpringText": "Happy Spring Fling!! Would you like to buy some rare items? Theyll only be available until April 30th!",
"seasonalShopFallTextBroken": "Oh.... Welcome to the Seasonal Shop... We're stocking autumn Seasonal Edition goodies, or something... Everything here will be available to purchase during the Fall Festival event each year, but we're only open until October 31... I guess you should to stock up now, or you'll have to wait... and wait... and wait... <strong>*sigh*</strong>",
"seasonalShopBrokenText": "My pavilion!!!!!!! My decorations!!!! Oh, the Dysheartener's destroyed everything :( Please help defeat it in the Tavern so I can rebuild!",
"seasonalShopRebirth": "If you bought any of this equipment in the past but don't currently own it, you can repurchase it in the Rewards Column. Initially, you'll only be able to purchase the items for your current class (Warrior by default), but fear not, the other class-specific items will become available if you switch to that class.",
@@ -117,6 +117,10 @@
"winter2018GiftWrappedSet": "Gift-Wrapped Warrior (Warrior)",
"winter2018MistletoeSet": "Mistletoe Healer (Healer)",
"winter2018ReindeerSet": "Reindeer Rogue (Rogue)",
"spring2018SunriseWarriorSet": "Sunrise Warrior (Warrior)",
"spring2018TulipMageSet": "Tulip Mage (Mage)",
"spring2018GarnetHealerSet": "Garnet Healer (Healer)",
"spring2018DucklingRogueSet": "Duckling Rogue (Rogue)",
"eventAvailability": "Available for purchase until <%= date(locale) %>.",
"dateEndMarch": "March 31",
"dateEndApril": "April 19",

View File

@@ -31,6 +31,7 @@ export const EVENTS = {
summer2017: { start: '2017-06-20', end: '2017-08-02' },
fall2017: { start: '2017-09-21', end: '2017-11-02' },
winter2018: { start: '2017-12-19', end: '2018-02-02' },
spring2018: { start: '2018-03-20', end: '2018-05-02' },
};
export const SEASONAL_SETS = {
@@ -65,6 +66,37 @@ export const SEASONAL_SETS = {
'winter2018MistletoeSet',
'winter2018ReindeerSet',
],
spring: [
// spring 2014
'mightyBunnySet',
'magicMouseSet',
'lovingPupSet',
'stealthyKittySet',
// spring 2015
'bewareDogSet',
'magicianBunnySet',
'comfortingKittySet',
'sneakySqueakerSet',
// spring 2016
'springingBunnySet',
'grandMalkinSet',
'cleverDogSet',
'braveMouseSet',
// spring 2017
'spring2017FelineWarriorSet',
'spring2017CanineConjurorSet',
'spring2017FloralMouseSet',
'spring2017SneakyBunnySet',
// spring 2018
'spring2018TulipMageSet',
'spring2018SunriseWarriorSet',
'spring2018DucklingRogueSet',
'spring2018GarnetHealerSet',
],
};
export const GEAR_TYPES = [

View File

@@ -8,7 +8,7 @@ import takeThisGear from './special-takeThis';
import wonderconGear from './special-wondercon';
import t from '../../../translation';
const CURRENT_SEASON = 'winter';
const CURRENT_SEASON = 'spring';
let armor = {
0: backerGear.armorSpecial0,
@@ -167,6 +167,9 @@ let armor = {
notes: t('armorSpecialSpringRogueNotes', { per: 15 }),
value: 90,
per: 15,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
springWarrior: {
event: EVENTS.spring,
@@ -176,6 +179,9 @@ let armor = {
notes: t('armorSpecialSpringWarriorNotes', { con: 9 }),
value: 90,
con: 9,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
springMage: {
event: EVENTS.spring,
@@ -185,6 +191,9 @@ let armor = {
notes: t('armorSpecialSpringMageNotes', { int: 9 }),
value: 90,
int: 9,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
springHealer: {
event: EVENTS.spring,
@@ -194,6 +203,9 @@ let armor = {
notes: t('armorSpecialSpringHealerNotes', { con: 15 }),
value: 90,
con: 15,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
summerRogue: {
event: EVENTS.summer,
@@ -353,6 +365,9 @@ let armor = {
notes: t('armorSpecialSpring2015RogueNotes', { per: 15 }),
value: 90,
per: 15,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
spring2015Warrior: {
event: EVENTS.spring2015,
@@ -362,6 +377,9 @@ let armor = {
notes: t('armorSpecialSpring2015WarriorNotes', { con: 9 }),
value: 90,
con: 9,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
spring2015Mage: {
event: EVENTS.spring2015,
@@ -371,6 +389,9 @@ let armor = {
notes: t('armorSpecialSpring2015MageNotes', { int: 9 }),
value: 90,
int: 9,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
spring2015Healer: {
event: EVENTS.spring2015,
@@ -380,6 +401,9 @@ let armor = {
notes: t('armorSpecialSpring2015HealerNotes', { con: 15 }),
value: 90,
con: 15,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
summer2015Rogue: {
event: EVENTS.summer2015,
@@ -545,6 +569,9 @@ let armor = {
notes: t('armorSpecialSpring2016RogueNotes', { per: 15 }),
value: 90,
per: 15,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
spring2016Warrior: {
event: EVENTS.spring2016,
@@ -554,6 +581,9 @@ let armor = {
notes: t('armorSpecialSpring2016WarriorNotes', { con: 9 }),
value: 90,
con: 9,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
spring2016Mage: {
event: EVENTS.spring2016,
@@ -563,6 +593,9 @@ let armor = {
notes: t('armorSpecialSpring2016MageNotes', { int: 9 }),
value: 90,
int: 9,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
spring2016Healer: {
event: EVENTS.spring2016,
@@ -572,6 +605,9 @@ let armor = {
notes: t('armorSpecialSpring2016HealerNotes', { con: 15 }),
value: 90,
con: 15,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
summer2016Rogue: {
event: EVENTS.summer2016,
@@ -731,6 +767,9 @@ let armor = {
notes: t('armorSpecialSpring2017RogueNotes', { per: 15 }),
value: 90,
per: 15,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
spring2017Warrior: {
event: EVENTS.spring2017,
@@ -740,6 +779,9 @@ let armor = {
notes: t('armorSpecialSpring2017WarriorNotes', { con: 9 }),
value: 90,
con: 9,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
spring2017Mage: {
event: EVENTS.spring2017,
@@ -749,6 +791,9 @@ let armor = {
notes: t('armorSpecialSpring2017MageNotes', { int: 9 }),
value: 90,
int: 9,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
spring2017Healer: {
event: EVENTS.spring2017,
@@ -758,6 +803,9 @@ let armor = {
notes: t('armorSpecialSpring2017HealerNotes', { con: 15 }),
value: 90,
con: 15,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
summer2017Rogue: {
event: EVENTS.summer2017,
@@ -873,6 +921,42 @@ let armor = {
value: 0,
canOwn: ownsItem('armor_special_birthday2018'),
},
spring2018Rogue: {
event: EVENTS.spring2018,
specialClass: 'rogue',
set: 'spring2018DucklingRogueSet',
text: t('armorSpecialSpring2018RogueText'),
notes: t('armorSpecialSpring2018RogueNotes', { per: 15 }),
value: 90,
per: 15,
},
spring2018Warrior: {
event: EVENTS.spring2018,
specialClass: 'warrior',
set: 'spring2018SunriseWarriorSet',
text: t('armorSpecialSpring2018WarriorText'),
notes: t('armorSpecialSpring2018WarriorNotes', { con: 9 }),
value: 90,
con: 9,
},
spring2018Mage: {
event: EVENTS.spring2018,
specialClass: 'wizard',
set: 'spring2018TulipMageSet',
text: t('armorSpecialSpring2018MageText'),
notes: t('armorSpecialSpring2018MageNotes', { int: 9 }),
value: 90,
int: 9,
},
spring2018Healer: {
event: EVENTS.spring2018,
specialClass: 'healer',
set: 'spring2018GarnetHealerSet',
text: t('armorSpecialSpring2018HealerText'),
notes: t('armorSpecialSpring2018HealerNotes', { con: 15 }),
value: 90,
con: 15,
},
};
let back = {
@@ -1222,6 +1306,9 @@ let head = {
notes: t('headSpecialSpringRogueNotes', { per: 9 }),
value: 60,
per: 9,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
springWarrior: {
event: EVENTS.spring,
@@ -1231,6 +1318,9 @@ let head = {
notes: t('headSpecialSpringWarriorNotes', { str: 9 }),
value: 60,
str: 9,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
springMage: {
event: EVENTS.spring,
@@ -1240,6 +1330,9 @@ let head = {
notes: t('headSpecialSpringMageNotes', { per: 7 }),
value: 60,
per: 7,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
springHealer: {
event: EVENTS.spring,
@@ -1249,6 +1342,9 @@ let head = {
notes: t('headSpecialSpringHealerNotes', { int: 7 }),
value: 60,
int: 7,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
summerRogue: {
event: EVENTS.summer,
@@ -1408,6 +1504,9 @@ let head = {
notes: t('headSpecialSpring2015RogueNotes', { per: 9 }),
value: 60,
per: 9,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
spring2015Warrior: {
event: EVENTS.spring2015,
@@ -1417,6 +1516,9 @@ let head = {
notes: t('headSpecialSpring2015WarriorNotes', { str: 9 }),
value: 60,
str: 9,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
spring2015Mage: {
event: EVENTS.spring2015,
@@ -1426,6 +1528,9 @@ let head = {
notes: t('headSpecialSpring2015MageNotes', { per: 7 }),
value: 60,
per: 7,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
spring2015Healer: {
event: EVENTS.spring2015,
@@ -1435,6 +1540,9 @@ let head = {
notes: t('headSpecialSpring2015HealerNotes', { int: 7 }),
value: 60,
int: 7,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
summer2015Rogue: {
event: EVENTS.summer2015,
@@ -1600,6 +1708,9 @@ let head = {
notes: t('headSpecialSpring2016RogueNotes', { per: 9 }),
value: 60,
per: 9,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
spring2016Warrior: {
event: EVENTS.spring2016,
@@ -1609,6 +1720,9 @@ let head = {
notes: t('headSpecialSpring2016WarriorNotes', { str: 9 }),
value: 60,
str: 9,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
spring2016Mage: {
event: EVENTS.spring2016,
@@ -1618,6 +1732,9 @@ let head = {
notes: t('headSpecialSpring2016MageNotes', { per: 7 }),
value: 60,
per: 7,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
spring2016Healer: {
event: EVENTS.spring2016,
@@ -1627,6 +1744,9 @@ let head = {
notes: t('headSpecialSpring2016HealerNotes', { int: 7 }),
value: 60,
int: 7,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
summer2016Rogue: {
event: EVENTS.summer2016,
@@ -1786,6 +1906,9 @@ let head = {
notes: t('headSpecialSpring2017RogueNotes', { per: 9 }),
value: 60,
per: 9,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
spring2017Warrior: {
event: EVENTS.spring2017,
@@ -1795,6 +1918,9 @@ let head = {
notes: t('headSpecialSpring2017WarriorNotes', { str: 9 }),
value: 60,
str: 9,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
spring2017Mage: {
event: EVENTS.spring2017,
@@ -1804,6 +1930,9 @@ let head = {
notes: t('headSpecialSpring2017MageNotes', { per: 7 }),
value: 60,
per: 7,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
spring2017Healer: {
event: EVENTS.spring2017,
@@ -1813,6 +1942,9 @@ let head = {
notes: t('headSpecialSpring2017HealerNotes', { int: 7 }),
value: 60,
int: 7,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
summer2017Rogue: {
event: EVENTS.summer2017,
@@ -1934,6 +2066,42 @@ let head = {
value: 60,
int: 7,
},
spring2018Rogue: {
event: EVENTS.spring2018,
specialClass: 'rogue',
set: 'spring2018DucklingRogueSet',
text: t('headSpecialSpring2018RogueText'),
notes: t('headSpecialSpring2018RogueNotes', { per: 9 }),
value: 60,
per: 9,
},
spring2018Warrior: {
event: EVENTS.spring2018,
specialClass: 'warrior',
set: 'spring2018SunriseWarriorSet',
text: t('headSpecialSpring2018WarriorText'),
notes: t('headSpecialSpring2018WarriorNotes', { str: 9 }),
value: 60,
str: 9,
},
spring2018Mage: {
event: EVENTS.spring2018,
specialClass: 'wizard',
set: 'spring2018TulipMageSet',
text: t('headSpecialSpring2018MageText'),
notes: t('headSpecialSpring2018MageNotes', { per: 7 }),
value: 60,
per: 7,
},
spring2018Healer: {
event: EVENTS.spring2018,
specialClass: 'healer',
set: 'spring2018GarnetHealerSet',
text: t('headSpecialSpring2018HealerText'),
notes: t('headSpecialSpring2018HealerNotes', { int: 7 }),
value: 60,
int: 7,
},
};
let headAccessory = {
@@ -1944,6 +2112,9 @@ let headAccessory = {
text: t('headAccessorySpecialSpringRogueText'),
notes: t('headAccessorySpecialSpringRogueNotes'),
value: 20,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
springWarrior: {
event: EVENTS.spring,
@@ -1952,6 +2123,9 @@ let headAccessory = {
text: t('headAccessorySpecialSpringWarriorText'),
notes: t('headAccessorySpecialSpringWarriorNotes'),
value: 20,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
springMage: {
event: EVENTS.spring,
@@ -1960,6 +2134,9 @@ let headAccessory = {
text: t('headAccessorySpecialSpringMageText'),
notes: t('headAccessorySpecialSpringMageNotes'),
value: 20,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
springHealer: {
event: EVENTS.spring,
@@ -1968,6 +2145,9 @@ let headAccessory = {
text: t('headAccessorySpecialSpringHealerText'),
notes: t('headAccessorySpecialSpringHealerNotes'),
value: 20,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
spring2015Rogue: {
event: EVENTS.spring2015,
@@ -1976,6 +2156,9 @@ let headAccessory = {
text: t('headAccessorySpecialSpring2015RogueText'),
notes: t('headAccessorySpecialSpring2015RogueNotes'),
value: 20,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
spring2015Warrior: {
event: EVENTS.spring2015,
@@ -1984,6 +2167,9 @@ let headAccessory = {
text: t('headAccessorySpecialSpring2015WarriorText'),
notes: t('headAccessorySpecialSpring2015WarriorNotes'),
value: 20,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
spring2015Mage: {
event: EVENTS.spring2015,
@@ -1992,6 +2178,9 @@ let headAccessory = {
text: t('headAccessorySpecialSpring2015MageText'),
notes: t('headAccessorySpecialSpring2015MageNotes'),
value: 20,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
spring2015Healer: {
event: EVENTS.spring2015,
@@ -2000,6 +2189,9 @@ let headAccessory = {
text: t('headAccessorySpecialSpring2015HealerText'),
notes: t('headAccessorySpecialSpring2015HealerNotes'),
value: 20,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
bearEars: {
gearSet: 'animal',
@@ -2088,6 +2280,9 @@ let headAccessory = {
text: t('headAccessorySpecialSpring2016RogueText'),
notes: t('headAccessorySpecialSpring2016RogueNotes'),
value: 20,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
spring2016Warrior: {
event: EVENTS.spring2016,
@@ -2096,6 +2291,9 @@ let headAccessory = {
text: t('headAccessorySpecialSpring2016WarriorText'),
notes: t('headAccessorySpecialSpring2016WarriorNotes'),
value: 20,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
spring2016Mage: {
event: EVENTS.spring2016,
@@ -2104,6 +2302,9 @@ let headAccessory = {
text: t('headAccessorySpecialSpring2016MageText'),
notes: t('headAccessorySpecialSpring2016MageNotes'),
value: 20,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
spring2016Healer: {
event: EVENTS.spring2016,
@@ -2112,6 +2313,9 @@ let headAccessory = {
text: t('headAccessorySpecialSpring2016HealerText'),
notes: t('headAccessorySpecialSpring2016HealerNotes'),
value: 20,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
spring2017Rogue: {
event: EVENTS.spring2017,
@@ -2120,6 +2324,9 @@ let headAccessory = {
text: t('headAccessorySpecialSpring2017RogueText'),
notes: t('headAccessorySpecialSpring2017RogueNotes'),
value: 20,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
spring2017Warrior: {
event: EVENTS.spring2017,
@@ -2128,6 +2335,9 @@ let headAccessory = {
text: t('headAccessorySpecialSpring2017WarriorText'),
notes: t('headAccessorySpecialSpring2017WarriorNotes'),
value: 20,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
spring2017Mage: {
event: EVENTS.spring2017,
@@ -2136,6 +2346,9 @@ let headAccessory = {
text: t('headAccessorySpecialSpring2017MageText'),
notes: t('headAccessorySpecialSpring2017MageNotes'),
value: 20,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
spring2017Healer: {
event: EVENTS.spring2017,
@@ -2144,6 +2357,9 @@ let headAccessory = {
text: t('headAccessorySpecialSpring2017HealerText'),
notes: t('headAccessorySpecialSpring2017HealerNotes'),
value: 20,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
};
@@ -2252,6 +2468,9 @@ let shield = {
notes: t('shieldSpecialSpringRogueNotes', { str: 8 }),
value: 80,
str: 8,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
springWarrior: {
event: EVENTS.spring,
@@ -2261,6 +2480,9 @@ let shield = {
notes: t('shieldSpecialSpringWarriorNotes', { con: 7 }),
value: 70,
con: 7,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
springHealer: {
event: EVENTS.spring,
@@ -2270,6 +2492,9 @@ let shield = {
notes: t('shieldSpecialSpringHealerNotes', { con: 9 }),
value: 70,
con: 9,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
summerRogue: {
event: EVENTS.summer,
@@ -2387,6 +2612,9 @@ let shield = {
notes: t('shieldSpecialSpring2015RogueNotes', { str: 8 }),
value: 80,
str: 8,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
spring2015Warrior: {
event: EVENTS.spring2015,
@@ -2396,6 +2624,9 @@ let shield = {
notes: t('shieldSpecialSpring2015WarriorNotes', { con: 7 }),
value: 70,
con: 7,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
spring2015Healer: {
event: EVENTS.spring2015,
@@ -2405,6 +2636,9 @@ let shield = {
notes: t('shieldSpecialSpring2015HealerNotes', { con: 9 }),
value: 70,
con: 9,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
summer2015Rogue: {
event: EVENTS.summer2015,
@@ -2522,6 +2756,9 @@ let shield = {
notes: t('shieldSpecialSpring2016RogueNotes', { str: 8 }),
value: 80,
str: 8,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
spring2016Warrior: {
event: EVENTS.spring2016,
@@ -2531,6 +2768,9 @@ let shield = {
notes: t('shieldSpecialSpring2016WarriorNotes', { con: 7 }),
value: 70,
con: 7,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
spring2016Healer: {
event: EVENTS.spring2016,
@@ -2540,6 +2780,9 @@ let shield = {
notes: t('shieldSpecialSpring2016HealerNotes', { con: 9 }),
value: 70,
con: 9,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
summer2016Rogue: {
event: EVENTS.summer2016,
@@ -2657,6 +2900,9 @@ let shield = {
notes: t('shieldSpecialSpring2017RogueNotes', { str: 8 }),
value: 80,
str: 8,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
spring2017Warrior: {
event: EVENTS.spring2017,
@@ -2666,6 +2912,9 @@ let shield = {
notes: t('shieldSpecialSpring2017WarriorNotes', { con: 7 }),
value: 70,
con: 7,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
spring2017Healer: {
event: EVENTS.spring2017,
@@ -2675,6 +2924,9 @@ let shield = {
notes: t('shieldSpecialSpring2017HealerNotes', { con: 9 }),
value: 70,
con: 9,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
summer2017Rogue: {
event: EVENTS.summer2017,
@@ -2757,6 +3009,33 @@ let shield = {
value: 70,
con: 9,
},
spring2018Rogue: {
event: EVENTS.spring2018,
specialClass: 'rogue',
set: 'spring2018DucklingRogueSet',
text: t('weaponSpecialSpring2018RogueText'),
notes: t('weaponSpecialSpring2018RogueNotes', { str: 8 }),
value: 80,
str: 8,
},
spring2018Warrior: {
event: EVENTS.spring2018,
specialClass: 'warrior',
set: 'spring2018SunriseWarriorSet',
text: t('shieldSpecialSpring2018WarriorText'),
notes: t('shieldSpecialSpring2018WarriorNotes', { con: 7 }),
value: 70,
con: 7,
},
spring2018Healer: {
event: EVENTS.spring2018,
specialClass: 'healer',
set: 'spring2018GarnetHealerSet',
text: t('shieldSpecialSpring2018HealerText'),
notes: t('shieldSpecialSpring2018HealerNotes', { con: 9 }),
value: 70,
con: 9,
},
};
let weapon = {
@@ -2918,6 +3197,9 @@ let weapon = {
notes: t('weaponSpecialSpringRogueNotes', { str: 8 }),
value: 80,
str: 8,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
springWarrior: {
event: EVENTS.spring,
@@ -2927,6 +3209,9 @@ let weapon = {
notes: t('weaponSpecialSpringWarriorNotes', { str: 15 }),
value: 90,
str: 15,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
springMage: {
event: EVENTS.spring,
@@ -2938,6 +3223,9 @@ let weapon = {
value: 160,
int: 15,
per: 7,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
springHealer: {
event: EVENTS.spring,
@@ -2947,6 +3235,9 @@ let weapon = {
notes: t('weaponSpecialSpringHealerNotes', { int: 9 }),
value: 90,
int: 9,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
summerRogue: {
event: EVENTS.summer,
@@ -3106,6 +3397,9 @@ let weapon = {
notes: t('weaponSpecialSpring2015RogueNotes', { str: 8 }),
value: 80,
str: 8,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
spring2015Warrior: {
event: EVENTS.spring2015,
@@ -3115,6 +3409,9 @@ let weapon = {
notes: t('weaponSpecialSpring2015WarriorNotes', { str: 15 }),
value: 90,
str: 15,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
spring2015Mage: {
event: EVENTS.spring2015,
@@ -3126,6 +3423,9 @@ let weapon = {
value: 160,
int: 15,
per: 7,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
spring2015Healer: {
event: EVENTS.spring2015,
@@ -3135,6 +3435,9 @@ let weapon = {
notes: t('weaponSpecialSpring2015HealerNotes', { int: 9 }),
value: 90,
int: 9,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
summer2015Rogue: {
event: EVENTS.summer2015,
@@ -3294,6 +3597,9 @@ let weapon = {
notes: t('weaponSpecialSpring2016RogueNotes', { str: 8 }),
value: 80,
str: 8,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
spring2016Warrior: {
event: EVENTS.spring2016,
@@ -3303,6 +3609,9 @@ let weapon = {
notes: t('weaponSpecialSpring2016WarriorNotes', { str: 15 }),
value: 90,
str: 15,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
spring2016Mage: {
event: EVENTS.spring2016,
@@ -3314,6 +3623,9 @@ let weapon = {
value: 160,
int: 15,
per: 7,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
spring2016Healer: {
event: EVENTS.spring2016,
@@ -3323,6 +3635,9 @@ let weapon = {
notes: t('weaponSpecialSpring2016HealerNotes', { int: 9 }),
value: 90,
int: 9,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
summer2016Rogue: {
event: EVENTS.summer2016,
@@ -3482,6 +3797,9 @@ let weapon = {
notes: t('weaponSpecialSpring2017RogueNotes', { str: 8 }),
value: 80,
str: 8,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
spring2017Warrior: {
event: EVENTS.spring2017,
@@ -3491,6 +3809,9 @@ let weapon = {
notes: t('weaponSpecialSpring2017WarriorNotes', { str: 15 }),
value: 90,
str: 15,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
spring2017Mage: {
event: EVENTS.spring2017,
@@ -3502,6 +3823,9 @@ let weapon = {
value: 160,
int: 15,
per: 7,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
spring2017Healer: {
event: EVENTS.spring2017,
@@ -3511,6 +3835,9 @@ let weapon = {
notes: t('weaponSpecialSpring2017HealerNotes', { int: 9 }),
value: 90,
int: 9,
canBuy: () => {
return CURRENT_SEASON === 'spring';
},
},
summer2017Rogue: {
event: EVENTS.summer2017,
@@ -3626,6 +3953,44 @@ let weapon = {
value: 90,
int: 9,
},
spring2018Rogue: {
event: EVENTS.spring2018,
specialClass: 'rogue',
set: 'spring2018DucklingRogueSet',
text: t('weaponSpecialSpring2018RogueText'),
notes: t('weaponSpecialSpring2018RogueNotes', { str: 8 }),
value: 80,
str: 8,
},
spring2018Warrior: {
event: EVENTS.spring2018,
specialClass: 'warrior',
set: 'spring2018SunriseWarriorSet',
text: t('weaponSpecialSpring2018WarriorText'),
notes: t('weaponSpecialSpring2018WarriorNotes', { str: 15 }),
value: 90,
str: 15,
},
spring2018Mage: {
event: EVENTS.spring2018,
specialClass: 'wizard',
set: 'spring2018TulipMageSet',
twoHanded: true,
text: t('weaponSpecialSpring2018MageText'),
notes: t('weaponSpecialSpring2018MageNotes', { int: 15, per: 7 }),
value: 160,
int: 15,
per: 7,
},
spring2018Healer: {
event: EVENTS.spring2018,
specialClass: 'healer',
set: 'spring2018GarnetHealerSet',
text: t('weaponSpecialSpring2018HealerText'),
notes: t('weaponSpecialSpring2018HealerNotes', { int: 9 }),
value: 90,
int: 9,
},
};
let specialSet = {

View File

@@ -511,7 +511,7 @@ let quests = {
value: 1,
category: 'pet',
canBuy () {
return false;
return true;
},
collect: {
plainEgg: {

View File

@@ -24,18 +24,18 @@ const featuredItems = {
},
{
type: 'quests',
path: 'quests.stoikalmCalamity1',
path: 'quests.taskwoodsTerror1',
},
{
type: 'quests',
path: 'quests.badger',
path: 'quests.egg',
},
{
type: 'bundles',
path: 'bundles.hugabug',
},
],
seasonal: 'summerMage',
seasonal: 'springHealer',
timeTravelers: [
// TODO
],

View File

@@ -1,16 +1,21 @@
// import { SEASONAL_SETS } from '../content/constants';
import { SEASONAL_SETS } from '../content/constants';
module.exports = {
opened: false,
opened: true,
currentSeason: 'Closed',
currentSeason: 'Spring',
dateRange: { start: '2017-12-19', end: '2018-01-31' },
dateRange: { start: '2018-03-20', end: '2018-04-30' },
availableSets: [
...SEASONAL_SETS.spring,
],
pinnedSets: {
wizard: 'spring2018TulipMageSet',
warrior: 'spring2018SunriseWarriorSet',
rogue: 'spring2018DucklingRogueSet',
healer: 'spring2018GarnetHealerSet',
},
availableSpells: [
@@ -19,5 +24,5 @@ module.exports = {
availableQuests: [
],
featuredSet: 'yetiSet',
featuredSet: 'comfortingKittySet',
};

View File

@@ -10,8 +10,8 @@ import pick from 'lodash/pick';
module.exports = function releaseBoth (user, req = {}, analytics) {
let animal;
if (user.balance < 1.5 && !user.achievements.triadBingo) {
throw new NotAuthorized(i18n.t('notEnoughGems', req.language));
if (!user.achievements.triadBingo) {
throw new NotAuthorized(i18n.t('notEnoughPetsMounts', req.language));
}
if (beastMasterProgress(user.items.pets) !== 90 || mountMasterProgress(user.items.mounts) !== 90) {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 839 B

After

Width:  |  Height:  |  Size: 838 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 804 B

After

Width:  |  Height:  |  Size: 805 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 726 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 941 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 542 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 515 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 705 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 661 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 568 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 943 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 481 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 388 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 512 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 667 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 626 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 489 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 459 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 658 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 549 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 505 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 645 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 438 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 348 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 457 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 643 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 563 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 349 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 510 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 683 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 956 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 515 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 542 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 714 B

Some files were not shown because too many files have changed in this diff Show More