feat(event): Spring Fling 2018

This commit is contained in:
SabreCat
2018-03-20 21:30:43 +00:00
parent 67e750a81c
commit a84ea8b1b7
78 changed files with 492 additions and 44 deletions

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');
}); });
}});

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

View File

@@ -1,9 +1,9 @@
// this variables are used to determine which shop npc/backgrounds should be loaded // 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 // more to be added on future seasons
$npc_market_flavor: 'normal'; $npc_market_flavor: 'spring';
$npc_quests_flavor: 'normal'; $npc_quests_flavor: 'spring';
$npc_seasonal_flavor: 'normal'; $npc_seasonal_flavor: 'spring';
$npc_timetravelers_flavor: 'normal'; $npc_timetravelers_flavor: 'spring';
$npc_tavern_flavor: 'normal'; $npc_tavern_flavor: 'spring';

View File

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

View File

@@ -467,7 +467,7 @@ export default {
}, },
async mounted () { async mounted () {
const worldState = await this.$store.dispatch('worldState:getWorldState'); 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: { computed: {
...mapState({ ...mapState({

View File

@@ -400,7 +400,7 @@ export default {
}, },
async mounted () { async mounted () {
const worldState = await this.$store.dispatch('worldState:getWorldState'); 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: { computed: {
...mapState({ ...mapState({

View File

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

View File

@@ -276,6 +276,15 @@
"weaponSpecialWinter2018HealerText": "Mistletoe Wand", "weaponSpecialWinter2018HealerText": "Mistletoe Wand",
"weaponSpecialWinter2018HealerNotes": "This mistletoe ball is sure to enchant and delight passersby! Increases Intelligence by <%= int %>. Limited Edition 2017-2018 Winter Gear.", "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", "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.", "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", "weaponMystery201502Text": "Shimmery Winged Staff of Love and Also Truth",
@@ -605,6 +614,15 @@
"armorSpecialWinter2018HealerText": "Mistletoe Robes", "armorSpecialWinter2018HealerText": "Mistletoe Robes",
"armorSpecialWinter2018HealerNotes": "These robes are woven with spells for extra holiday joy. Increases Constitution by <%= con %>. Limited Edition 2017-2018 Winter Gear.", "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", "armorMystery201402Text": "Messenger Robes",
"armorMystery201402Notes": "Shimmering and strong, these robes have many pockets to carry letters. Confers no benefit. February 2014 Subscriber Item.", "armorMystery201402Notes": "Shimmering and strong, these robes have many pockets to carry letters. Confers no benefit. February 2014 Subscriber Item.",
"armorMystery201403Text": "Forest Walker Armor", "armorMystery201403Text": "Forest Walker Armor",
@@ -1005,6 +1023,15 @@
"headSpecialWinter2018HealerText": "Mistletoe Hood", "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.", "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", "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.", "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", "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.", "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", "shieldMystery201601Text": "Resolution Slayer",
"shieldMystery201601Notes": "This blade can be used to parry away all distractions. Confers no benefit. January 2016 Subscriber Item.", "shieldMystery201601Notes": "This blade can be used to parry away all distractions. Confers no benefit. January 2016 Subscriber Item.",
"shieldMystery201701Text": "Time-Freezer Shield", "shieldMystery201701Text": "Time-Freezer Shield",

View File

@@ -29,10 +29,10 @@
"seasonalShopClosedTitle": "<%= linkStart %>Leslie<%= linkEnd %>", "seasonalShopClosedTitle": "<%= linkStart %>Leslie<%= linkEnd %>",
"seasonalShopTitle": "<%= linkStart %>Seasonal Sorceress<%= linkEnd %>", "seasonalShopTitle": "<%= linkStart %>Seasonal Sorceress<%= linkEnd %>",
"seasonalShopClosedText": "The Seasonal Shop is currently closed!! Its only open during Habiticas four Grand Galas.", "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!", "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!", "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!", "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>", "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!", "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.", "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)", "winter2018GiftWrappedSet": "Gift-Wrapped Warrior (Warrior)",
"winter2018MistletoeSet": "Mistletoe Healer (Healer)", "winter2018MistletoeSet": "Mistletoe Healer (Healer)",
"winter2018ReindeerSet": "Reindeer Rogue (Rogue)", "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) %>.", "eventAvailability": "Available for purchase until <%= date(locale) %>.",
"dateEndMarch": "March 31", "dateEndMarch": "March 31",
"dateEndApril": "April 19", "dateEndApril": "April 19",

View File

@@ -31,6 +31,7 @@ export const EVENTS = {
summer2017: { start: '2017-06-20', end: '2017-08-02' }, summer2017: { start: '2017-06-20', end: '2017-08-02' },
fall2017: { start: '2017-09-21', end: '2017-11-02' }, fall2017: { start: '2017-09-21', end: '2017-11-02' },
winter2018: { start: '2017-12-19', end: '2018-02-02' }, winter2018: { start: '2017-12-19', end: '2018-02-02' },
spring2018: { start: '2018-03-20', end: '2018-05-02' },
}; };
export const SEASONAL_SETS = { export const SEASONAL_SETS = {
@@ -65,6 +66,37 @@ export const SEASONAL_SETS = {
'winter2018MistletoeSet', 'winter2018MistletoeSet',
'winter2018ReindeerSet', '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 = [ export const GEAR_TYPES = [

View File

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

View File

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

View File

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

View File

@@ -1,23 +1,29 @@
// import { SEASONAL_SETS } from '../content/constants'; import { SEASONAL_SETS } from '../content/constants';
module.exports = { 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: [ availableSets: [
...SEASONAL_SETS.spring,
], ],
pinnedSets: { pinnedSets: {
wizard: 'spring2018TulipMageSet',
warrior: 'spring2018SunriseWarriorSet',
rogue: 'spring2018DucklingRogueSet',
healer: 'spring2018GarnetHealerSet',
}, },
availableSpells: [ availableSpells: [
], ],
availableQuests: [ availableQuests: [
'egg',
], ],
featuredSet: 'yetiSet', featuredSet: 'comfortingKittySet',
}; };

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 689 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 373 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 564 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

View File

@@ -3,7 +3,7 @@ import { authWithHeaders } from '../../middlewares/auth';
let api = {}; let api = {};
// @TODO export this const, cannot export it from here because only routes are exported from controllers // @TODO export this const, cannot export it from here because only routes are exported from controllers
const LAST_ANNOUNCEMENT_TITLE = 'KEYS TO THE KENNELS AND USE CASE SPOTLIGHT'; const LAST_ANNOUNCEMENT_TITLE = 'SPRING FLING BEGINS! LIMITED EDITION EQUIPMENT, SEASONAL SHOP OPENS, AND EGG QUEST IS AVAILABLE!';
const worldDmg = { // @TODO const worldDmg = { // @TODO
bailey: false, bailey: false,
}; };
@@ -32,26 +32,28 @@ api.getNews = {
<h1 class="align-self-center">${res.t('newStuff')}</h1> <h1 class="align-self-center">${res.t('newStuff')}</h1>
</div> </div>
</div> </div>
<h2>3/15/2018 - ${LAST_ANNOUNCEMENT_TITLE}</h2> <h2>3/20/2018 - ${LAST_ANNOUNCEMENT_TITLE}</h2>
<hr/> <hr/>
<div class="media align-items-center"> <div class="media align-items-center">
<div class="media-body"> <div class="media-body">
<h3>Release Pets & Mounts!</h3> <h3>Limited Edition Class Outfits</h3>
<p>The Keys to the Kennels have returned! Now, when you collect all 90 standard pets or mounts, you can release them for 4 Gems, letting you collect them all over again! If you want a real challenge, you can attain the elusive Triad Bingo by filling your stable with all of both, then set them all free at once at no cost!</p> <p>From now until April 30th, limited edition outfits are available in the Rewards column! Depending on your class, you can be a Tulip Mage, Sunrise Warrior, Duckling Rogue, or Garnet Healer. You'd better get productive to earn enough gold before your time runs out...</p>
</div> <div class="small mb-3">by Vikte, Lalaitha, DialFForFunky, Gerald the Pixel, Beffymaroo and SabreCat</div>
<div class="pet_key ml-3"></div>
</div>
<p>Scroll to the bottom of <a href='/shops/market' target='_blank'>the Market</a> to purchase a Key. It takes effect immediately on purchase, so say your goodbyes first!</p>
<div class="small mb-3">by TheHollidayInn, Apollo, Lemoness, deilann, and Megan</div>
<div class="media align-items-center"> <div class="media align-items-center">
<div class="scene_sweeping mr-3"></div> <div class="promo_seasonalshop_spring mr-3"></div>
<div class="media-body"> <div class="media-body">
<h3>Use Case Spotlight: Spring Cleaning</h3> <h3>Seasonal Shop Opens</h3>
<p>This month's <a href='https://habitica.wordpress.com/2018/03/15/use-case-spotlight-spring-cleaning/' target='_blank'>Use Case Spotlight</a> is about Spring Cleaning! It features a number of great suggestions submitted by Habiticans in the <a href='/groups/guild/1d3a10bf-60aa-4806-a38b-82d1084a59e6' target='_blank'>Use Case Spotlights Guild</a>. We hope it helps any of you who might be looking to start spring with a nice, clean dwelling.</p> <p>The <a href='/shops/seasonal' target='_blank'>Seasonal Shop</a> has opened! It's stocking springtime Seasonal Edition goodies at the moment, including past spring outfits. Everything there will be available to purchase during the Spring Fling event each year, but it's only open until April 30th, so be sure to stock up now, or you'll have to wait a year to buy these items again!</p>
<p>Plus, we're collecting user submissions for the next spotlight! How do you use Habitica to Make a Difference? Well be featuring player-submitted examples in Use Case Spotlights on the Habitica Blog next month, so post your suggestions in the Use Case Spotlight Guild now. We look forward to learning more about how you use Habitica to improve your life and get things done!</p> <div class="small mb-3">by Scarvia, Awesome kitty, usnbfs, Lemoness, Balduranne, PainterProphet, Beffymaroo and SabreCat</div>
<div class="small mb-3">by Beffymaroo</div>
</div> </div>
</div> </div>
<h3>Egg Quest Available</h3>
<p>The Egg Quest is also available again in the <a href='/shops/quests' target='_blank'>Quest Shop</a>! Strange eggs are appearing all over Habitica. Can you collect them all to earn some colorful Egg pets and mounts?</p>
<div class="small mb-3">by Megan, Beffymaroo, and Lemoness</div>
</div>
<div class="promo_spring_fling_2018 ml-3"></div>
</div>
<div class="promo_egg_hunt center-block"></div>
</div> </div>
`, `,
}); });

View File

@@ -24,9 +24,10 @@ async function getWorldBoss () {
* *
* @apiSuccess {Object} data.worldBoss.active Boolean, true if world boss quest is underway * @apiSuccess {Object} data.worldBoss.active Boolean, true if world boss quest is underway
* @apiSuccess {Object} data.worldBoss.extra.worldDmg Object with NPC names as Boolean properties, true if they are affected by Rage Strike * @apiSuccess {Object} data.worldBoss.extra.worldDmg Object with NPC names as Boolean properties, true if they are affected by Rage Strike
* @apiSuccess {Object} data.worldBoss.key Quest content key for the world boss * @apiSuccess {Object} data.worldBoss.key String, Quest content key for the world boss
* @apiSuccess {Object} data.worldBoss.progress.hp Current Health of the world boss * @apiSuccess {Object} data.worldBoss.progress.hp Number, Current Health of the world boss
* @apiSuccess {Object} data.worldBoss.progress.rage Current Rage of the world boss * @apiSuccess {Object} data.worldBoss.progress.rage Number, Current Rage of the world boss
* @apiSuccess {Object} data.npcImageSuffix String, trailing component of NPC image filenames
* *
*/ */
api.getWorldState = { api.getWorldState = {
@@ -36,6 +37,7 @@ api.getWorldState = {
let worldState = {}; let worldState = {};
worldState.worldBoss = await getWorldBoss(); worldState.worldBoss = await getWorldBoss();
worldState.npcImageSuffix = 'spring';
res.respond(200, worldState); res.respond(200, worldState);
}, },