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']