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/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/website/src/models/user.js b/website/src/models/user.js
index 323fd50d34..dd8ebe67ce 100644
--- a/website/src/models/user.js
+++ b/website/src/models/user.js
@@ -53,11 +53,12 @@ var UserSchema = new Schema({
perfect: Number,
habitBirthdays: Number,
valentine: Number,
- costumeContest: Boolean,
+ costumeContest: Boolean, // Superseded by costumeContests
nye: Number,
habiticaDays: Number,
greeting: Number,
- thankyou: Number
+ thankyou: Number,
+ costumeContests: Number
},
auth: {
blocked: Boolean,
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']