diff --git a/common/dist/sprites/spritesmith-largeSprites-0.css b/common/dist/sprites/spritesmith-largeSprites-0.css index eca80f793f..773da71ef1 100644 --- a/common/dist/sprites/spritesmith-largeSprites-0.css +++ b/common/dist/sprites/spritesmith-largeSprites-0.css @@ -1,342 +1,348 @@ .2014_Fall_HealerPROMO2 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -637px -955px; + background-position: -731px -995px; width: 90px; height: 90px; } .2014_Fall_Mage_PROMO9 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -452px -347px; + background-position: -306px -417px; width: 120px; height: 90px; } .2014_Fall_RoguePROMO3 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -573px -347px; + background-position: -808px -621px; width: 105px; height: 90px; } .2014_Fall_Warrior_PROMO { background-image: url(spritesmith-largeSprites-0.png); - background-position: -590px -461px; + background-position: -1095px -995px; width: 90px; height: 90px; } .promo_backtoschool { background-image: url(spritesmith-largeSprites-0.png); - background-position: -970px -342px; + background-position: -943px -522px; width: 150px; height: 150px; } .promo_burnout { background-image: url(spritesmith-largeSprites-0.png); - background-position: 0px -220px; + background-position: -452px 0px; width: 219px; height: 240px; } .promo_classes_fall_2014 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -326px -760px; + background-position: -326px -724px; width: 321px; height: 100px; } .promo_classes_fall_2015 { background-image: url(spritesmith-largeSprites-0.png); - background-position: 0px -660px; + background-position: -430px -621px; width: 377px; height: 99px; } .promo_dilatoryDistress { background-image: url(spritesmith-largeSprites-0.png); - background-position: 0px -955px; + background-position: -367px -995px; width: 90px; height: 90px; } .promo_enchanted_armoire { background-image: url(spritesmith-largeSprites-0.png); - background-position: -378px -660px; + background-position: -499px -525px; width: 374px; height: 76px; } .promo_enchanted_armoire_201507 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -970px -641px; + background-position: -943px -673px; width: 217px; height: 90px; } .promo_enchanted_armoire_201508 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -723px -342px; + background-position: -648px -724px; width: 180px; height: 90px; } .promo_enchanted_armoire_201509 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -273px -955px; + background-position: -458px -995px; width: 90px; height: 90px; } .promo_enchanted_armoire_201511 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -1111px -493px; + background-position: -306px -326px; width: 122px; height: 90px; } .promo_habitica { background-image: url(spritesmith-largeSprites-0.png); - background-position: -723px -166px; + background-position: -452px -241px; width: 175px; height: 175px; } +.promo_habitica_sticker { + background-image: url(spritesmith-largeSprites-0.png); + background-position: 0px -220px; + width: 305px; + height: 304px; +} .promo_haunted_hair { background-image: url(spritesmith-largeSprites-0.png); - background-position: -1127px -194px; + background-position: -1094px -522px; width: 100px; height: 137px; } .customize-option.promo_haunted_hair { background-image: url(spritesmith-largeSprites-0.png); - background-position: -1152px -209px; + background-position: -1119px -537px; width: 60px; height: 60px; } .promo_item_notif { background-image: url(spritesmith-largeSprites-0.png); - background-position: -970px -91px; + background-position: -943px -271px; width: 249px; height: 102px; } .promo_mystery_201405 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -546px -955px; + background-position: -1004px -995px; width: 90px; height: 90px; } .promo_mystery_201406 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -311px -220px; + background-position: -91px -995px; width: 90px; height: 96px; } .promo_mystery_201407 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -876px -433px; + background-position: -628px -241px; width: 42px; height: 62px; } .promo_mystery_201408 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -1188px -641px; + background-position: -1161px -764px; width: 60px; height: 71px; } .promo_mystery_201409 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -182px -955px; + background-position: -640px -995px; width: 90px; height: 90px; } .promo_mystery_201410 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -1169px -823px; + background-position: -1161px -673px; width: 72px; height: 63px; } .promo_mystery_201411 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -364px -955px; + background-position: -822px -995px; width: 90px; height: 90px; } .promo_mystery_201412 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -904px -342px; + background-position: -1195px -592px; width: 42px; height: 66px; } .promo_mystery_201501 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -899px -166px; + background-position: -1193px -271px; width: 48px; height: 63px; } .promo_mystery_201502 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -499px -461px; + background-position: -276px -995px; width: 90px; height: 90px; } .promo_mystery_201503 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -728px -955px; + background-position: 0px -1101px; width: 90px; height: 90px; } .promo_mystery_201504 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -1188px -732px; + background-position: -874px -525px; width: 60px; height: 69px; } .promo_mystery_201505 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -91px -955px; + background-position: -549px -995px; width: 90px; height: 90px; } .promo_mystery_201506 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -899px -230px; + background-position: -1195px -522px; width: 42px; height: 69px; } .promo_mystery_201507 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -220px -220px; + background-position: 0px -995px; width: 90px; height: 105px; } .promo_mystery_201508 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -314px -326px; + background-position: -829px -724px; width: 93px; height: 90px; } .promo_mystery_201509 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -455px -955px; + background-position: -913px -995px; width: 90px; height: 90px; } .promo_mystery_201510 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -220px -326px; + background-position: -182px -995px; width: 93px; height: 90px; } .promo_mystery_3014 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -970px -732px; + background-position: -943px -764px; width: 217px; height: 90px; } .promo_orca { background-image: url(spritesmith-largeSprites-0.png); - background-position: -1121px -342px; + background-position: -306px -220px; width: 105px; height: 105px; } .promo_partyhats { background-image: url(spritesmith-largeSprites-0.png); - background-position: -1111px -584px; + background-position: -943px -855px; width: 115px; height: 47px; } .promo_pastel_skin { background-image: url(spritesmith-largeSprites-0.png); - background-position: -331px -871px; + background-position: 0px -835px; width: 330px; height: 83px; } .customize-option.promo_pastel_skin { background-image: url(spritesmith-largeSprites-0.png); - background-position: -356px -886px; + background-position: -25px -850px; width: 60px; height: 60px; } .promo_pet_skins { background-image: url(spritesmith-largeSprites-0.png); - background-position: -970px -493px; + background-position: -1100px -374px; width: 140px; height: 147px; } .customize-option.promo_pet_skins { background-image: url(spritesmith-largeSprites-0.png); - background-position: -995px -508px; + background-position: -1125px -389px; width: 60px; height: 60px; } .promo_shimmer_hair { background-image: url(spritesmith-largeSprites-0.png); - background-position: 0px -871px; + background-position: -331px -835px; width: 330px; height: 83px; } .customize-option.promo_shimmer_hair { background-image: url(spritesmith-largeSprites-0.png); - background-position: -25px -886px; + background-position: -356px -850px; width: 60px; height: 60px; } .promo_splashyskins { background-image: url(spritesmith-largeSprites-0.png); - background-position: -970px -823px; + background-position: -452px -417px; width: 198px; height: 91px; } .customize-option.promo_splashyskins { background-image: url(spritesmith-largeSprites-0.png); - background-position: -995px -838px; + background-position: -477px -432px; width: 60px; height: 60px; } .promo_springclasses2014 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -970px 0px; + background-position: -943px -180px; width: 288px; height: 90px; } .promo_springclasses2015 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -430px -557px; + background-position: -943px -89px; width: 288px; height: 90px; } .promo_summer_classes_2014 { background-image: url(spritesmith-largeSprites-0.png); - background-position: 0px -557px; + background-position: 0px -621px; width: 429px; height: 102px; } .promo_summer_classes_2015 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -648px -760px; + background-position: -943px 0px; width: 300px; height: 88px; } .promo_updos { background-image: url(spritesmith-largeSprites-0.png); - background-position: -970px -194px; + background-position: -943px -374px; width: 156px; height: 147px; } .promo_veteran_pets { background-image: url(spritesmith-largeSprites-0.png); - background-position: -723px -509px; + background-position: 0px -919px; width: 146px; height: 75px; } .promo_winterclasses2015 { background-image: url(spritesmith-largeSprites-0.png); - background-position: 0px -760px; + background-position: 0px -724px; width: 325px; height: 110px; } .promo_winteryhair { background-image: url(spritesmith-largeSprites-0.png); - background-position: -723px -433px; + background-position: -662px -835px; width: 152px; height: 75px; } .customize-option.promo_winteryhair { background-image: url(spritesmith-largeSprites-0.png); - background-position: -748px -448px; + background-position: -687px -850px; width: 60px; height: 60px; } .avatar_variety { background-image: url(spritesmith-largeSprites-0.png); - background-position: 0px -461px; + background-position: 0px -525px; width: 498px; height: 95px; } @@ -348,19 +354,19 @@ } .welcome_basic_avatars { background-image: url(spritesmith-largeSprites-0.png); - background-position: -452px -181px; + background-position: -672px -347px; width: 246px; height: 165px; } .welcome_promo_party { background-image: url(spritesmith-largeSprites-0.png); - background-position: -452px 0px; + background-position: -672px 0px; width: 270px; height: 180px; } .welcome_sample_tasks { background-image: url(spritesmith-largeSprites-0.png); - background-position: -723px 0px; + background-position: -672px -181px; width: 246px; height: 165px; } diff --git a/common/dist/sprites/spritesmith-largeSprites-0.png b/common/dist/sprites/spritesmith-largeSprites-0.png index a9bd64b30b..0ff6974a2b 100644 Binary files a/common/dist/sprites/spritesmith-largeSprites-0.png and b/common/dist/sprites/spritesmith-largeSprites-0.png differ diff --git a/common/img/sprites/spritesmith_large/promo/promo_habitica_sticker.png b/common/img/sprites/spritesmith_large/promo/promo_habitica_sticker.png new file mode 100644 index 0000000000..8ef82d7d00 Binary files /dev/null and b/common/img/sprites/spritesmith_large/promo/promo_habitica_sticker.png differ diff --git a/common/locales/en/generic.json b/common/locales/en/generic.json index 8b097dcb3f..219f073126 100644 --- a/common/locales/en/generic.json +++ b/common/locales/en/generic.json @@ -69,8 +69,9 @@ "habiticaDayPluralText": "Celebrated <%= number %> Naming Days! Thanks for being a fantastic user.", "achievementDilatory": "Savior of Dilatory", "achievementDilatoryText": "Helped defeat the Dread Drag'on of Dilatory during the 2014 Summer Splash Event!", - "costumeContest": "2014 Costume Contest", - "costumeContestText": "Participated in the 2014 Halloween Costume Contest. See some of the entries at blog.habitica.com/tagged/cosplay!", + "costumeContest": "Costume Contestant", + "costumeContestText": "Participated in the Habitoween Costume Contest. See some of the entries on the Habitica blog!", + "costumeContestTextPlural": "Participated in <%= number %> Habitoween Costume Contests. See some of the entries on the Habitica blog!", "memberSince": "- Member since", "lastLoggedIn": "- Last logged in", "notPorted": "This feature is not yet ported from the original site.", diff --git a/common/script/content/constants.js b/common/script/content/constants.js new file mode 100644 index 0000000000..9274e9cf32 --- /dev/null +++ b/common/script/content/constants.js @@ -0,0 +1,58 @@ +/* eslint-disable key-spacing */ + +export const CLASSES = [ + 'warrior', + 'rogue', + 'healer', + 'wizard', +]; + +// IMPORTANT: The end date should be one to two days AFTER the actual end of +// the event, to allow people in different timezones to still buy the +// event gear up until at least the actual end of the event. + +export const EVENTS = { + winter: { start: '2013-12-31', end: '2014-02-01' }, + birthday: { start: '2013-01-30', end: '2014-02-01' }, + spring: { start: '2014-03-21', end: '2014-05-01' }, + summer: { start: '2014-06-20', end: '2014-08-01' }, + gaymerx: { start: '2014-07-02', end: '2014-08-01' }, + fall: { start: '2014-09-21', end: '2014-11-01' }, + winter2015: { start: '2014-12-21', end: '2015-02-02' }, + spring2015: { start: '2015-03-20', end: '2015-05-02' }, + summer2015: { start: '2015-06-20', end: '2015-08-02' }, + fall2015: { start: '2015-09-21', end: '2015-11-01' }, +}; + +export const GEAR_TYPES = [ + 'weapon', + 'armor', + 'head', + 'shield', + 'body', + 'back', + 'headAccessory', + 'eyewear', +]; + +export const ITEM_LIST = { + weapon: { localeKey: 'weapon', isEquipment: true }, + armor: { localeKey: 'armor', isEquipment: true }, + head: { localeKey: 'headgear', isEquipment: true }, + shield: { localeKey: 'offhand', isEquipment: true }, + back: { localeKey: 'back', isEquipment: true }, + body: { localeKey: 'body', isEquipment: true }, + headAccessory: { localeKey: 'headAccessory', isEquipment: true }, + eyewear: { localeKey: 'eyewear', isEquipment: true }, + hatchingPotions: { localeKey: 'hatchingPotion', isEquipment: false }, + eggs: { localeKey: 'eggSingular', isEquipment: false }, + quests: { localeKey: 'quest', isEquipment: false }, + food: { localeKey: 'foodText', isEquipment: false }, + Saddle: { localeKey: 'foodSaddleText', isEquipment: false }, +}; + +export const USER_CAN_OWN_QUEST_CATEGORIES = [ + 'unlockable', + 'gold', + 'pet', +]; diff --git a/common/script/content/index.js b/common/script/content/index.js index 0005d09460..ba6f7544a7 100644 --- a/common/script/content/index.js +++ b/common/script/content/index.js @@ -1,4 +1,4 @@ -var _, api, calculateBonus, classes, diminishingReturns, events, gear, gearTypes, moment, t; +var _, api, calculateBonus, diminishingReturns, gear, moment, t; api = module.exports; @@ -8,6 +8,15 @@ moment = require('moment'); t = require('./translation.js'); +import { + CLASSES, + EVENTS, + GEAR_TYPES, + ITEM_LIST, + USER_CAN_OWN_QUEST_CATEGORIES, +} from './constants'; + +import mysterySets from './mystery-sets'; /* --------------------------------------------------------------- @@ -16,233 +25,9 @@ t = require('./translation.js'); --------------------------------------------------------------- */ -classes = ['warrior', 'rogue', 'healer', 'wizard']; +api.mystery = mysterySets; -gearTypes = ['weapon', 'armor', 'head', 'shield', 'body', 'back', 'headAccessory', 'eyewear']; - -events = { - winter: { - start: '2013-12-31', - end: '2014-02-01' - }, - birthday: { - start: '2013-01-30', - end: '2014-02-01' - }, - spring: { - start: '2014-03-21', - end: '2014-05-01' - }, - summer: { - start: '2014-06-20', - end: '2014-08-01' - }, - gaymerx: { - start: '2014-07-02', - end: '2014-08-01' - }, - fall: { - start: '2014-09-21', - end: '2014-11-01' - }, - winter2015: { - start: '2014-12-21', - end: '2015-02-02' - }, - spring2015: { - start: '2015-03-20', - end: '2015-05-02' - }, - summer2015: { - start: '2015-06-20', - end: '2015-08-02' - }, - fall2015: { - start: '2015-09-21', - end: '2015-11-02' - } -}; - -api.mystery = { - 201402: { - start: '2014-02-22', - end: '2014-02-28', - text: 'Winged Messenger Set' - }, - 201403: { - start: '2014-03-24', - end: '2014-04-02', - text: 'Forest Walker Set' - }, - 201404: { - start: '2014-04-24', - end: '2014-05-02', - text: 'Twilight Butterfly Set' - }, - 201405: { - start: '2014-05-21', - end: '2014-06-02', - text: 'Flame Wielder Set' - }, - 201406: { - start: '2014-06-23', - end: '2014-07-02', - text: 'Octomage Set' - }, - 201407: { - start: '2014-07-23', - end: '2014-08-02', - text: 'Undersea Explorer Set' - }, - 201408: { - start: '2014-08-23', - end: '2014-09-02', - text: 'Sun Sorcerer Set' - }, - 201409: { - start: '2014-09-24', - end: '2014-10-02', - text: 'Autumn Strider Set' - }, - 201410: { - start: '2014-10-24', - end: '2014-11-02', - text: 'Winged Goblin Set' - }, - 201411: { - start: '2014-11-24', - end: '2014-12-02', - text: 'Feast and Fun Set' - }, - 201412: { - start: '2014-12-25', - end: '2015-01-02', - text: 'Penguin Set' - }, - 201501: { - start: '2015-01-26', - end: '2015-02-02', - text: 'Starry Knight Set' - }, - 201502: { - start: '2015-02-24', - end: '2015-03-02', - text: 'Winged Enchanter Set' - }, - 201503: { - start: '2015-03-25', - end: '2015-04-02', - text: 'Aquamarine Set' - }, - 201504: { - start: '2015-04-24', - end: '2015-05-02', - text: 'Busy Bee Set' - }, - 201505: { - start: '2015-05-25', - end: '2015-06-02', - text: 'Green Knight Set' - }, - 201506: { - start: '2015-06-25', - end: '2015-07-02', - text: 'Neon Snorkeler Set' - }, - 201507: { - start: '2015-07-24', - end: '2015-08-02', - text: 'Rad Surfer Set' - }, - 201508: { - start: '2015-08-23', - end: '2015-09-02', - text: 'Cheetah Costume Set' - }, - 201509: { - start: '2015-09-24', - end: '2015-10-02', - text: 'Werewolf Set' - }, - 201510: { - start: '2015-10-26', - end: '2015-11-02', - text: 'Horned Goblin Set' - }, - 301404: { - start: '3014-03-24', - end: '3014-04-02', - text: 'Steampunk Standard Set' - }, - 301405: { - start: '3014-04-24', - end: '3014-05-02', - text: 'Steampunk Accessories Set' - }, - wondercon: { - start: '2014-03-24', - end: '2014-04-01' - } -}; - -_.each(api.mystery, function(v, k) { - return v.key = k; -}); - -api.itemList = { - 'weapon': { - localeKey: 'weapon', - isEquipment: true - }, - 'armor': { - localeKey: 'armor', - isEquipment: true - }, - 'head': { - localeKey: 'headgear', - isEquipment: true - }, - 'shield': { - localeKey: 'offhand', - isEquipment: true - }, - 'back': { - localeKey: 'back', - isEquipment: true - }, - 'body': { - localeKey: 'body', - isEquipment: true - }, - 'headAccessory': { - localeKey: 'headAccessory', - isEquipment: true - }, - 'eyewear': { - localeKey: 'eyewear', - isEquipment: true - }, - 'hatchingPotions': { - localeKey: 'hatchingPotion', - isEquipment: false - }, - 'eggs': { - localeKey: 'eggSingular', - isEquipment: false - }, - 'quests': { - localeKey: 'quest', - isEquipment: false - }, - 'food': { - localeKey: 'foodText', - isEquipment: false - }, - 'Saddle': { - localeKey: 'foodSaddleText', - isEquipment: false - } -}; +api.itemList = ITEM_LIST; gear = { weapon: { @@ -577,7 +362,7 @@ gear = { }) }, yeti: { - event: events.winter, + event: EVENTS.winter, specialClass: 'warrior', text: t('weaponSpecialYetiText'), notes: t('weaponSpecialYetiNotes', { @@ -587,7 +372,7 @@ gear = { value: 90 }, ski: { - event: events.winter, + event: EVENTS.winter, specialClass: 'rogue', text: t('weaponSpecialSkiText'), notes: t('weaponSpecialSkiNotes', { @@ -597,7 +382,7 @@ gear = { value: 90 }, candycane: { - event: events.winter, + event: EVENTS.winter, specialClass: 'wizard', twoHanded: true, text: t('weaponSpecialCandycaneText'), @@ -610,7 +395,7 @@ gear = { value: 160 }, snowflake: { - event: events.winter, + event: EVENTS.winter, specialClass: 'healer', text: t('weaponSpecialSnowflakeText'), notes: t('weaponSpecialSnowflakeNotes', { @@ -620,7 +405,7 @@ gear = { value: 90 }, springRogue: { - event: events.spring, + event: EVENTS.spring, specialClass: 'rogue', text: t('weaponSpecialSpringRogueText'), notes: t('weaponSpecialSpringRogueNotes', { @@ -630,7 +415,7 @@ gear = { str: 8 }, springWarrior: { - event: events.spring, + event: EVENTS.spring, specialClass: 'warrior', text: t('weaponSpecialSpringWarriorText'), notes: t('weaponSpecialSpringWarriorNotes', { @@ -640,7 +425,7 @@ gear = { str: 15 }, springMage: { - event: events.spring, + event: EVENTS.spring, specialClass: 'wizard', twoHanded: true, text: t('weaponSpecialSpringMageText'), @@ -653,7 +438,7 @@ gear = { per: 7 }, springHealer: { - event: events.spring, + event: EVENTS.spring, specialClass: 'healer', text: t('weaponSpecialSpringHealerText'), notes: t('weaponSpecialSpringHealerNotes', { @@ -663,7 +448,7 @@ gear = { int: 9 }, summerRogue: { - event: events.summer, + event: EVENTS.summer, specialClass: 'rogue', text: t('weaponSpecialSummerRogueText'), notes: t('weaponSpecialSummerRogueNotes', { @@ -673,7 +458,7 @@ gear = { str: 8 }, summerWarrior: { - event: events.summer, + event: EVENTS.summer, specialClass: 'warrior', text: t('weaponSpecialSummerWarriorText'), notes: t('weaponSpecialSummerWarriorNotes', { @@ -683,7 +468,7 @@ gear = { str: 15 }, summerMage: { - event: events.summer, + event: EVENTS.summer, specialClass: 'wizard', twoHanded: true, text: t('weaponSpecialSummerMageText'), @@ -696,7 +481,7 @@ gear = { per: 7 }, summerHealer: { - event: events.summer, + event: EVENTS.summer, specialClass: 'healer', text: t('weaponSpecialSummerHealerText'), notes: t('weaponSpecialSummerHealerNotes', { @@ -706,7 +491,7 @@ gear = { int: 9 }, fallRogue: { - event: events.fall, + event: EVENTS.fall, specialClass: 'rogue', text: t('weaponSpecialFallRogueText'), notes: t('weaponSpecialFallRogueNotes', { @@ -719,7 +504,7 @@ gear = { }) }, fallWarrior: { - event: events.fall, + event: EVENTS.fall, specialClass: 'warrior', text: t('weaponSpecialFallWarriorText'), notes: t('weaponSpecialFallWarriorNotes', { @@ -732,7 +517,7 @@ gear = { }) }, fallMage: { - event: events.fall, + event: EVENTS.fall, specialClass: 'wizard', twoHanded: true, text: t('weaponSpecialFallMageText'), @@ -748,7 +533,7 @@ gear = { }) }, fallHealer: { - event: events.fall, + event: EVENTS.fall, specialClass: 'healer', text: t('weaponSpecialFallHealerText'), notes: t('weaponSpecialFallHealerNotes', { @@ -761,7 +546,7 @@ gear = { }) }, winter2015Rogue: { - event: events.winter2015, + event: EVENTS.winter2015, specialClass: 'rogue', text: t('weaponSpecialWinter2015RogueText'), notes: t('weaponSpecialWinter2015RogueNotes', { @@ -771,7 +556,7 @@ gear = { str: 8 }, winter2015Warrior: { - event: events.winter2015, + event: EVENTS.winter2015, specialClass: 'warrior', text: t('weaponSpecialWinter2015WarriorText'), notes: t('weaponSpecialWinter2015WarriorNotes', { @@ -781,7 +566,7 @@ gear = { str: 15 }, winter2015Mage: { - event: events.winter2015, + event: EVENTS.winter2015, specialClass: 'wizard', twoHanded: true, text: t('weaponSpecialWinter2015MageText'), @@ -794,7 +579,7 @@ gear = { per: 7 }, winter2015Healer: { - event: events.winter2015, + event: EVENTS.winter2015, specialClass: 'healer', text: t('weaponSpecialWinter2015HealerText'), notes: t('weaponSpecialWinter2015HealerNotes', { @@ -804,7 +589,7 @@ gear = { int: 9 }, spring2015Rogue: { - event: events.spring2015, + event: EVENTS.spring2015, specialClass: 'rogue', text: t('weaponSpecialSpring2015RogueText'), notes: t('weaponSpecialSpring2015RogueNotes', { @@ -814,7 +599,7 @@ gear = { str: 8 }, spring2015Warrior: { - event: events.spring2015, + event: EVENTS.spring2015, specialClass: 'warrior', text: t('weaponSpecialSpring2015WarriorText'), notes: t('weaponSpecialSpring2015WarriorNotes', { @@ -824,7 +609,7 @@ gear = { str: 15 }, spring2015Mage: { - event: events.spring2015, + event: EVENTS.spring2015, specialClass: 'wizard', twoHanded: true, text: t('weaponSpecialSpring2015MageText'), @@ -837,7 +622,7 @@ gear = { per: 7 }, spring2015Healer: { - event: events.spring2015, + event: EVENTS.spring2015, specialClass: 'healer', text: t('weaponSpecialSpring2015HealerText'), notes: t('weaponSpecialSpring2015HealerNotes', { @@ -847,7 +632,7 @@ gear = { int: 9 }, summer2015Rogue: { - event: events.summer2015, + event: EVENTS.summer2015, specialClass: 'rogue', text: t('weaponSpecialSummer2015RogueText'), notes: t('weaponSpecialSummer2015RogueNotes', { @@ -857,7 +642,7 @@ gear = { str: 8 }, summer2015Warrior: { - event: events.summer2015, + event: EVENTS.summer2015, specialClass: 'warrior', text: t('weaponSpecialSummer2015WarriorText'), notes: t('weaponSpecialSummer2015WarriorNotes', { @@ -867,7 +652,7 @@ gear = { str: 15 }, summer2015Mage: { - event: events.summer2015, + event: EVENTS.summer2015, specialClass: 'wizard', twoHanded: true, text: t('weaponSpecialSummer2015MageText'), @@ -880,7 +665,7 @@ gear = { per: 7 }, summer2015Healer: { - event: events.summer2015, + event: EVENTS.summer2015, specialClass: 'healer', text: t('weaponSpecialSummer2015HealerText'), notes: t('weaponSpecialSummer2015HealerNotes', { @@ -890,7 +675,7 @@ gear = { int: 9 }, fall2015Rogue: { - event: events.fall2015, + event: EVENTS.fall2015, specialClass: 'rogue', text: t('weaponSpecialFall2015RogueText'), notes: t('weaponSpecialFall2015RogueNotes', { @@ -900,7 +685,7 @@ gear = { str: 8 }, fall2015Warrior: { - event: events.fall2015, + event: EVENTS.fall2015, specialClass: 'warrior', text: t('weaponSpecialFall2015WarriorText'), notes: t('weaponSpecialFall2015WarriorNotes', { @@ -910,7 +695,7 @@ gear = { str: 15 }, fall2015Mage: { - event: events.fall2015, + event: EVENTS.fall2015, specialClass: 'wizard', twoHanded: true, text: t('weaponSpecialFall2015MageText'), @@ -923,7 +708,7 @@ gear = { per: 7 }, fall2015Healer: { - event: events.fall2015, + event: EVENTS.fall2015, specialClass: 'healer', text: t('weaponSpecialFall2015HealerText'), notes: t('weaponSpecialFall2015HealerNotes', { @@ -1306,7 +1091,7 @@ gear = { }) }, yeti: { - event: events.winter, + event: EVENTS.winter, specialClass: 'warrior', text: t('armorSpecialYetiText'), notes: t('armorSpecialYetiNotes', { @@ -1316,7 +1101,7 @@ gear = { value: 90 }, ski: { - event: events.winter, + event: EVENTS.winter, specialClass: 'rogue', text: t('armorSpecialSkiText'), notes: t('armorSpecialSkiNotes', { @@ -1326,7 +1111,7 @@ gear = { value: 90 }, candycane: { - event: events.winter, + event: EVENTS.winter, specialClass: 'wizard', text: t('armorSpecialCandycaneText'), notes: t('armorSpecialCandycaneNotes', { @@ -1336,7 +1121,7 @@ gear = { value: 90 }, snowflake: { - event: events.winter, + event: EVENTS.winter, specialClass: 'healer', text: t('armorSpecialSnowflakeText'), notes: t('armorSpecialSnowflakeNotes', { @@ -1346,13 +1131,13 @@ gear = { value: 90 }, birthday: { - event: events.birthday, + event: EVENTS.birthday, text: t('armorSpecialBirthdayText'), notes: t('armorSpecialBirthdayNotes'), value: 0 }, springRogue: { - event: events.spring, + event: EVENTS.spring, specialClass: 'rogue', text: t('armorSpecialSpringRogueText'), notes: t('armorSpecialSpringRogueNotes', { @@ -1362,7 +1147,7 @@ gear = { per: 15 }, springWarrior: { - event: events.spring, + event: EVENTS.spring, specialClass: 'warrior', text: t('armorSpecialSpringWarriorText'), notes: t('armorSpecialSpringWarriorNotes', { @@ -1372,7 +1157,7 @@ gear = { con: 9 }, springMage: { - event: events.spring, + event: EVENTS.spring, specialClass: 'wizard', text: t('armorSpecialSpringMageText'), notes: t('armorSpecialSpringMageNotes', { @@ -1382,7 +1167,7 @@ gear = { int: 9 }, springHealer: { - event: events.spring, + event: EVENTS.spring, specialClass: 'healer', text: t('armorSpecialSpringHealerText'), notes: t('armorSpecialSpringHealerNotes', { @@ -1392,7 +1177,7 @@ gear = { con: 15 }, summerRogue: { - event: events.summer, + event: EVENTS.summer, specialClass: 'rogue', text: t('armorSpecialSummerRogueText'), notes: t('armorSpecialSummerRogueNotes', { @@ -1402,7 +1187,7 @@ gear = { per: 15 }, summerWarrior: { - event: events.summer, + event: EVENTS.summer, specialClass: 'warrior', text: t('armorSpecialSummerWarriorText'), notes: t('armorSpecialSummerWarriorNotes', { @@ -1412,7 +1197,7 @@ gear = { con: 9 }, summerMage: { - event: events.summer, + event: EVENTS.summer, specialClass: 'wizard', text: t('armorSpecialSummerMageText'), notes: t('armorSpecialSummerMageNotes', { @@ -1422,7 +1207,7 @@ gear = { int: 9 }, summerHealer: { - event: events.summer, + event: EVENTS.summer, specialClass: 'healer', text: t('armorSpecialSummerHealerText'), notes: t('armorSpecialSummerHealerNotes', { @@ -1432,7 +1217,7 @@ gear = { con: 15 }, fallRogue: { - event: events.fall, + event: EVENTS.fall, specialClass: 'rogue', text: t('armorSpecialFallRogueText'), notes: t('armorSpecialFallRogueNotes', { @@ -1445,7 +1230,7 @@ gear = { }) }, fallWarrior: { - event: events.fall, + event: EVENTS.fall, specialClass: 'warrior', text: t('armorSpecialFallWarriorText'), notes: t('armorSpecialFallWarriorNotes', { @@ -1458,7 +1243,7 @@ gear = { }) }, fallMage: { - event: events.fall, + event: EVENTS.fall, specialClass: 'wizard', text: t('armorSpecialFallMageText'), notes: t('armorSpecialFallMageNotes', { @@ -1471,7 +1256,7 @@ gear = { }) }, fallHealer: { - event: events.fall, + event: EVENTS.fall, specialClass: 'healer', text: t('armorSpecialFallHealerText'), notes: t('armorSpecialFallHealerNotes', { @@ -1484,7 +1269,7 @@ gear = { }) }, winter2015Rogue: { - event: events.winter2015, + event: EVENTS.winter2015, specialClass: 'rogue', text: t('armorSpecialWinter2015RogueText'), notes: t('armorSpecialWinter2015RogueNotes', { @@ -1494,7 +1279,7 @@ gear = { per: 15 }, winter2015Warrior: { - event: events.winter2015, + event: EVENTS.winter2015, specialClass: 'warrior', text: t('armorSpecialWinter2015WarriorText'), notes: t('armorSpecialWinter2015WarriorNotes', { @@ -1504,7 +1289,7 @@ gear = { con: 9 }, winter2015Mage: { - event: events.winter2015, + event: EVENTS.winter2015, specialClass: 'wizard', text: t('armorSpecialWinter2015MageText'), notes: t('armorSpecialWinter2015MageNotes', { @@ -1514,7 +1299,7 @@ gear = { int: 9 }, winter2015Healer: { - event: events.winter2015, + event: EVENTS.winter2015, specialClass: 'healer', text: t('armorSpecialWinter2015HealerText'), notes: t('armorSpecialWinter2015HealerNotes', { @@ -1532,7 +1317,7 @@ gear = { }) }, spring2015Rogue: { - event: events.spring2015, + event: EVENTS.spring2015, specialClass: 'rogue', text: t('armorSpecialSpring2015RogueText'), notes: t('armorSpecialSpring2015RogueNotes', { @@ -1542,7 +1327,7 @@ gear = { per: 15 }, spring2015Warrior: { - event: events.spring2015, + event: EVENTS.spring2015, specialClass: 'warrior', text: t('armorSpecialSpring2015WarriorText'), notes: t('armorSpecialSpring2015WarriorNotes', { @@ -1552,7 +1337,7 @@ gear = { con: 9 }, spring2015Mage: { - event: events.spring2015, + event: EVENTS.spring2015, specialClass: 'wizard', text: t('armorSpecialSpring2015MageText'), notes: t('armorSpecialSpring2015MageNotes', { @@ -1562,7 +1347,7 @@ gear = { int: 9 }, spring2015Healer: { - event: events.spring2015, + event: EVENTS.spring2015, specialClass: 'healer', text: t('armorSpecialSpring2015HealerText'), notes: t('armorSpecialSpring2015HealerNotes', { @@ -1572,7 +1357,7 @@ gear = { con: 15 }, summer2015Rogue: { - event: events.summer2015, + event: EVENTS.summer2015, specialClass: 'rogue', text: t('armorSpecialSummer2015RogueText'), notes: t('armorSpecialSummer2015RogueNotes', { @@ -1582,7 +1367,7 @@ gear = { per: 15 }, summer2015Warrior: { - event: events.summer2015, + event: EVENTS.summer2015, specialClass: 'warrior', text: t('armorSpecialSummer2015WarriorText'), notes: t('armorSpecialSummer2015WarriorNotes', { @@ -1592,7 +1377,7 @@ gear = { con: 9 }, summer2015Mage: { - event: events.summer2015, + event: EVENTS.summer2015, specialClass: 'wizard', text: t('armorSpecialSummer2015MageText'), notes: t('armorSpecialSummer2015MageNotes', { @@ -1602,7 +1387,7 @@ gear = { int: 9 }, summer2015Healer: { - event: events.summer2015, + event: EVENTS.summer2015, specialClass: 'healer', text: t('armorSpecialSummer2015HealerText'), notes: t('armorSpecialSummer2015HealerNotes', { @@ -1612,7 +1397,7 @@ gear = { con: 15 }, fall2015Rogue: { - event: events.fall2015, + event: EVENTS.fall2015, specialClass: 'rogue', text: t('armorSpecialFall2015RogueText'), notes: t('armorSpecialFall2015RogueNotes', { @@ -1622,7 +1407,7 @@ gear = { per: 15 }, fall2015Warrior: { - event: events.fall2015, + event: EVENTS.fall2015, specialClass: 'warrior', text: t('armorSpecialFall2015WarriorText'), notes: t('armorSpecialFall2015WarriorNotes', { @@ -1632,7 +1417,7 @@ gear = { con: 9 }, fall2015Mage: { - event: events.fall2015, + event: EVENTS.fall2015, specialClass: 'wizard', text: t('armorSpecialFall2015MageText'), notes: t('armorSpecialFall2015MageNotes', { @@ -1642,7 +1427,7 @@ gear = { int: 9 }, fall2015Healer: { - event: events.fall2015, + event: EVENTS.fall2015, specialClass: 'healer', text: t('armorSpecialFall2015HealerText'), notes: t('armorSpecialFall2015HealerNotes', { @@ -1652,7 +1437,7 @@ gear = { con: 15 }, gaymerx: { - event: events.gaymerx, + event: EVENTS.gaymerx, text: t('armorSpecialGaymerxText'), notes: t('armorSpecialGaymerxNotes'), value: 0 @@ -2106,13 +1891,13 @@ gear = { }) }, nye: { - event: events.winter, + event: EVENTS.winter, text: t('headSpecialNyeText'), notes: t('headSpecialNyeNotes'), value: 0 }, yeti: { - event: events.winter, + event: EVENTS.winter, specialClass: 'warrior', text: t('headSpecialYetiText'), notes: t('headSpecialYetiNotes', { @@ -2122,7 +1907,7 @@ gear = { value: 60 }, ski: { - event: events.winter, + event: EVENTS.winter, specialClass: 'rogue', text: t('headSpecialSkiText'), notes: t('headSpecialSkiNotes', { @@ -2132,7 +1917,7 @@ gear = { value: 60 }, candycane: { - event: events.winter, + event: EVENTS.winter, specialClass: 'wizard', text: t('headSpecialCandycaneText'), notes: t('headSpecialCandycaneNotes', { @@ -2142,7 +1927,7 @@ gear = { value: 60 }, snowflake: { - event: events.winter, + event: EVENTS.winter, specialClass: 'healer', text: t('headSpecialSnowflakeText'), notes: t('headSpecialSnowflakeNotes', { @@ -2152,7 +1937,7 @@ gear = { value: 60 }, springRogue: { - event: events.spring, + event: EVENTS.spring, specialClass: 'rogue', text: t('headSpecialSpringRogueText'), notes: t('headSpecialSpringRogueNotes', { @@ -2162,7 +1947,7 @@ gear = { per: 9 }, springWarrior: { - event: events.spring, + event: EVENTS.spring, specialClass: 'warrior', text: t('headSpecialSpringWarriorText'), notes: t('headSpecialSpringWarriorNotes', { @@ -2172,7 +1957,7 @@ gear = { str: 9 }, springMage: { - event: events.spring, + event: EVENTS.spring, specialClass: 'wizard', text: t('headSpecialSpringMageText'), notes: t('headSpecialSpringMageNotes', { @@ -2182,7 +1967,7 @@ gear = { per: 7 }, springHealer: { - event: events.spring, + event: EVENTS.spring, specialClass: 'healer', text: t('headSpecialSpringHealerText'), notes: t('headSpecialSpringHealerNotes', { @@ -2192,7 +1977,7 @@ gear = { int: 7 }, summerRogue: { - event: events.summer, + event: EVENTS.summer, specialClass: 'rogue', text: t('headSpecialSummerRogueText'), notes: t('headSpecialSummerRogueNotes', { @@ -2202,7 +1987,7 @@ gear = { per: 9 }, summerWarrior: { - event: events.summer, + event: EVENTS.summer, specialClass: 'warrior', text: t('headSpecialSummerWarriorText'), notes: t('headSpecialSummerWarriorNotes', { @@ -2212,7 +1997,7 @@ gear = { str: 9 }, summerMage: { - event: events.summer, + event: EVENTS.summer, specialClass: 'wizard', text: t('headSpecialSummerMageText'), notes: t('headSpecialSummerMageNotes', { @@ -2222,7 +2007,7 @@ gear = { per: 7 }, summerHealer: { - event: events.summer, + event: EVENTS.summer, specialClass: 'healer', text: t('headSpecialSummerHealerText'), notes: t('headSpecialSummerHealerNotes', { @@ -2232,7 +2017,7 @@ gear = { int: 7 }, fallRogue: { - event: events.fall, + event: EVENTS.fall, specialClass: 'rogue', text: t('headSpecialFallRogueText'), notes: t('headSpecialFallRogueNotes', { @@ -2245,7 +2030,7 @@ gear = { }) }, fallWarrior: { - event: events.fall, + event: EVENTS.fall, specialClass: 'warrior', text: t('headSpecialFallWarriorText'), notes: t('headSpecialFallWarriorNotes', { @@ -2258,7 +2043,7 @@ gear = { }) }, fallMage: { - event: events.fall, + event: EVENTS.fall, specialClass: 'wizard', text: t('headSpecialFallMageText'), notes: t('headSpecialFallMageNotes', { @@ -2271,7 +2056,7 @@ gear = { }) }, fallHealer: { - event: events.fall, + event: EVENTS.fall, specialClass: 'healer', text: t('headSpecialFallHealerText'), notes: t('headSpecialFallHealerNotes', { @@ -2284,7 +2069,7 @@ gear = { }) }, winter2015Rogue: { - event: events.winter2015, + event: EVENTS.winter2015, specialClass: 'rogue', text: t('headSpecialWinter2015RogueText'), notes: t('headSpecialWinter2015RogueNotes', { @@ -2294,7 +2079,7 @@ gear = { per: 9 }, winter2015Warrior: { - event: events.winter2015, + event: EVENTS.winter2015, specialClass: 'warrior', text: t('headSpecialWinter2015WarriorText'), notes: t('headSpecialWinter2015WarriorNotes', { @@ -2304,7 +2089,7 @@ gear = { str: 9 }, winter2015Mage: { - event: events.winter2015, + event: EVENTS.winter2015, specialClass: 'wizard', text: t('headSpecialWinter2015MageText'), notes: t('headSpecialWinter2015MageNotes', { @@ -2314,7 +2099,7 @@ gear = { per: 7 }, winter2015Healer: { - event: events.winter2015, + event: EVENTS.winter2015, specialClass: 'healer', text: t('headSpecialWinter2015HealerText'), notes: t('headSpecialWinter2015HealerNotes', { @@ -2332,7 +2117,7 @@ gear = { }) }, spring2015Rogue: { - event: events.spring2015, + event: EVENTS.spring2015, specialClass: 'rogue', text: t('headSpecialSpring2015RogueText'), notes: t('headSpecialSpring2015RogueNotes', { @@ -2342,7 +2127,7 @@ gear = { per: 9 }, spring2015Warrior: { - event: events.spring2015, + event: EVENTS.spring2015, specialClass: 'warrior', text: t('headSpecialSpring2015WarriorText'), notes: t('headSpecialSpring2015WarriorNotes', { @@ -2352,7 +2137,7 @@ gear = { str: 9 }, spring2015Mage: { - event: events.spring2015, + event: EVENTS.spring2015, specialClass: 'wizard', text: t('headSpecialSpring2015MageText'), notes: t('headSpecialSpring2015MageNotes', { @@ -2362,7 +2147,7 @@ gear = { per: 7 }, spring2015Healer: { - event: events.spring2015, + event: EVENTS.spring2015, specialClass: 'healer', text: t('headSpecialSpring2015HealerText'), notes: t('headSpecialSpring2015HealerNotes', { @@ -2372,7 +2157,7 @@ gear = { int: 7 }, summer2015Rogue: { - event: events.summer2015, + event: EVENTS.summer2015, specialClass: 'rogue', text: t('headSpecialSummer2015RogueText'), notes: t('headSpecialSummer2015RogueNotes', { @@ -2382,7 +2167,7 @@ gear = { per: 9 }, summer2015Warrior: { - event: events.summer2015, + event: EVENTS.summer2015, specialClass: 'warrior', text: t('headSpecialSummer2015WarriorText'), notes: t('headSpecialSummer2015WarriorNotes', { @@ -2392,7 +2177,7 @@ gear = { str: 9 }, summer2015Mage: { - event: events.summer2015, + event: EVENTS.summer2015, specialClass: 'wizard', text: t('headSpecialSummer2015MageText'), notes: t('headSpecialSummer2015MageNotes', { @@ -2402,7 +2187,7 @@ gear = { per: 7 }, summer2015Healer: { - event: events.summer2015, + event: EVENTS.summer2015, specialClass: 'healer', text: t('headSpecialSummer2015HealerText'), notes: t('headSpecialSummer2015HealerNotes', { @@ -2412,7 +2197,7 @@ gear = { int: 7 }, fall2015Rogue: { - event: events.fall2015, + event: EVENTS.fall2015, specialClass: 'rogue', text: t('headSpecialFall2015RogueText'), notes: t('headSpecialFall2015RogueNotes', { @@ -2422,7 +2207,7 @@ gear = { per: 9 }, fall2015Warrior: { - event: events.fall2015, + event: EVENTS.fall2015, specialClass: 'warrior', text: t('headSpecialFall2015WarriorText'), notes: t('headSpecialFall2015WarriorNotes', { @@ -2432,7 +2217,7 @@ gear = { str: 9 }, fall2015Mage: { - event: events.fall2015, + event: EVENTS.fall2015, specialClass: 'wizard', text: t('headSpecialFall2015MageText'), notes: t('headSpecialFall2015MageNotes', { @@ -2442,7 +2227,7 @@ gear = { per: 7 }, fall2015Healer: { - event: events.fall2015, + event: EVENTS.fall2015, specialClass: 'healer', text: t('headSpecialFall2015HealerText'), notes: t('headSpecialFall2015HealerNotes', { @@ -2452,7 +2237,7 @@ gear = { int: 7 }, gaymerx: { - event: events.gaymerx, + event: EVENTS.gaymerx, text: t('headSpecialGaymerxText'), notes: t('headSpecialGaymerxNotes'), value: 0 @@ -2964,7 +2749,7 @@ gear = { }) }, yeti: { - event: events.winter, + event: EVENTS.winter, specialClass: 'warrior', text: t('shieldSpecialYetiText'), notes: t('shieldSpecialYetiNotes', { @@ -2974,7 +2759,7 @@ gear = { value: 70 }, ski: { - event: events.winter, + event: EVENTS.winter, specialClass: 'rogue', text: t('weaponSpecialSkiText'), notes: t('weaponSpecialSkiNotes', { @@ -2984,7 +2769,7 @@ gear = { value: 90 }, snowflake: { - event: events.winter, + event: EVENTS.winter, specialClass: 'healer', text: t('shieldSpecialSnowflakeText'), notes: t('shieldSpecialSnowflakeNotes', { @@ -2994,7 +2779,7 @@ gear = { value: 70 }, springRogue: { - event: events.spring, + event: EVENTS.spring, specialClass: 'rogue', text: t('shieldSpecialSpringRogueText'), notes: t('shieldSpecialSpringRogueNotes', { @@ -3004,7 +2789,7 @@ gear = { str: 8 }, springWarrior: { - event: events.spring, + event: EVENTS.spring, specialClass: 'warrior', text: t('shieldSpecialSpringWarriorText'), notes: t('shieldSpecialSpringWarriorNotes', { @@ -3014,7 +2799,7 @@ gear = { con: 7 }, springHealer: { - event: events.spring, + event: EVENTS.spring, specialClass: 'healer', text: t('shieldSpecialSpringHealerText'), notes: t('shieldSpecialSpringHealerNotes', { @@ -3024,7 +2809,7 @@ gear = { con: 9 }, summerRogue: { - event: events.summer, + event: EVENTS.summer, specialClass: 'rogue', text: t('shieldSpecialSummerRogueText'), notes: t('shieldSpecialSummerRogueNotes', { @@ -3034,7 +2819,7 @@ gear = { str: 8 }, summerWarrior: { - event: events.summer, + event: EVENTS.summer, specialClass: 'warrior', text: t('shieldSpecialSummerWarriorText'), notes: t('shieldSpecialSummerWarriorNotes', { @@ -3044,7 +2829,7 @@ gear = { con: 7 }, summerHealer: { - event: events.summer, + event: EVENTS.summer, specialClass: 'healer', text: t('shieldSpecialSummerHealerText'), notes: t('shieldSpecialSummerHealerNotes', { @@ -3054,7 +2839,7 @@ gear = { con: 9 }, fallRogue: { - event: events.fall, + event: EVENTS.fall, specialClass: 'rogue', text: t('shieldSpecialFallRogueText'), notes: t('shieldSpecialFallRogueNotes', { @@ -3067,7 +2852,7 @@ gear = { }) }, fallWarrior: { - event: events.fall, + event: EVENTS.fall, specialClass: 'warrior', text: t('shieldSpecialFallWarriorText'), notes: t('shieldSpecialFallWarriorNotes', { @@ -3080,7 +2865,7 @@ gear = { }) }, fallHealer: { - event: events.fall, + event: EVENTS.fall, specialClass: 'healer', text: t('shieldSpecialFallHealerText'), notes: t('shieldSpecialFallHealerNotes', { @@ -3093,7 +2878,7 @@ gear = { }) }, winter2015Rogue: { - event: events.winter2015, + event: EVENTS.winter2015, specialClass: 'rogue', text: t('shieldSpecialWinter2015RogueText'), notes: t('shieldSpecialWinter2015RogueNotes', { @@ -3103,7 +2888,7 @@ gear = { str: 8 }, winter2015Warrior: { - event: events.winter2015, + event: EVENTS.winter2015, specialClass: 'warrior', text: t('shieldSpecialWinter2015WarriorText'), notes: t('shieldSpecialWinter2015WarriorNotes', { @@ -3113,7 +2898,7 @@ gear = { con: 7 }, winter2015Healer: { - event: events.winter2015, + event: EVENTS.winter2015, specialClass: 'healer', text: t('shieldSpecialWinter2015HealerText'), notes: t('shieldSpecialWinter2015HealerNotes', { @@ -3123,7 +2908,7 @@ gear = { con: 9 }, spring2015Rogue: { - event: events.spring2015, + event: EVENTS.spring2015, specialClass: 'rogue', text: t('shieldSpecialSpring2015RogueText'), notes: t('shieldSpecialSpring2015RogueNotes', { @@ -3133,7 +2918,7 @@ gear = { str: 8 }, spring2015Warrior: { - event: events.spring2015, + event: EVENTS.spring2015, specialClass: 'warrior', text: t('shieldSpecialSpring2015WarriorText'), notes: t('shieldSpecialSpring2015WarriorNotes', { @@ -3143,7 +2928,7 @@ gear = { con: 7 }, spring2015Healer: { - event: events.spring2015, + event: EVENTS.spring2015, specialClass: 'healer', text: t('shieldSpecialSpring2015HealerText'), notes: t('shieldSpecialSpring2015HealerNotes', { @@ -3153,7 +2938,7 @@ gear = { con: 9 }, summer2015Rogue: { - event: events.summer2015, + event: EVENTS.summer2015, specialClass: 'rogue', text: t('shieldSpecialSummer2015RogueText'), notes: t('shieldSpecialSummer2015RogueNotes', { @@ -3163,7 +2948,7 @@ gear = { str: 8 }, summer2015Warrior: { - event: events.summer2015, + event: EVENTS.summer2015, specialClass: 'warrior', text: t('shieldSpecialSummer2015WarriorText'), notes: t('shieldSpecialSummer2015WarriorNotes', { @@ -3173,7 +2958,7 @@ gear = { con: 7 }, summer2015Healer: { - event: events.summer2015, + event: EVENTS.summer2015, specialClass: 'healer', text: t('shieldSpecialSummer2015HealerText'), notes: t('shieldSpecialSummer2015HealerNotes', { @@ -3183,7 +2968,7 @@ gear = { con: 9 }, fall2015Rogue: { - event: events.fall2015, + event: EVENTS.fall2015, specialClass: 'rogue', text: t('shieldSpecialFall2015RogueText'), notes: t('shieldSpecialFall2015RogueNotes', { @@ -3193,7 +2978,7 @@ gear = { str: 8 }, fall2015Warrior: { - event: events.fall2015, + event: EVENTS.fall2015, specialClass: 'warrior', text: t('shieldSpecialFall2015WarriorText'), notes: t('shieldSpecialFall2015WarriorNotes', { @@ -3203,7 +2988,7 @@ gear = { con: 7 }, fall2015Healer: { - event: events.fall2015, + event: EVENTS.fall2015, specialClass: 'healer', text: t('shieldSpecialFall2015HealerText'), notes: t('shieldSpecialFall2015HealerNotes', { @@ -3354,42 +3139,42 @@ gear = { mystery: 'wondercon' }, summerHealer: { - event: events.summer, + event: EVENTS.summer, specialClass: 'healer', text: t('bodySpecialSummerHealerText'), notes: t('bodySpecialSummerHealerNotes'), value: 20 }, summerMage: { - event: events.summer, + event: EVENTS.summer, specialClass: 'wizard', text: t('bodySpecialSummerMageText'), notes: t('bodySpecialSummerMageNotes'), value: 20 }, summer2015Healer: { - event: events.summer2015, + event: EVENTS.summer2015, specialClass: 'healer', text: t('bodySpecialSummer2015HealerText'), notes: t('bodySpecialSummer2015HealerNotes'), value: 20 }, summer2015Mage: { - event: events.summer2015, + event: EVENTS.summer2015, specialClass: 'wizard', text: t('bodySpecialSummer2015MageText'), notes: t('bodySpecialSummer2015MageNotes'), value: 20 }, summer2015Rogue: { - event: events.summer2015, + event: EVENTS.summer2015, specialClass: 'rogue', text: t('bodySpecialSummer2015RogueText'), notes: t('bodySpecialSummer2015RogueNotes'), value: 20 }, summer2015Warrior: { - event: events.summer2015, + event: EVENTS.summer2015, specialClass: 'warrior', text: t('bodySpecialSummer2015WarriorText'), notes: t('bodySpecialSummer2015WarriorNotes'), @@ -3408,56 +3193,56 @@ gear = { }, special: { springRogue: { - event: events.spring, + event: EVENTS.spring, specialClass: 'rogue', text: t('headAccessorySpecialSpringRogueText'), notes: t('headAccessorySpecialSpringRogueNotes'), value: 20 }, springWarrior: { - event: events.spring, + event: EVENTS.spring, specialClass: 'warrior', text: t('headAccessorySpecialSpringWarriorText'), notes: t('headAccessorySpecialSpringWarriorNotes'), value: 20 }, springMage: { - event: events.spring, + event: EVENTS.spring, specialClass: 'wizard', text: t('headAccessorySpecialSpringMageText'), notes: t('headAccessorySpecialSpringMageNotes'), value: 20 }, springHealer: { - event: events.spring, + event: EVENTS.spring, specialClass: 'healer', text: t('headAccessorySpecialSpringHealerText'), notes: t('headAccessorySpecialSpringHealerNotes'), value: 20 }, spring2015Rogue: { - event: events.spring2015, + event: EVENTS.spring2015, specialClass: 'rogue', text: t('headAccessorySpecialSpring2015RogueText'), notes: t('headAccessorySpecialSpring2015RogueNotes'), value: 20 }, spring2015Warrior: { - event: events.spring2015, + event: EVENTS.spring2015, specialClass: 'warrior', text: t('headAccessorySpecialSpring2015WarriorText'), notes: t('headAccessorySpecialSpring2015WarriorNotes'), value: 20 }, spring2015Mage: { - event: events.spring2015, + event: EVENTS.spring2015, specialClass: 'wizard', text: t('headAccessorySpecialSpring2015MageText'), notes: t('headAccessorySpecialSpring2015MageNotes'), value: 20 }, spring2015Healer: { - event: events.spring2015, + event: EVENTS.spring2015, specialClass: 'healer', text: t('headAccessorySpecialSpring2015HealerText'), notes: t('headAccessorySpecialSpring2015HealerNotes'), @@ -3622,14 +3407,14 @@ gear = { mystery: 'wondercon' }, summerRogue: { - event: events.summer, + event: EVENTS.summer, specialClass: 'rogue', text: t('eyewearSpecialSummerRogueText'), notes: t('eyewearSpecialSummerRogueNotes'), value: 20 }, summerWarrior: { - event: events.summer, + event: EVENTS.summer, specialClass: 'warrior', text: t('eyewearSpecialSummerWarriorText'), notes: t('eyewearSpecialSummerWarriorNotes'), @@ -3693,8 +3478,8 @@ api.gear = { flat: {} }; -_.each(gearTypes, function(type) { - return _.each(classes.concat(['base', 'special', 'mystery', 'armoire']), function(klass) { +_.each(GEAR_TYPES, function(type) { + return _.each(CLASSES.concat(['base', 'special', 'mystery', 'armoire']), function(klass) { return _.each(gear[type][klass], function(item, i) { var _canOwn, key; key = type + "_" + klass + "_" + i; @@ -3790,7 +3575,7 @@ api.armoire = { --------------------------------------------------------------- */ -api.classes = classes; +api.classes = CLASSES; /* @@ -3799,7 +3584,7 @@ api.classes = classes; --------------------------------------------------------------- */ -api.gearTypes = gearTypes; +api.gearTypes = GEAR_TYPES; /* @@ -5026,7 +4811,7 @@ _.each(api.food, function(food, key) { }); }); -api.userCanOwnQuestCategories = ['unlockable', 'gold', 'pet']; +api.userCanOwnQuestCategories = USER_CAN_OWN_QUEST_CATEGORIES; api.quests = { dilatory: { @@ -7002,4 +6787,4 @@ api.userDefaults = { ] }; -api.faq = require('./faq.js'); \ No newline at end of file +api.faq = require('./faq.js'); diff --git a/common/script/src/content/mystery-sets.js b/common/script/content/mystery-sets.js similarity index 57% rename from common/script/src/content/mystery-sets.js rename to common/script/content/mystery-sets.js index e57505815a..7402b577f6 100644 --- a/common/script/src/content/mystery-sets.js +++ b/common/script/content/mystery-sets.js @@ -1,133 +1,129 @@ -import {each, where} from 'lodash'; -import {flat as flattenedGear} from './gear/index'; +import { each } from 'lodash'; let mysterySets = { 201402: { start: '2014-02-22', end: '2014-02-28', - text: 'Winged Messenger Set' + text: 'Winged Messenger Set', }, 201403: { start: '2014-03-24', end: '2014-04-02', - text: 'Forest Walker Set' + text: 'Forest Walker Set', }, 201404: { start: '2014-04-24', end: '2014-05-02', - text: 'Twilight Butterfly Set' + text: 'Twilight Butterfly Set', }, 201405: { start: '2014-05-21', end: '2014-06-02', - text: 'Flame Wielder Set' + text: 'Flame Wielder Set', }, 201406: { start: '2014-06-23', end: '2014-07-02', - text: 'Octomage Set' + text: 'Octomage Set', }, 201407: { start: '2014-07-23', end: '2014-08-02', - text: 'Undersea Explorer Set' + text: 'Undersea Explorer Set', }, 201408: { start: '2014-08-23', end: '2014-09-02', - text: 'Sun Sorcerer Set' + text: 'Sun Sorcerer Set', }, 201409: { start: '2014-09-24', end: '2014-10-02', - text: 'Autumn Strider Set' + text: 'Autumn Strider Set', }, 201410: { start: '2014-10-24', end: '2014-11-02', - text: 'Winged Goblin Set' + text: 'Winged Goblin Set', }, 201411: { start: '2014-11-24', end: '2014-12-02', - text: 'Feast and Fun Set' + text: 'Feast and Fun Set', }, 201412: { start: '2014-12-25', end: '2015-01-02', - text: 'Penguin Set' + text: 'Penguin Set', }, 201501: { start: '2015-01-26', end: '2015-02-02', - text: 'Starry Knight Set' + text: 'Starry Knight Set', }, 201502: { start: '2015-02-24', end: '2015-03-02', - text: 'Winged Enchanter Set' + text: 'Winged Enchanter Set', }, 201503: { start: '2015-03-25', end: '2015-04-02', - text: 'Aquamarine Set' + text: 'Aquamarine Set', }, 201504: { start: '2015-04-24', end: '2015-05-02', - text: 'Busy Bee Set' + text: 'Busy Bee Set', }, 201505: { start: '2015-05-25', end: '2015-06-02', - text: 'Green Knight Set' + text: 'Green Knight Set', }, 201506: { start: '2015-06-25', end: '2015-07-02', - text: 'Neon Snorkeler Set' + text: 'Neon Snorkeler Set', }, 201507: { start: '2015-07-24', end: '2015-08-02', - text: 'Rad Surfer Set' + text: 'Rad Surfer Set', }, 201508: { start: '2015-08-23', end: '2015-09-02', - text: 'Cheetah Costume Set' + text: 'Cheetah Costume Set', }, 201509: { - start:'2015-09-24', - end:'2015-10-02', - text:'Werewolf Set' + start: '2015-09-24', + end: '2015-10-02', + text: 'Werewolf Set', }, 201510: { - start:'2015-10-26', - end:'2015-11-02', - text:'Horned Goblin Set' + start: '2015-10-26', + end: '2015-11-02', + text: 'Horned Goblin Set', }, 301404: { start: '3014-03-24', end: '3014-04-02', - text: 'Steampunk Standard Set' + text: 'Steampunk Standard Set', }, 301405: { start: '3014-04-24', end: '3014-05-02', - text: 'Steampunk Accessories Set' + text: 'Steampunk Accessories Set', }, - wondercon: { // @TODO: extract this out of mystery items + wondercon: { start: '2014-03-24', - end: '2014-04-01' - } + end: '2014-04-01', + }, }; -each(mysterySets, (objectSet, name) => { - objectSet.key = name; - objectSet.items = where(flattenedGear, { - mystery: name - }); +each(mysterySets, (value, key) => { + value.key = key; }); export default mysterySets; diff --git a/common/script/src/content/classes.js b/common/script/src/content/classes.js deleted file mode 100644 index 7966effb1c..0000000000 --- a/common/script/src/content/classes.js +++ /dev/null @@ -1,3 +0,0 @@ -let classes = ['warrior', 'rogue', 'healer', 'wizard']; - -export default classes; diff --git a/common/script/src/content/events.js b/common/script/src/content/events.js deleted file mode 100644 index 26bc8c8fda..0000000000 --- a/common/script/src/content/events.js +++ /dev/null @@ -1,18 +0,0 @@ -// IMPORTANT: The end date should be one to two days AFTER the actual end of -// the event, to allow people in different timezones to still buy the -// event gear up until at least the actual end of the event. - -let events = { - winter: {start:'2013-12-31',end:'2014-02-01'}, - birthday: {start:'2013-01-30',end:'2014-02-01'}, - spring: {start:'2014-03-21',end:'2014-05-01'}, - summer: {start:'2014-06-20',end:'2014-08-01'}, - gaymerx: {start:'2014-07-02',end:'2014-08-01'}, - fall: {start:'2014-09-21',end:'2014-11-01'}, - winter2015: {start:'2014-12-21',end:'2015-02-02'}, - spring2015: {start:'2015-03-20',end:'2015-05-02'}, - summer2015: {start:'2015-06-20',end:'2015-08-02'}, - fall2015: {start:'2015-09-21',end:'2015-11-01'}, -} - -export default events; diff --git a/common/script/src/content/item-list.js b/common/script/src/content/item-list.js deleted file mode 100644 index e56aec678a..0000000000 --- a/common/script/src/content/item-list.js +++ /dev/null @@ -1,56 +0,0 @@ -let itemList = { - 'weapon': { - localeKey: 'weapon', - isEquipment: true - }, - 'armor': { - localeKey: 'armor', - isEquipment: true - }, - 'head': { - localeKey: 'headgear', - isEquipment: true - }, - 'shield': { - localeKey: 'offhand', - isEquipment: true - }, - 'back': { - localeKey: 'back', - isEquipment: true - }, - 'body': { - localeKey: 'body', - isEquipment: true - }, - 'headAccessory': { - localeKey: 'headAccessory', - isEquipment: true - }, - 'eyewear': { - localeKey: 'eyewear', - isEquipment: true - }, - 'hatchingPotions': { - localeKey: 'hatchingPotion', - isEquipment: false - }, - 'eggs': { - localeKey: 'eggSingular', - isEquipment: false - }, - 'quests': { - localeKey: 'quest', - isEquipment: false - }, - 'food': { - localeKey: 'foodText', - isEquipment: false - }, - 'Saddle': { - localeKey: 'foodSaddleText', - isEquipment: false - } -}; - -export default itemList; diff --git a/migrations/20151013_jackolanterns.js b/migrations/20151013_jackolanterns.js index 35da80c1cc..67ff0ac9a2 100644 --- a/migrations/20151013_jackolanterns.js +++ b/migrations/20151013_jackolanterns.js @@ -1,4 +1,4 @@ -var migrationName = 'new_stuff.js'; +var migrationName = '20151013_jackolanterns.js'; var authorName = 'Sabe'; // in case script author needs to know when their ... var authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; //... own data is done diff --git a/migrations/20151116_costume_contest_award.js b/migrations/20151116_costume_contest_award.js new file mode 100644 index 0000000000..25891f9215 --- /dev/null +++ b/migrations/20151116_costume_contest_award.js @@ -0,0 +1,102 @@ +var migrationName = '20151116_costume_contest.js'; +var authorName = 'Sabe'; // in case script author needs to know when their ... +var authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; //... own data is done + +/* + * Award Costume Contest achievement to 2015 winners + */ + +var dbserver = 'localhost:27017'; // FOR TEST DATABASE +// var dbserver = 'username:password@ds031379-a0.mongolab.com:31379'; // FOR PRODUCTION DATABASE +var dbname = 'habitrpg'; + +var mongo = require('mongoskin'); +var _ = require('lodash'); + +var dbUsers = mongo.db(dbserver + '/' + dbname + '?auto_reconnect').collection('users'); + +// specify a query to limit the affected users (empty for all users): +var query = { + _id: { + $in: [ + 'e411dab3-a4ca-414d-bdbd-b6940b3bdeb3', + '35ced5cc-c33a-45c8-93dc-16000ee66fde', + 'ab3f0549-7247-4fd5-975b-efcff98c79c3', + 'b1261fd2-eb25-46b4-97a9-ae7a0dc8a131', + '1f27893f-3808-4724-9725-f46dab93faca', + '216a0c23-6afd-4a5e-b434-d386a10862a2', + '2d6ef231-50b4-4a22-90e7-45eb97147a2c', + '98b8cf4f-89bd-4b0a-988d-02629a217232', + 'c5183dfa-c741-43ce-935e-c6d89b41a030', + '262a7afb-6b57-4d81-88e0-80d2e9f6cbdc', + '33991e0a-de55-4986-ac81-af78491a84de', + '7adf6ada-3c05-4054-b5df-fa7d49d3b9eb', + '235a1cbd-48c5-41b1-afb4-59d2f8645c57', + 'b7617a61-188b-4332-bf4d-32268fa77f2b', + '672c1ce0-9f47-44f0-a3f3-8cc3c6c5a9cb', + 'd0a3217a-7b92-48d6-b39a-b1b1be96702e', + '5ef910dc-1d22-47d9-aa38-a60132c60679', + '370a44c8-e94a-4a2c-91f2-33166926db1f', + '1b0b3ef3-28bd-4046-a49b-e1c83e281baf', + '75b93321-66b9-49bd-9076-052499c1d2bf', + 'd97516e4-81d0-4f60-bf03-95f7330925ab', + '3e13cc79-de38-420d-822e-9e9da309ce6b', + '0e471dc1-ecb0-4388-a891-b873a237d2cf', + 'ca3da398-4f73-4304-b838-af3669ed4cbb', + '44cdf105-8bda-4197-9d1a-1bcb83b4dc84', + '5419830c-b837-4573-ae82-4718ab95b7f1', + 'ac6fbe37-b0dc-40d8-ba14-77dde66fbfa8', + '8789ba18-a498-46b9-b367-3b929a0acb94', + '52fce1a9-9b0a-4e26-95dc-adc12f52e752', + '21bf71ac-399c-470b-abe0-cc49a03b6a8b', + 'f1618ce2-552e-4f23-bc76-e73d63ebedd0', + '4cc0c749-d943-4090-b529-42bc665b7244', + 'e259682e-cb5c-4d94-b472-ceedc66d7484', + 'fa197a4b-e065-4551-803a-c8a5b9970f9d' + ] + } +}; + +// specify fields we are interested in to limit retrieved data (empty if we're not reading data): +var fields = { +}; + +console.warn('Updating users...'); +var progressCount = 1000; +var count = 0; +dbUsers.findEach(query, fields, {batchSize:250}, function(err, user) { + if (err) { return exiting(1, 'ERROR! ' + err); } + if (!user) { + console.warn('All appropriate users found and modified.'); + return displayData(); + } + count++; + + // specify user data to change: + var set = {'migration':migrationName}; + var inc = {'achievements.costumeContests':1}; + + dbUsers.update({_id:user._id}, {$set:set}); + dbUsers.update({_id:user._id}, {$inc:inc}); + + if (count%progressCount == 0) console.warn(count + ' ' + user._id); + if (user._id == authorUuid) console.warn(authorName + ' processed'); +}); + + +function displayData() { + console.warn('\n' + count + ' users processed\n'); + return exiting(0); +} + + +function exiting(code, msg) { + code = code || 0; // 0 = success + if (code && !msg) { msg = 'ERROR!'; } + if (msg) { + if (code) { console.error(msg); } + else { console.log( msg); } + } + process.exit(code); +} + diff --git a/migrations/20151116_costume_contest_to_number.js b/migrations/20151116_costume_contest_to_number.js new file mode 100644 index 0000000000..7121e9bc31 --- /dev/null +++ b/migrations/20151116_costume_contest_to_number.js @@ -0,0 +1,64 @@ +var migrationName = '20151116_costume_contest_to_number.js'; +var authorName = 'Sabe'; // in case script author needs to know when their ... +var authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; //... own data is done + +/* + * Change Costume Contest achievement from Boolean to Number, so people can win repeatedly + */ + +var dbserver = 'localhost:27017'; // FOR TEST DATABASE +// var dbserver = 'username:password@ds031379-a0.mongolab.com:31379'; // FOR PRODUCTION DATABASE +var dbname = 'habitrpg'; + +var mongo = require('mongoskin'); +var _ = require('lodash'); + +var dbUsers = mongo.db(dbserver + '/' + dbname + '?auto_reconnect').collection('users'); + +// specify a query to limit the affected users (empty for all users): +var query = { + 'achievements.costumeContest':true +}; + +// specify fields we are interested in to limit retrieved data (empty if we're not reading data): +var fields = { + 'achievements.costumeContest':1 +}; + +console.warn('Updating users...'); +var progressCount = 1000; +var count = 0; +dbUsers.findEach(query, fields, {batchSize:250}, function(err, user) { + if (err) { return exiting(1, 'ERROR! ' + err); } + if (!user) { + console.warn('All appropriate users found and modified.'); + return displayData(); + } + count++; + + // specify user data to change: + var set = {'achievements.costumeContests':1}; + + dbUsers.update({_id:user._id}, {$set:set}); + + if (count%progressCount == 0) console.warn(count + ' ' + user._id); + if (user._id == authorUuid) console.warn(authorName + ' processed'); +}); + + +function displayData() { + console.warn('\n' + count + ' users processed\n'); + return exiting(0); +} + + +function exiting(code, msg) { + code = code || 0; // 0 = success + if (code && !msg) { msg = 'ERROR!'; } + if (msg) { + if (code) { console.error(msg); } + else { console.log( msg); } + } + process.exit(code); +} + diff --git a/tasks/gulp-tests.js b/tasks/gulp-tests.js index b0c9f91d46..66f99b2169 100644 --- a/tasks/gulp-tests.js +++ b/tasks/gulp-tests.js @@ -406,9 +406,12 @@ gulp.task('test', ['test:all'], () => { `\x1b[36mPending: ${totals[2]}\t` ); - if (totals[1] > 0) throw "ERROR: There are failing tests!" - else { - kill(server); + kill(server); + + if (totals[1] > 0) { + console.error('ERROR: There are failing tests!'); + process.exit(1); + } else { console.log('\n\x1b[36mThanks for helping keep Habitica clean!\x1b[0m'); process.exit(); } diff --git a/test/content/faq.js b/test/content/faq.js index 40b58181e1..7a2d890bde 100644 --- a/test/content/faq.js +++ b/test/content/faq.js @@ -1,22 +1,28 @@ +import { each } from 'lodash'; import { expectValidTranslationString, - describeEachItem } from '../helpers/content.helper'; -import {questions, stillNeedHelp} from '../../common/script/src/content/faq'; +import {questions, stillNeedHelp} from '../../common/script/content/faq'; describe('FAQ Locales', () => { - describeEachItem('Questions', questions, (question, index) => { - it('has a valid question', () => { - expectValidTranslationString(question.question); + describe('Questions', () => { + it('has a valid questions', () => { + each(questions, (question, key) => { + expectValidTranslationString(question.question); + }); }); - it('has a valid ios answer', () => { - expectValidTranslationString(question.ios); + it('has a valid ios answers', () => { + each(questions, (question, key) => { + expectValidTranslationString(question.ios); + }); }); - it('has a valid web answer', () => { - expectValidTranslationString(question.web); + it('has a valid web answers', () => { + each(questions, (question, key) => { + expectValidTranslationString(question.web); + }); }); }); diff --git a/website/src/models/user.js b/website/src/models/user.js index 96df847024..4b0e269e9a 100644 --- a/website/src/models/user.js +++ b/website/src/models/user.js @@ -66,11 +66,12 @@ export let schema = new Schema({ perfect: Number, habitBirthdays: Number, valentine: Number, - costumeContest: Boolean, + costumeContest: Boolean, // Superseded by costumeContests nye: Number, habiticaDays: Number, greeting: Number, thankyou: Number, + costumeContests: Number }, backer: { diff --git a/website/views/shared/new-stuff.jade b/website/views/shared/new-stuff.jade index eeb915db0a..a07d982eca 100644 --- a/website/views/shared/new-stuff.jade +++ b/website/views/shared/new-stuff.jade @@ -1,31 +1,48 @@ -h2 11/11/2015 - NOVEMBER PET QUEST, SHARE SUCCESS, AND HABITICA T-SHIRTS +h2 11/16/2015 - HABITICA STICKERS AND COSTUME CONTEST BADGES! hr tr td - .Pet-Snake-Base.pull-right - h3 November Pet Quest - p There's a new pet quest in the Quest Shop! A slithering foe awaits you among the shimmering sand dunes. Can you defeat the Serpent of Distraction? If so, you'll get some slithering snake pets. - p.small.muted Art by EmeraldOx, Painter Prophet, and Lord Darkly - p.small.muted Writing by Daniel the Bard and felipena - tr - td - .achievement-triadbingo2x.pull-right - h3 Share Success - p Now you can share your success on social media when you hatch a pet, complete a quest, or more! (As always, your task details remain private.) Show off your victories to your friends and bask in some well-deserved praise. - p.small.muted by SabreCat and Lemoness - tr - td - .promo_habitica.pull-right(style='border-radius:25px;margin-left:1em') - h3 Habitica T-Shirts - p Exciting news - for the next three weeks, we are offering Habitica T-shirts via Teespring! Show your Habitica pride in purple or black. We are also offering an EU run for cheaper shipping to Europe! + .achievement-costumeContest2x.pull-right + h3 Costume Contest Badges + p We've awarded all the costume contest badges! Over the coming months, we'll be posting the costumes on our blog, so be sure to follow along. br - p Whether you're getting them for yourself or as a holiday gift, we hope you enjoy these limited-run T-shirts! As always, thanks for supporting Habitica. - + p Important: if you submitted a photo but did NOT receive your badge, it probably means that we were unable to view your entry due to privacy restrictions or other issues. Email your photo to leslie@habitica.com and she will make sure that you get your badge! + br + p Thanks again to all the participants. We were very impressed by your creativity! + tr + td + .promo_habitica_sticker.pull-right + h3 Habitica Stickers + p In addition to our Habitica T-shirts, we are now also selling Habitica Stickers! Display Melior anywhere for extra motivation. + p.small.muted by Redphoenix and Sara Olson + if menuItem !== 'oldNews' hr a(href='/static/old-news', target='_blank') Read older news mixin oldNews + h2 11/11/2015 - NOVEMBER PET QUEST, SHARE SUCCESS, AND HABITICA T-SHIRTS + tr + td + .Pet-Snake-Base.pull-right + h3 November Pet Quest + p There's a new pet quest in the Quest Shop! A slithering foe awaits you among the shimmering sand dunes. Can you defeat the Serpent of Distraction? If so, you'll get some slithering snake pets. + p.small.muted Art by EmeraldOx, Painter Prophet, and Lord Darkly + p.small.muted Writing by Daniel the Bard and felipena + tr + td + .achievement-triadbingo2x.pull-right + h3 Share Success + p Now you can share your success on social media when you hatch a pet, complete a quest, or more! (As always, your task details remain private.) Show off your victories to your friends and bask in some well-deserved praise. + p.small.muted by SabreCat and Lemoness + tr + td + .promo_habitica.pull-right(style='border-radius:25px;margin-left:1em') + h3 Habitica T-Shirts + p Exciting news - for the next three weeks, we are offering Habitica T-shirts via Teespring! Show your Habitica pride in purple or black. We are also offering an EU run for cheaper shipping to Europe! + br + p Whether you're getting them for yourself or as a holiday gift, we hope you enjoy these limited-run T-shirts! As always, thanks for supporting Habitica. + h2 11/5/2015 - HUGE IOS UPDATE AND ANDROID MAILING LIST tr td diff --git a/website/views/shared/profiles/achievements.jade b/website/views/shared/profiles/achievements.jade index 8504eaf754..075affc981 100644 --- a/website/views/shared/profiles/achievements.jade +++ b/website/views/shared/profiles/achievements.jade @@ -229,11 +229,13 @@ div(ng-if='::profile.achievements.quests.burnout') =env.t('achievementBurnoutText') hr -div(ng-if='::profile.achievements.costumeContest') +div(ng-if='::profile.achievements.costumeContests') .achievement.achievement-costumeContest h5=env.t('costumeContest') - small - =env.t('costumeContestText') + small(ng-if='::profile.achievements.costumeContests === 1') + !=env.t('costumeContestText') + small(ng-if='::profile.achievements.costumeContests > 1') + !=env.t('costumeContestTextPlural', {number: "{{::profile.achievements.costumeContests}}"}) hr each card in ['greeting', 'thankyou', 'nye', 'valentine']