diff --git a/common/dist/sprites/spritesmith-largeSprites-0.css b/common/dist/sprites/spritesmith-largeSprites-0.css index eecf31076a..a2392bb476 100644 --- a/common/dist/sprites/spritesmith-largeSprites-0.css +++ b/common/dist/sprites/spritesmith-largeSprites-0.css @@ -1,6 +1,6 @@ .2014_Fall_HealerPROMO2 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -1044px -1378px; + background-position: -1331px -1275px; width: 90px; height: 90px; } @@ -12,13 +12,13 @@ } .2014_Fall_RoguePROMO3 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -562px -1378px; + background-position: -758px -1275px; width: 105px; height: 90px; } .2014_Fall_Warrior_PROMO { background-image: url(spritesmith-largeSprites-0.png); - background-position: -1633px -673px; + background-position: -726px -1378px; width: 90px; height: 90px; } @@ -30,13 +30,13 @@ } .promo_backgrounds_armoire_201602 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -1134px -199px; + background-position: -1276px -199px; width: 141px; height: 294px; } .promo_backgrounds_armoire_201603 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -1276px -199px; + background-position: -1134px -199px; width: 141px; height: 294px; } @@ -78,7 +78,7 @@ } .promo_backtoschool { background-image: url(spritesmith-largeSprites-0.png); - background-position: 0px -1378px; + background-position: -302px -1378px; width: 150px; height: 150px; } @@ -90,7 +90,7 @@ } .promo_chairs_glasses { background-image: url(spritesmith-largeSprites-0.png); - background-position: -593px -831px; + background-position: -1633px 0px; width: 51px; height: 210px; } @@ -108,7 +108,7 @@ } .promo_dilatoryDistress { background-image: url(spritesmith-largeSprites-0.png); - background-position: -1633px -491px; + background-position: -999px -1378px; width: 90px; height: 90px; } @@ -126,7 +126,7 @@ } .promo_enchanted_armoire_201507 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -250px -1275px; + background-position: -839px -967px; width: 217px; height: 90px; } @@ -138,7 +138,7 @@ } .promo_enchanted_armoire_201509 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -1633px -946px; + background-position: -1181px -1378px; width: 90px; height: 90px; } @@ -150,7 +150,7 @@ } .promo_enchanted_armoire_201601 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -1633px -1128px; + background-position: 0px -1529px; width: 90px; height: 90px; } @@ -174,7 +174,7 @@ } .promo_haunted_hair { background-image: url(spritesmith-largeSprites-0.png); - background-position: -593px -587px; + background-position: -593px -734px; width: 100px; height: 137px; } @@ -186,19 +186,19 @@ } .promo_mystery_201405 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -1633px -1401px; + background-position: -91px -1529px; width: 90px; height: 90px; } .promo_mystery_201406 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -1633px -212px; + background-position: -635px -1378px; width: 90px; height: 96px; } .promo_mystery_201407 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -645px -901px; + background-position: -1633px -412px; width: 42px; height: 62px; } @@ -210,7 +210,7 @@ } .promo_mystery_201409 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -1135px -1378px; + background-position: -273px -1529px; width: 90px; height: 90px; } @@ -222,31 +222,31 @@ } .promo_mystery_201411 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -1226px -1378px; + background-position: -182px -1529px; width: 90px; height: 90px; } .promo_mystery_201412 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -688px -831px; + background-position: -1633px -345px; width: 42px; height: 66px; } .promo_mystery_201501 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -1057px -967px; + background-position: -1633px -211px; width: 48px; height: 63px; } .promo_mystery_201502 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -1317px -1378px; + background-position: -1363px -1378px; width: 90px; height: 90px; } .promo_mystery_201503 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -1633px -1219px; + background-position: -1272px -1378px; width: 90px; height: 90px; } @@ -258,43 +258,43 @@ } .promo_mystery_201505 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -1633px -1037px; + background-position: -1240px -1275px; width: 90px; height: 90px; } .promo_mystery_201506 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -645px -831px; + background-position: -1633px -275px; width: 42px; height: 69px; } .promo_mystery_201507 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -1633px -106px; + background-position: -544px -1378px; width: 90px; height: 105px; } .promo_mystery_201508 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -950px -1378px; + background-position: -1146px -1275px; width: 93px; height: 90px; } .promo_mystery_201509 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -1633px -764px; + background-position: -908px -1378px; width: 90px; height: 90px; } .promo_mystery_201510 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -856px -1378px; + background-position: -1052px -1275px; width: 93px; height: 90px; } .promo_mystery_201511 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -1633px -582px; + background-position: -817px -1378px; width: 90px; height: 90px; } @@ -312,55 +312,55 @@ } .promo_mystery_201602 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -1633px -400px; + background-position: -1513px -1275px; width: 90px; height: 90px; } .promo_mystery_201603 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -1633px -309px; + background-position: -1422px -1275px; width: 90px; height: 90px; } .promo_mystery_201604 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -762px -1378px; + background-position: -864px -1275px; width: 93px; height: 90px; } .promo_mystery_201605 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -1633px -855px; + background-position: -1090px -1378px; width: 90px; height: 90px; } .promo_mystery_201606 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -1633px 0px; + background-position: -453px -1378px; width: 90px; height: 105px; } .promo_mystery_201607 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -1633px -1310px; + background-position: -1454px -1378px; width: 90px; height: 90px; } .promo_mystery_201608 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -668px -1378px; + background-position: -958px -1275px; width: 93px; height: 90px; } .promo_mystery_3014 { background-image: url(spritesmith-largeSprites-0.png); - background-position: -839px -967px; + background-position: -250px -1275px; width: 217px; height: 90px; } .promo_orca { background-image: url(spritesmith-largeSprites-0.png); - background-position: -593px -725px; + background-position: -593px -872px; width: 105px; height: 105px; } @@ -372,37 +372,37 @@ } .promo_pastel_skin { background-image: url(spritesmith-largeSprites-0.png); - background-position: -331px -1191px; + background-position: 0px -1191px; width: 330px; height: 83px; } .customize-option.promo_pastel_skin { background-image: url(spritesmith-largeSprites-0.png); - background-position: -356px -1206px; + background-position: -25px -1206px; width: 60px; height: 60px; } .promo_peppermint_flame { background-image: url(spritesmith-largeSprites-0.png); - background-position: -452px -882px; + background-position: -306px -220px; width: 140px; height: 147px; } .promo_pet_skins { background-image: url(spritesmith-largeSprites-0.png); - background-position: -306px -220px; + background-position: -452px -882px; width: 140px; height: 147px; } .customize-option.promo_pet_skins { background-image: url(spritesmith-largeSprites-0.png); - background-position: -331px -235px; + background-position: -477px -897px; width: 60px; height: 60px; } .promo_shimmer_hair { background-image: url(spritesmith-largeSprites-0.png); - background-position: 0px -1191px; + background-position: -331px -1191px; width: 330px; height: 83px; } @@ -438,13 +438,19 @@ } .promo_staff_spotlight_Lemoness { background-image: url(spritesmith-largeSprites-0.png); - background-position: -1004px -392px; + background-position: -593px -439px; width: 102px; height: 146px; } +.promo_staff_spotlight_Viirus { + background-image: url(spritesmith-largeSprites-0.png); + background-position: -1004px -392px; + width: 119px; + height: 147px; +} .promo_staff_spotlight_paglias { background-image: url(spritesmith-largeSprites-0.png); - background-position: -593px -439px; + background-position: -593px -586px; width: 99px; height: 147px; } @@ -474,7 +480,7 @@ } .promo_takethis_armor { background-image: url(spritesmith-largeSprites-0.png); - background-position: -649px -1275px; + background-position: -593px -978px; width: 114px; height: 87px; } @@ -522,7 +528,7 @@ } .npc_viirus { background-image: url(spritesmith-largeSprites-0.png); - background-position: -453px -1378px; + background-position: -649px -1275px; width: 108px; height: 90px; } @@ -540,7 +546,7 @@ } .scene_phone_peek { background-image: url(spritesmith-largeSprites-0.png); - background-position: -302px -1378px; + background-position: 0px -1378px; width: 150px; height: 150px; } diff --git a/common/dist/sprites/spritesmith-largeSprites-0.png b/common/dist/sprites/spritesmith-largeSprites-0.png index 683e88e6c7..ed5335eb03 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_staff_spotlight_Viirus.png b/common/img/sprites/spritesmith_large/promo/promo_staff_spotlight_Viirus.png new file mode 100644 index 0000000000..c248872867 Binary files /dev/null and b/common/img/sprites/spritesmith_large/promo/promo_staff_spotlight_Viirus.png differ diff --git a/common/locales/en/gear.json b/common/locales/en/gear.json index 46b238b388..b3cf0999cf 100644 --- a/common/locales/en/gear.json +++ b/common/locales/en/gear.json @@ -148,7 +148,7 @@ "weaponSpecialSummer2015MageNotes": "Hidden power glimmers in the jewels of this staff. Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition 2015 Summer Gear.", "weaponSpecialSummer2015HealerText": "Wand of the Waves", "weaponSpecialSummer2015HealerNotes": "Cures seasickness and sea sickness! Increases Intelligence by <%= int %>. Limited Edition 2015 Summer Gear.", - + "weaponSpecialFall2015RogueText": "Bat-tle Ax", "weaponSpecialFall2015RogueNotes": "Fearsome To-Dos cower before the flapping of this ax. Increases Strength by <%= str %>. Limited Edition 2015 Autumn Gear.", "weaponSpecialFall2015WarriorText": "Wooden Plank", @@ -184,7 +184,7 @@ "weaponSpecialSummer2016MageNotes": "All the power of the seas filters through this staff. Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition 2016 Summer Gear.", "weaponSpecialSummer2016HealerText": "Healing Trident", "weaponSpecialSummer2016HealerNotes": "One spike harms, the other heals. Increases Intelligence by <%= int %>. Limited Edition 2016 Summer Gear.", - + "weaponMystery201411Text": "Pitchfork of Feasting", "weaponMystery201411Notes": "Stab your enemies or dig in to your favorite foods - this versatile pitchfork does it all! Confers no benefit. November 2014 Subscriber Item.", "weaponMystery201502Text": "Shimmery Winged Staff of Love and Also Truth", @@ -365,7 +365,7 @@ "armorSpecialSummer2015MageNotes": "Hidden power resides in the puffs of these sleeves. Increases Intelligence by <%= int %>. Limited Edition 2015 Summer Gear.", "armorSpecialSummer2015HealerText": "Sailor's Armor", "armorSpecialSummer2015HealerNotes": "This armor lets everyone know that you are an honest merchant sailor who would never dream of behaving like a scalawag. Increases Constitution by <%= con %>. Limited Edition 2015 Summer Gear.", - + "armorSpecialFall2015RogueText": "Bat-tle Armor", "armorSpecialFall2015RogueNotes": "Fly into bat-tle! Increases Perception by <%= per %>. Limited Edition 2015 Autumn Gear.", "armorSpecialFall2015WarriorText": "Scarecrow Armor", @@ -374,7 +374,7 @@ "armorSpecialFall2015MageNotes": "Every stitch in this armor shimmers with enchantment. Increases Intelligence by <%= int %>. Limited Edition 2015 Autumn Gear.", "armorSpecialFall2015HealerText": "Potioner Robes", "armorSpecialFall2015HealerNotes": "What? Of course that was a potion of constitution. No, you are definitely not turning into a frog! Don't be ribbiticulous. Increases Constitution by <%= con %>. Limited Edition 2015 Autumn Gear.", - + "armorSpecialWinter2016RogueText": "Cocoa Armor", "armorSpecialWinter2016RogueNotes": "This leather armor keeps you nice and toasty. Is it actually made from cocoa? You'll never tell. Increases Perception by <%= per %>. Limited Edition 2015-2016 Winter Gear.", "armorSpecialWinter2016WarriorText": "Snowman Suit", @@ -401,7 +401,7 @@ "armorSpecialSummer2016MageNotes": "This slippery garment transforms its wearer into a real Dolphin Mage! Increases Intelligence by <%= int %>. Limited Edition 2016 Summer Gear.", "armorSpecialSummer2016HealerText": "Seahorse Tail", "armorSpecialSummer2016HealerNotes": "This spiky garment transforms its wearer into a real Seahorse Healer! Increases Constitution by <%= con %>. Limited Edition 2016 Summer Gear.", - + "armorMystery201402Text": "Messenger Robes", "armorMystery201402Notes": "Shimmering and strong, these robes have many pockets to carry letters. Confers no benefit. February 2014 Subscriber Item.", "armorMystery201403Text": "Forest Walker Armor", @@ -845,14 +845,14 @@ "shieldSpecialSummer2015WarriorNotes": "Crafted of deep-ocean metal by the artisans of Dilatory, this shield shines like the sand and the sea. Increases Constitution by <%= con %>. Limited Edition 2015 Summer Gear.", "shieldSpecialSummer2015HealerText": "Strapping Shield", "shieldSpecialSummer2015HealerNotes": "Use this shield to bash away bilge rats. Increases Constitution by <%= con %>. Limited Edition 2015 Summer Gear.", - + "shieldSpecialFall2015RogueText": "Bat-tle Ax", "shieldSpecialFall2015RogueNotes": "Fearsome To-Dos cower before the flapping of this ax. Increases Strength by <%= str %>. Limited Edition 2015 Autumn Gear.", "shieldSpecialFall2015WarriorText": "Birdseed Bag", "shieldSpecialFall2015WarriorNotes": "It's true that you're supposed to be SCARING the crows, but there's nothing wrong with making friends! Increases Constitution by <%= con %>. Limited Edition 2015 Autumn Gear.", "shieldSpecialFall2015HealerText": "Stirring Stick", "shieldSpecialFall2015HealerNotes": "This stick can stir anything without melting, dissolving, or bursting into flame! It can also be used to fiercely poke enemy tasks. Increases Constitution by <%= con %>. Limited Edition 2015 Autumn Gear.", - + "shieldSpecialWinter2016RogueText": "Cocoa Mug", "shieldSpecialWinter2016RogueNotes": "Warming drink, or boiling projectile? You decide... Increases Strength by <%= str %>. Limited Edition 2015-2016 Winter Gear.", "shieldSpecialWinter2016WarriorText": "Sled Shield", @@ -873,7 +873,7 @@ "shieldSpecialSummer2016WarriorNotes": "Bite those tough tasks with this toothy shield! Increases Constitution by <%= con %>. Limited Edition 2016 Summer Gear.", "shieldSpecialSummer2016HealerText": "Sea Star Shield", "shieldSpecialSummer2016HealerNotes": "Sometimes mistakenly called a Starfish Shield. Increases Constitution by <%= con %>. Limited Edition 2016 Summer Gear.", - + "shieldMystery201601Text": "Resolution Slayer", "shieldMystery201601Notes": "This blade can be used to parry away all distractions. Confers no benefit. January 2016 Subscriber Item.", "shieldMystery301405Text": "Clock Shield", diff --git a/common/locales/en/quests.json b/common/locales/en/quests.json index 307c5bbf6b..ea8751c887 100644 --- a/common/locales/en/quests.json +++ b/common/locales/en/quests.json @@ -48,6 +48,8 @@ "leaveQuest": "Leave Quest", "sureLeave": "Are you sure you want to leave the active quest? All your quest progress will be lost.", "questOwner": "Quest Owner", + "questTaskDamage": "+<%= damage %> pending damage to boss", + "questTaskCollection": "<%= items %> items collected today", "questOwnerNotInPendingQuest": "The quest owner has left the quest and can no longer begin it. It is recommended that you cancel it now. The quest owner will retain possession of the quest scroll.", "questOwnerNotInRunningQuest": "The quest owner has left the quest. You can abort the quest if you need to. You can also allow it to keep running and all remaining participants will receive the quest rewards when the quest finishes.", "questOwnerNotInPendingQuestParty": "The quest owner has left the party and can no longer begin the quest. It is recommended that you cancel it now. The quest scroll will be returned to the quest owner.", diff --git a/common/locales/en/settings.json b/common/locales/en/settings.json index 047c7d475b..b24e06f200 100644 --- a/common/locales/en/settings.json +++ b/common/locales/en/settings.json @@ -68,6 +68,7 @@ "APIv3": "API v3", "APIText": "Copy these for use in third party applications. However, think of your API Token like a password, and do not share it publicly. You may occasionally be asked for your User ID, but never post your API Token where others can see it, including on Github.", "APIToken": "API Token (this is a password - see warning above!)", + "APITokenWarning": "If you need a new API Token (e.g., if you accidentally shared it), email admin@habitica.com with your User ID and current Token. Once it is reset you will need to re-authorize everything by logging out of the website and mobile app and by providing the new Token to any other Habitica tools that you use.", "thirdPartyApps": "Third Party Apps", "dataToolDesc": "A webpage that shows you certain information from your Habitica account, such as statistics about your tasks, equipment, and skills.", "beeminder": "Beeminder", diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 6ce3e634f0..70efcaf9b3 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1,6 +1,6 @@ { "name": "habitica", - "version": "3.38.0", + "version": "3.39.1", "dependencies": { "abbrev": { "version": "1.0.9", diff --git a/package.json b/package.json index f13617c618..3583fc46d9 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "habitica", "description": "A habit tracker app which treats your goals like a Role Playing Game.", - "version": "3.38.0", + "version": "3.39.1", "main": "./website/server/index.js", "dependencies": { "@slack/client": "slackhq/node-slack-sdk#2ee794cd31326c54f38c518eef2b9d223327d939", diff --git a/tasks/gulp-tests.js b/tasks/gulp-tests.js index e7dd6e01f0..37b6a5423c 100644 --- a/tasks/gulp-tests.js +++ b/tasks/gulp-tests.js @@ -90,7 +90,10 @@ gulp.task('test:sanity', (cb) => { let runner = exec( testBin(SANITY_TEST_COMMAND), (err, stdout, stderr) => { - cb(err); + if (err) { + process.exit(1); + } + cb(); } ); pipe(runner); @@ -100,7 +103,10 @@ gulp.task('test:common', ['test:prepare:build'], (cb) => { let runner = exec( testBin(COMMON_TEST_COMMAND), (err, stdout, stderr) => { - cb(err); + if (err) { + process.exit(1); + } + cb(); } ); pipe(runner); @@ -135,7 +141,10 @@ gulp.task('test:content', ['test:prepare:build'], (cb) => { testBin(CONTENT_TEST_COMMAND), CONTENT_OPTIONS, (err, stdout, stderr) => { - cb(err); + if (err) { + process.exit(1); + } + cb(); } ); pipe(runner); @@ -170,7 +179,7 @@ gulp.task('test:server_side', ['test:prepare:build'], (cb) => { let runner = exec( testBin(SERVER_SIDE_TEST_COMMAND), (err, stdout, stderr) => { - cb(err); + cb(err); } ); pipe(runner); @@ -196,7 +205,10 @@ gulp.task('test:karma', ['test:prepare:build'], (cb) => { let runner = exec( testBin(KARMA_TEST_COMMAND), (err, stdout) => { - cb(err); + if (err) { + process.exit(1); + } + cb(); } ); pipe(runner); @@ -206,7 +218,7 @@ gulp.task('test:karma:watch', ['test:prepare:build'], (cb) => { let runner = exec( testBin(`${KARMA_TEST_COMMAND}:watch`), (err, stdout) => { - cb(err); + cb(err); } ); pipe(runner); @@ -243,7 +255,10 @@ gulp.task('test:e2e', ['test:prepare', 'test:prepare:server'], (cb) => { 'npm run test:e2e', (err, stdout, stderr) => { support.forEach(kill); - cb(err); + if (err) { + process.exit(1); + } + cb(); } ); pipe(runner); @@ -282,7 +297,12 @@ gulp.task('test:e2e:safe', ['test:prepare', 'test:prepare:server'], (cb) => { gulp.task('test:api-v3:unit', (done) => { let runner = exec( testBin('mocha test/api/v3/unit --recursive'), - (err, stdout, stderr) => done(err) + (err, stdout, stderr) => { + if (err) { + process.exit(1); + } + done(); + } ) pipe(runner); @@ -296,7 +316,12 @@ gulp.task('test:api-v3:integration', (done) => { let runner = exec( testBin('mocha test/api/v3/integration --recursive'), {maxBuffer: 500*1024}, - (err, stdout, stderr) => done(err) + (err, stdout, stderr) => { + if (err) { + process.exit(1); + } + done(); + } ) pipe(runner); @@ -334,4 +359,4 @@ gulp.task('test:api-v3', (done) => { 'test:api-v3:integration', done ); -}); \ No newline at end of file +}); diff --git a/test/api/v3/integration/tags/GET-tags.test.js b/test/api/v3/integration/tags/GET-tags.test.js index 7a24963474..ef080a2ee7 100644 --- a/test/api/v3/integration/tags/GET-tags.test.js +++ b/test/api/v3/integration/tags/GET-tags.test.js @@ -6,7 +6,9 @@ describe('GET /tags', () => { let user; before(async () => { - user = await generateUser(); + user = await generateUser({ + tags: [], + }); }); it('returns all user\'s tags', async () => { @@ -15,8 +17,8 @@ describe('GET /tags', () => { let tags = await user.get('/tags'); - expect(tags.length).to.equal(2 + 3); // + 3 because 1 is a default task - expect(tags[tags.length - 2].name).to.equal(tag1.name); - expect(tags[tags.length - 1].name).to.equal(tag2.name); + expect(tags.length).to.equal(2); + expect(tags[0].name).to.equal(tag1.name); + expect(tags[1].name).to.equal(tag2.name); }); }); diff --git a/test/api/v3/integration/tags/POST-tag-reorder.test.js b/test/api/v3/integration/tags/POST-tag-reorder.test.js index 0710cecf3e..5d12eb974f 100644 --- a/test/api/v3/integration/tags/POST-tag-reorder.test.js +++ b/test/api/v3/integration/tags/POST-tag-reorder.test.js @@ -7,7 +7,9 @@ describe('POST /reorder-tags', () => { let user; before(async () => { - user = await generateUser(); + user = await generateUser({ + tags: [], + }); }); it('returns error when no parameters are provided', async () => { @@ -35,10 +37,10 @@ describe('POST /reorder-tags', () => { await user.post('/tags', {name: tag2Name}); await user.sync(); - await user.post('/reorder-tags', {tagId: user.tags[4].id, to: 3}); + await user.post('/reorder-tags', {tagId: user.tags[0].id, to: 1}); await user.sync(); - expect(user.tags[3].name).to.equal(tag2Name); - expect(user.tags[4].name).to.equal(tag1Name); + expect(user.tags[0].name).to.equal(tag2Name); + expect(user.tags[1].name).to.equal(tag1Name); }); }); diff --git a/website/client/css/avatar.styl b/website/client/css/avatar.styl index 690dc1bb79..d2c26eb408 100644 --- a/website/client/css/avatar.styl +++ b/website/client/css/avatar.styl @@ -36,7 +36,7 @@ future re: pets and whatnot, this is just temporary. margin: 0 // need this b/c of bootstrap, remove or reset later position: relative cursor: pointer - + // Username and Level .avatar-level, .avatar-name position: absolute @@ -56,17 +56,17 @@ future re: pets and whatnot, this is just temporary. left: 4px opacity: 0 // Hide username by default transition: opacity 0.2s ease-out - + // Show username if not using mount or background &.isUser.noBackgroundImage:not(.hasMount) .avatar-name opacity: 1 - + // Show username on hover and focus &:hover, &:focus .avatar-name opacity: 1 - + // Sprite positioning – Base styles .character-sprites width: 6.428571429em // 90px @@ -75,13 +75,13 @@ future re: pets and whatnot, this is just temporary. span position: absolute padding-top: 2em - + // Sprite positioning – Position avatar sprite differently if they have a pet or a mount &.hasPet - padding-top: 1.75em + padding-top: 1.75em &.hasMount padding-top:0em - + // Backgrounds – Set a background color when no background image is set &.noBackgroundImage background: darken($color-herobox, 8%) diff --git a/website/client/css/challenges.styl b/website/client/css/challenges.styl index 23add6cd34..ccf1f3edc0 100644 --- a/website/client/css/challenges.styl +++ b/website/client/css/challenges.styl @@ -14,7 +14,7 @@ ul.challenge-accordion-header-specs margin-right: 5px; #back-to-challenges, #create-challenge-btn - margin-bottom: 10px + margin-bottom: 10px #challenges-filters h3 - margin-top: 0px; + margin-top: 0px; diff --git a/website/client/css/classes.styl b/website/client/css/classes.styl index 9c1cb75242..7c7a36d6be 100644 --- a/website/client/css/classes.styl +++ b/website/client/css/classes.styl @@ -14,4 +14,4 @@ html.applying-action, html.applying-action * .cast-target:hover border: 5px solid green !important .selected-class - background-color: green \ No newline at end of file + background-color: green diff --git a/website/client/css/customizer.styl b/website/client/css/customizer.styl index db55182703..853f743561 100644 --- a/website/client/css/customizer.styl +++ b/website/client/css/customizer.styl @@ -2,7 +2,7 @@ .avatar-window float: right; - margin: 0 1em 0 0 + margin: 0 1em 0 0 menu padding: 0; @@ -13,7 +13,7 @@ menu width: 100%; list-style: none; padding-bottom: 10px - + menu:before content: attr(label); display: block; @@ -33,7 +33,7 @@ menu border: 0px solid grey background-color: hsl(0, 0%, 93%) margin-bottom: 10px - + -webkit-transition: background-color 0.5s ease-out -moz-transition: background-color 0.5s ease-out transition: background-color 0.5s ease-out @@ -43,10 +43,10 @@ menu -webkit-transition: none -moz-transition: none transition: none - + .customize-option:not(:last-of-type) margin-right: 10px - + @media (max-width: 480px) { .avatar-window { diff --git a/website/client/css/filters.styl b/website/client/css/filters.styl index 0befc47658..932c2225b3 100644 --- a/website/client/css/filters.styl +++ b/website/client/css/filters.styl @@ -6,7 +6,7 @@ ul float: left list-style: none - margin-right: 1em + margin-right: 1em .filters-controls @extend $hrpg-button-bar-with-heading hrpg-button-bar-mixin($color-options-menu) @@ -32,7 +32,7 @@ margin-top: -.5em markdown display: inline-block - .hrpg-input-group + .hrpg-input-group display: inline-block margin-right: 0.618em @extend $hrpg-button-with-input diff --git a/website/client/css/footer.styl b/website/client/css/footer.styl index ad03be3f23..160bf3e81d 100644 --- a/website/client/css/footer.styl +++ b/website/client/css/footer.styl @@ -6,4 +6,4 @@ margin-top: 40px padding-bottom: 20px border-top: 1px solid #e5e5e5 - background-color: #f5f5f5 \ No newline at end of file + background-color: #f5f5f5 diff --git a/website/client/css/game-pane.styl b/website/client/css/game-pane.styl index 300653a383..eb37c2cc2d 100644 --- a/website/client/css/game-pane.styl +++ b/website/client/css/game-pane.styl @@ -38,10 +38,10 @@ .long-title .tooltip white-space: normal - + span.time white-space: nowrap - + .chat-plus-one opacity: 0 background-color: #eee @@ -62,18 +62,18 @@ &.highlight background: #EEE - + label margin-right:5px - + .float-label float:left position:absolute top:17px; - + .hidden-label visibility:hidden - + .scrollable-message max-height: 6.472em overflow-y:auto @@ -82,7 +82,7 @@ // 20px normally margin-top:5px margin-bottom:5px - + .expander float: right position: absolute @@ -98,11 +98,11 @@ .own-message border-left: 4px solid #333 padding-left: 2px - + markdown p:first-child display:inline - + img max-height:50px vertical-align:top @@ -168,12 +168,12 @@ hrpg-contributor-label-mixin($hrpg-contributor-color) .buttonList li margin: 5px - + .option-group .option-time padding: 0px 5px // Autocomplete [TODO] make this nicer -.list-at-user +.list-at-user width: 100% max-width: 120px position: absolute @@ -182,24 +182,24 @@ hrpg-contributor-label-mixin($hrpg-contributor-color) z-index: 10 -.list-at-user li +.list-at-user li line-height:14px border-bottom: 1px solid #a4a4a4 list-style-type: none -.list-at-user li:hover +.list-at-user li:hover cursor: pointer background: #b9dff4 -.list-at-user li span +.list-at-user li span margin: 2px font-size: 11.844px margin-left: 5px display: inline-block -.list-cur +.list-cur background: #b9dff4 diff --git a/website/client/css/index.styl b/website/client/css/index.styl index c9bea9f337..2b4bc2b11a 100644 --- a/website/client/css/index.styl +++ b/website/client/css/index.styl @@ -49,7 +49,7 @@ hr /* Customizations to make footer sticky */ -html, body +html, body height: 100% #wrap @@ -59,7 +59,7 @@ html, body height: auto !important @media (max-width: 600px) - #wrap + #wrap margin-top: 0 padding: 0 4px; overflow-x: hidden; @@ -67,7 +67,7 @@ html, body /* Gems -------------------------------------------------- */ /* Adaptation of GH's social-count for Gems */ - + .gem-cost border: 1px solid #D4D4D4; font-size: 11px; @@ -79,7 +79,7 @@ html, body color: #333; background-color: #FAFAFA; position: relative; - + .gem-cost::before content: "" display: block @@ -151,9 +151,9 @@ a.label .muted color: #999 -.btn +.btn margin-right: 5px -.panel-heading .btn // Fixing improper vertical alignment of buttons in panel headers +.panel-heading .btn // Fixing improper vertical alignment of buttons in panel headers margin-top: -8px .vertical-align diff --git a/website/client/css/inventory.styl b/website/client/css/inventory.styl index 39db3d7ee1..9ba3728bd9 100644 --- a/website/client/css/inventory.styl +++ b/website/client/css/inventory.styl @@ -39,7 +39,7 @@ .stable .static-popover max-width: 550px -menu.pets div +menu.pets div display: inline-block vertical-align: top diff --git a/website/client/css/loading-screen.styl b/website/client/css/loading-screen.styl index 2d39337421..f06c440706 100644 --- a/website/client/css/loading-screen.styl +++ b/website/client/css/loading-screen.styl @@ -61,10 +61,10 @@ animation-delay: -0.20s @keyframes sk-bouncedelay - 0%, 80%, 100% { + 0%, 80%, 100% { transform: scale(0) opacity: 0 - } 40% { + } 40% { transform: scale(1.0) opacity: 1 } diff --git a/website/client/css/scrollbars.styl b/website/client/css/scrollbars.styl index 8b366133bf..225f820652 100644 --- a/website/client/css/scrollbars.styl +++ b/website/client/css/scrollbars.styl @@ -79,4 +79,4 @@ } .task-column::-webkit-scrollbar-corner { background: transparent -} \ No newline at end of file +} diff --git a/website/client/css/static.styl b/website/client/css/static.styl index 7134a2b1e7..f18fe74966 100644 --- a/website/client/css/static.styl +++ b/website/client/css/static.styl @@ -25,7 +25,7 @@ body .marketing text-align: center - + .static-old-news h2 font-weight: 700 @@ -38,7 +38,7 @@ body margin-top: 20px .pull-right margin-left: 5px - + #frontpage-play-button //box-shadow: 0 0 40px #494141; display: inline diff --git a/website/client/js/config.js b/website/client/js/config.js index dc08f1a15a..1c145d5475 100644 --- a/website/client/js/config.js +++ b/website/client/js/config.js @@ -27,12 +27,12 @@ angular.module('habitrpg') function verifyNewNotifications (response) { // Ignore CRON notifications for manual syncs - var isUserLoaded = $rootScope.appLoaded === true; + var isUserLoaded = $rootScope.appLoaded === true; if (response && response.data && response.data.notifications && response.data.notifications.length > 0) { $rootScope.userNotifications = response.data.notifications.filter(function (notification) { if (isUserLoaded && notification.type === 'CRON') { - // If the user is already loaded, do not show the notification, syncing will show it + // If the user is already loaded, do not show the notification, syncing will show it // (the user will be synced automatically) $rootScope.User.readNotification(notification.id); return false; diff --git a/website/client/js/controllers/authCtrl.js b/website/client/js/controllers/authCtrl.js index 4bd7528548..4e5b7c65b4 100644 --- a/website/client/js/controllers/authCtrl.js +++ b/website/client/js/controllers/authCtrl.js @@ -30,7 +30,7 @@ angular.module('habitrpg') } else if (status === 400 && data.errors && _.isArray(data.errors)) { // bad requests data.errors.forEach(function (err) { $window.alert(err.message); - }); + }); } else if (!!data && !!data.error) { $window.alert(data.message); } else { diff --git a/website/client/js/controllers/headerCtrl.js b/website/client/js/controllers/headerCtrl.js index 390d2c92a9..33108a2a64 100644 --- a/website/client/js/controllers/headerCtrl.js +++ b/website/client/js/controllers/headerCtrl.js @@ -58,7 +58,7 @@ habitrpg.controller("HeaderCtrl", ['$scope', 'Groups', 'User', } ) if (User.user.party.orderAscending == "descending") { - result = result.reverse() + result = result.reverse() } return result; diff --git a/website/client/js/controllers/menuCtrl.js b/website/client/js/controllers/menuCtrl.js index 87520febf4..51220be532 100644 --- a/website/client/js/controllers/menuCtrl.js +++ b/website/client/js/controllers/menuCtrl.js @@ -1,8 +1,8 @@ 'use strict'; angular.module('habitrpg') - .controller('MenuCtrl', ['$scope', '$rootScope', '$http', 'Chat', - function($scope, $rootScope, $http, Chat) { + .controller('MenuCtrl', ['$scope', '$rootScope', '$http', 'Chat', 'Content', + function($scope, $rootScope, $http, Chat, Content) { $scope.logout = function() { localStorage.clear(); @@ -26,6 +26,41 @@ angular.module('habitrpg') } } + $scope.hasQuestProgress = function() { + var user = $scope.user; + if (user.party.quest) { + var userQuest = Content.quests[user.party.quest.key]; + + if (!userQuest) { + return false; + } + if (userQuest.boss && user.party.quest.progress.up > 0) { + return true; + } + if (userQuest.collect && user.party.quest.progress.collectedItems > 0) { + return true; + } + } + return false; + }; + + $scope.getQuestInfo = function() { + var user = $scope.user; + var questInfo = {}; + if (user.party.quest) { + var userQuest = Content.quests[user.party.quest.key]; + + questInfo.title = userQuest.text(); + + if (userQuest.boss) { + questInfo.body = window.env.t('questTaskDamage', { damage: user.party.quest.progress.up.toFixed(1) }); + } else if (userQuest.collect) { + questInfo.body = window.env.t('questTaskCollection', { items: user.party.quest.progress.collectedItems }); + } + } + return questInfo; + }; + $scope.clearMessages = Chat.markChatSeen; $scope.clearCards = Chat.clearCards; diff --git a/website/client/js/controllers/sortableInventoryCtrl.js b/website/client/js/controllers/sortableInventoryCtrl.js index 7bf2641b02..e0a14c4fa4 100644 --- a/website/client/js/controllers/sortableInventoryCtrl.js +++ b/website/client/js/controllers/sortableInventoryCtrl.js @@ -18,7 +18,7 @@ habitrpg.controller('SortableInventoryController', ['$scope', $scope.setGrouping = function (grouping) { $scope.groupingChoice = grouping; }; - + $scope.orderChoice = 'set'; $scope.setOrder($scope.orderChoice); }]); diff --git a/website/client/js/env.js b/website/client/js/env.js index cdb40e695e..3e25af7224 100644 --- a/website/client/js/env.js +++ b/website/client/js/env.js @@ -2,7 +2,7 @@ window.env = window.env || {}; //FIX tests -// If Moment.js is loaded, +// If Moment.js is loaded, if(window.moment && window.env.language && window.env.language.momentLang && window.env.language.momentLangCode){ var head = document.getElementsByTagName('head')[0]; var script = document.createElement('script'); @@ -13,4 +13,4 @@ if(window.moment && window.env.language && window.env.language.momentLang && win } window.habitrpgShared.i18n.strings = window.env.translations; -window.env.t = window.habitrpgShared.i18n.t; \ No newline at end of file +window.env.t = window.habitrpgShared.i18n.t; diff --git a/website/client/js/services/pusherService.js b/website/client/js/services/pusherService.js index 2cea4488d9..491a99263b 100644 --- a/website/client/js/services/pusherService.js +++ b/website/client/js/services/pusherService.js @@ -70,7 +70,7 @@ angular.module('habitrpg') // When the user correctly enters the party channel partyChannel.bind('pusher:subscription_succeeded', function(pusherMembers) { // Wait for the party to be loaded - Groups.party(reconnecting ? true : false).then(function (party) { + Groups.party(reconnecting).then(function (party) { // If we just reconnected after some inactivity, sync the party if (reconnecting === true) { _.assign($rootScope.party, party); @@ -182,6 +182,7 @@ angular.module('habitrpg') partyId = user && $rootScope.user.party && $rootScope.user.party._id; if (!partyId) return; + // See if another tab is already connected to Pusher if (!localStorage.getItem(tabIdKey)) { connectToPusher(partyId); } diff --git a/website/server/controllers/api-v3/iap.js b/website/server/controllers/api-v3/iap.js index daaef0cef8..a626817c82 100644 --- a/website/server/controllers/api-v3/iap.js +++ b/website/server/controllers/api-v3/iap.js @@ -1,4 +1,4 @@ // NOTE: this file is only used because the mobile apps expect IAP routes // to be found at /api/v3/iap instead of /iap. -module.exports = require('../top-level/payments/iap'); \ No newline at end of file +module.exports = require('../top-level/payments/iap'); diff --git a/website/server/controllers/top-level/qrcodes.js b/website/server/controllers/top-level/qrcodes.js index da45e4ea04..e32b5914d2 100644 --- a/website/server/controllers/top-level/qrcodes.js +++ b/website/server/controllers/top-level/qrcodes.js @@ -14,4 +14,4 @@ api.redirectProfileQRCode = { }, }; -module.exports = api; \ No newline at end of file +module.exports = api; diff --git a/website/server/libs/inAppPurchases.js b/website/server/libs/inAppPurchases.js index 5f1d16b135..498fc01ae0 100644 --- a/website/server/libs/inAppPurchases.js +++ b/website/server/libs/inAppPurchases.js @@ -19,4 +19,4 @@ module.exports = { getPurchaseData: iap.getPurchaseData, GOOGLE: iap.GOOGLE, APPLE: iap.APPLE, -}; \ No newline at end of file +}; diff --git a/website/server/libs/password.js b/website/server/libs/password.js index c825083936..95b7cef7db 100644 --- a/website/server/libs/password.js +++ b/website/server/libs/password.js @@ -15,4 +15,4 @@ export function makeSalt (len = 10) { .randomBytes(Math.ceil(len / 2)) .toString('hex') .substring(0, len); -} \ No newline at end of file +} diff --git a/website/server/libs/pusher.js b/website/server/libs/pusher.js index 74ac1e10a5..76c7602008 100644 --- a/website/server/libs/pusher.js +++ b/website/server/libs/pusher.js @@ -39,4 +39,4 @@ let api = { }, }; -module.exports = api; \ No newline at end of file +module.exports = api; diff --git a/website/server/libs/setupMongoose.js b/website/server/libs/setupMongoose.js index 41ba9e5358..7e5da1e3ff 100644 --- a/website/server/libs/setupMongoose.js +++ b/website/server/libs/setupMongoose.js @@ -25,4 +25,4 @@ if (MAINTENANCE_MODE !== 'true') { }); autoinc.init(db); -} \ No newline at end of file +} diff --git a/website/server/models/user/methods.js b/website/server/models/user/methods.js index ea53bf30c3..c3f2157d8b 100644 --- a/website/server/models/user/methods.js +++ b/website/server/models/user/methods.js @@ -51,4 +51,4 @@ schema.methods.addComputedStatsToJSONObj = function addComputedStatsToUserJSONOb obj.stats.toNextLevel = common.tnl(this.stats.lvl); obj.stats.maxHealth = common.maxHealth; obj.stats.maxMP = common.statsComputed(this).maxMP; -}; \ No newline at end of file +}; diff --git a/website/views/avatar-static.jade b/website/views/avatar-static.jade index 58e11ae31a..a1e1e034a8 100644 --- a/website/views/avatar-static.jade +++ b/website/views/avatar-static.jade @@ -8,13 +8,13 @@ html(ng-app="habitrpg") meta(name='viewport', content='width=device-width, initial-scale=1.0') meta(name='apple-mobile-web-app-capable', content='yes') - // .slice(0).push('user') is to clone the array, + // .slice(0).push('user') is to clone the array, // to be surethat `user` is never available to other requests' env // TODO does it need only `user` in clientVars, not the others? - clientVars = env.clientVars.slice(0); clientVars.push('user'); - + script(type='text/javascript'). window.env = !{JSON.stringify(env._.pick(env, clientVars))}; diff --git a/website/views/options/settings.jade b/website/views/options/settings.jade index 7cb7e98227..20c20c54da 100644 --- a/website/views/options/settings.jade +++ b/website/views/options/settings.jade @@ -230,6 +230,7 @@ script(type='text/ng-template', id='partials/options.settings.api.html') pre.prettyprint {{user.id}} h6=env.t('APIToken') pre.prettyprint {{User.settings.auth.apiToken}} + small!=env.t("APITokenWarning") h6=env.t('qrCode') img.img-rendering-auto(src='https://chart.googleapis.com/chart?cht=qr&chs=200x200&chl=%7B%22address%22%3A%22https%3A%2F%2Fhabitrpg.com%22%2C%22user%22%3A%22{{user.id}}%22%2C%22key%22%3A%22{{User.settings.auth.apiToken}}%22%7D&choe=UTF-8&chld=L', alt='qrcode') br diff --git a/website/views/options/social/quests/bossStats.jade b/website/views/options/social/quests/bossStats.jade index c9e4728743..65e6e973e8 100644 --- a/website/views/options/social/quests/bossStats.jade +++ b/website/views/options/social/quests/bossStats.jade @@ -10,7 +10,7 @@ else .meter.health .bar(ng-style='{width: Shared.percent(group.quest.progress.hp, Content.quests[group.quest.key].boss.hp) + "%"}') span.meter-text.value - | {{Math.ceil(group.quest.progress.hp) | roundLargeNumbers}} + | {{Math.ceil(group.quest.progress.hp) | roundLargeNumbers}} |  / {{::Content.quests[group.quest.key].boss.hp | roundLargeNumbers}} div(ng-if='Content.quests[group.quest.key].boss.rage') .meter-label(tooltip=env.t('rage')) @@ -20,5 +20,5 @@ else popover-trigger='mouseenter', popover-placement='bottom') .bar(ng-style='{width: Shared.percent(group.quest.progress.rage, Content.quests[group.quest.key].boss.rage.value) + "%"}') span.meter-text.value - | {{Math.ceil(group.quest.progress.rage) | roundLargeNumbers}} + | {{Math.ceil(group.quest.progress.rage) | roundLargeNumbers}} |  / {{::Content.quests[group.quest.key].boss.rage.value | roundLargeNumbers}} diff --git a/website/views/options/social/quests/collectionStats.jade b/website/views/options/social/quests/collectionStats.jade index 68217b86d7..9add7ff6ab 100644 --- a/website/views/options/social/quests/collectionStats.jade +++ b/website/views/options/social/quests/collectionStats.jade @@ -1,7 +1,7 @@ div(class="quest_{{::group.quest.key}}") h4=env.t('collected') + ':' table.table.table-striped - tr(ng-repeat='(item,number) in group.quest.progress.collect', + tr(ng-repeat='(item,number) in group.quest.progress.collect', class='quest_collected_{{number >= Content.quests[group.quest.key].collect[item].count}}') td .pull-left(class='quest_{{::group.quest.key}}_{{::item}}') diff --git a/website/views/shared/formatting-help.jade b/website/views/shared/formatting-help.jade index 9ad945093e..5c9f236da4 100644 --- a/website/views/shared/formatting-help.jade +++ b/website/views/shared/formatting-help.jade @@ -1,4 +1,4 @@ -small.btn-link(ng-init='showHelp = false', ng-click='showHelp = !showHelp') +small.btn-link(ng-init='showHelp = false', ng-click='showHelp = !showHelp') | {{showHelp ? env.t('hideFormattingHelp') : env.t('showFormattingHelp')}} .slight-vertical-padding(ng-if='showHelp') diff --git a/website/views/shared/header/menu.jade b/website/views/shared/header/menu.jade index 30dd70a05e..4fdc029e18 100644 --- a/website/views/shared/header/menu.jade +++ b/website/views/shared/header/menu.jade @@ -174,6 +174,9 @@ nav.toolbar(ng-controller='MenuCtrl') li.toolbar-subscribe-button button.highlight(ui-sref='options.settings.subscription',popover-trigger='mouseenter',popover-placement='bottom',popover-title=env.t('subscriptions'),popover=env.t('subDescription'),popover-append-to-body='true')=env.t('subscribe') ul.toolbar-options + li.toolbar-quest-detail(ng-if='hasQuestProgress()') + a(ng-click='$state.go("options.social.party");', popover-placement='bottom',popover-trigger='mouseenter',popover-title='{{getQuestInfo().title}}', popover='{{getQuestInfo().body}}',popover-append-to-body='true') + span.glyphicon.glyphicon-screenshot li.toolbar-notifs a(data-expand-menu, menu='notifs') span.glyphicon(ng-class='iconClasses()') diff --git a/website/views/shared/modals/amazon-payments.jade b/website/views/shared/modals/amazon-payments.jade index 892e665e67..fb1f71873f 100644 --- a/website/views/shared/modals/amazon-payments.jade +++ b/website/views/shared/modals/amazon-payments.jade @@ -12,4 +12,4 @@ script(id='modals/amazonPayments.html', type='text/ng-template') .modal-footer .btn.btn-default(ng-click='Payments.amazonPayments.reset()')=env.t('cancel') - .btn.btn-primary(ng-disabled="!Payments.amazonPayments.canCheckout()", ng-click="Payments.amazonPayments.checkout()")=env.t('checkout') \ No newline at end of file + .btn.btn-primary(ng-disabled="!Payments.amazonPayments.canCheckout()", ng-click="Payments.amazonPayments.checkout()")=env.t('checkout') diff --git a/website/views/shared/modals/buy-gems.jade b/website/views/shared/modals/buy-gems.jade index 4ebebf57ea..009e03a265 100644 --- a/website/views/shared/modals/buy-gems.jade +++ b/website/views/shared/modals/buy-gems.jade @@ -45,7 +45,7 @@ script(id='modals/buyGems.html', type='text/ng-template') .arrow .popover-content p=env.t('buyGemsAllow1') - |  {{Shared.planGemLimits.convCap + User.user.purchased.plan.consecutive.gemCapExtra - User.user.purchased.plan.gemsBought}}  + |  {{Shared.planGemLimits.convCap + User.user.purchased.plan.consecutive.gemCapExtra - User.user.purchased.plan.gemsBought}}  =env.t('buyGemsAllow2') p!=env.t('seeSubscriptionDetails') div(ng-if='user.purchased.plan.customerId') diff --git a/website/views/shared/modals/quest-rewards.jade b/website/views/shared/modals/quest-rewards.jade index c5de84c732..450c5c4286 100644 --- a/website/views/shared/modals/quest-rewards.jade +++ b/website/views/shared/modals/quest-rewards.jade @@ -5,10 +5,10 @@ script(id='partials/options.social.party.quest-rewards.html', type='text/ng-temp tr(ng-repeat='drop in quest.drop.items') td {{::drop.text()}} tr(ng-if='::quest.drop.exp > 0') - td {{::quest.drop.exp}} + td {{::quest.drop.exp}} =env.t('experience') tr(ng-if='::quest.drop.gp > 0') - td {{::quest.drop.gp}} + td {{::quest.drop.gp}} =env.t('gold') tr(ng-if='::quest.drop.unlock()') td {{::quest.drop.unlock()}} diff --git a/website/views/shared/modals/rebirth.jade b/website/views/shared/modals/rebirth.jade index 1c61c780c3..68ee0b7c58 100644 --- a/website/views/shared/modals/rebirth.jade +++ b/website/views/shared/modals/rebirth.jade @@ -1,6 +1,6 @@ // Created by Sabe on 12/22/13. -script(type='text/ng-template', id='modals/rebirthEnabled.html') +script(type='text/ng-template', id='modals/rebirthEnabled.html') .modal-header h4=env.t('rebirthNew') .modal-body @@ -39,7 +39,7 @@ script(type='text/ng-template', id='modals/rebirth.html') p span.vertical-align.inline-block.achievement-sun |  - =env.t('rebirthEarnAchievement') + =env.t('rebirthEarnAchievement') .modal-footer button.btn.btn-default(ng-click='$close()')=env.t('neverMind') span(ng-if='user.balance < 2 && user.stats.lvl < 100') diff --git a/website/views/shared/modals/reroll.jade b/website/views/shared/modals/reroll.jade index 9fc3ce55ec..5d5cbb58cc 100644 --- a/website/views/shared/modals/reroll.jade +++ b/website/views/shared/modals/reroll.jade @@ -1,5 +1,5 @@ // Re-Roll modal -script(type='text/ng-template', id='modals/reroll.html') +script(type='text/ng-template', id='modals/reroll.html') .modal-header h4=env.t('fortify') .modal-body diff --git a/website/views/shared/modals/settings.jade b/website/views/shared/modals/settings.jade index d802527e5d..5533896538 100644 --- a/website/views/shared/modals/settings.jade +++ b/website/views/shared/modals/settings.jade @@ -1,4 +1,4 @@ -script(type='text/ng-template', id='modals/reset.html') +script(type='text/ng-template', id='modals/reset.html') .modal-header h4=env.t('resetAccount') .modal-body @@ -57,7 +57,7 @@ script(type='text/ng-template', id='modals/restore.html') button.btn.btn-default(ng-click='$close()')=env.t('discardChanges') button.btn.btn-primary(ng-click='restore(); $close();')=env.t('saveAndClose') -script(type='text/ng-template', id='modals/delete.html') +script(type='text/ng-template', id='modals/delete.html') .modal-header h4=env.t('deleteAccount') .modal-body diff --git a/website/views/shared/new-stuff.jade b/website/views/shared/new-stuff.jade index c778829a17..9157cd6618 100644 --- a/website/views/shared/new-stuff.jade +++ b/website/views/shared/new-stuff.jade @@ -1,29 +1,51 @@ -h2 9/1/2016 - NEW BACKGROUNDS, ARMOIRE ITEMS, AND TAKE THIS CHALLENGE - .promo_backgrounds_armoire_201609.pull-right +h2 9/7/2016 - STAFF SPOTLIGHT: VIIRUS, BRAZILIAN PORTUGUESE LANGUAGE SUPPORT; COSTUME CHALLENGE COMING SOON hr tr td - h3 September Backgrounds and Armoire Items! - p We’ve added three new backgrounds: Orchard, Farmhouse, and Cornfields! Get them now from the Background Shop and show off your avatars in the Tavern! - br - p Plus, there’s new Gold-purchasable equipment in the Enchanted Armoire, including the Vermillion Archer Set. Better work hard on your real-life tasks to earn all the pieces! Enjoy :) - p.small.muted by Totoro, James Danger, and Balduranne + .promo_staff_spotlight_Viirus.pull-right + h3 Staff Spotlight: Phillip AKA Viirus + p There's a new Staff Spotlight on the blog, featuring an interview with Phillip (aka viirus)! Check it out to learn how he went from a volunteer contributor to our main mobile developer. + p.small.muted by viirus and Lemoness tr td - .promo_takeThis.pull-right - h3 New Take This Challenge! - p The next Take This Challenge has launched, "I Am The Night!", with a focus on forming better sleep habits. Be sure to check it out to earn additional pieces of the Take This armor set! + h3 Brazilian Portuguese Language Support + p Habitica has been translated into Brazilian Portuguese! If you'd like to use the site in Brazilian Portuguese and it doesn't change automatically for you, change your language to "Português Brasileiro" on the Settings page. Many thanks to our dedicated volunteer translators for their work! + p.small.muted by the Brazilian Portuguese translation team + tr + td + h3 Get Ready for the Community Costume Challenge! + p We've got an exciting event coming up this October - the annual Community Costume Challenge is returning! In the spirit of the season, Habiticans who dress up in real-life versions of their avatar's armor (or in any Habitica costume) will receive a special badge. (No, just wearing a colored shirt doesn't count. Where's the fun in that?) br - p Take This is a nonprofit that seeks to inform the gamer community about mental health issues, to provide education about mental disorders and mental illness prevention, and to reduce the stigma of mental illness. + p The Community Costume Challenge will start on October 1st, but we're announcing it early so that people have time to get their costumes together. br - p Congratulations to the winners of the last Take This Challenge, "Cast of Characters!": grand prize winner Dragonezss, and runners-up elizacorps, jwmeyer86, chady025, Max Yong, and Nightstalker_oL. Plus, all participants in that Challenge have received a piece of the Take This item set. It is located in your Rewards column. Enjoy! - p.small.muted by Lemoness, SabreCat, Doctor B, Gordon Shippey, and the Take This team + p Instructions on how to participate in the CCC will be posted when the Challenge is live. We can't wait to see your costumes! + p.small.muted by Lemoness if menuItem !== 'oldNews' hr a(href='/static/old-news', target='_blank') Read older news mixin oldNews + h2 9/1/2016 - NEW BACKGROUNDS, ARMOIRE ITEMS, AND TAKE THIS CHALLENGE + .promo_backgrounds_armoire_201609.pull-right + tr + td + h3 September Backgrounds and Armoire Items! + p We’ve added three new backgrounds: Orchard, Farmhouse, and Cornfields! Get them now from the Background Shop and show off your avatars in the Tavern! + br + p Plus, there’s new Gold-purchasable equipment in the Enchanted Armoire, including the Vermillion Archer Set. Better work hard on your real-life tasks to earn all the pieces! Enjoy :) + p.small.muted by Totoro, James Danger, and Balduranne + tr + td + .promo_takeThis.pull-right + h3 New Take This Challenge! + p The next Take This Challenge has launched, "I Am The Night!", with a focus on forming better sleep habits. Be sure to check it out to earn additional pieces of the Take This armor set! + br + p Take This is a nonprofit that seeks to inform the gamer community about mental health issues, to provide education about mental disorders and mental illness prevention, and to reduce the stigma of mental illness. + br + p Congratulations to the winners of the last Take This Challenge, "Cast of Characters!": grand prize winner Dragonezss, and runners-up elizacorps, jwmeyer86, chady025, Max Yong, and Nightstalker_oL. Plus, all participants in that Challenge have received a piece of the Take This item set. It is located in your Rewards column. Enjoy! + p.small.muted by Lemoness, SabreCat, Doctor B, Gordon Shippey, and the Take This team + h2 8/30/2016 - LAST CHANCE FOR THUNDERSTORM ITEMS; BACK TO SCHOOL GUILD SPOTLIGHT tr td @@ -420,7 +442,7 @@ mixin oldNews tr td h3 Partnership with FocusMe - p Because the Habitica staff members are big fans of distraction-blocker FocusMe (and their staff members are big fans of Habitica), we’ve decided to offer a joint promotion until Sunday June 19th, where anyone who purchases FocusMe will also be offered a 20% discount on a six-month Habitica subscription! Learn more here. + p Because the Habitica staff members are big fans of distraction-blocker FocusMe (and their staff members are big fans of Habitica), we’ve decided to offer a joint promotion until Sunday June 19th, where anyone who purchases FocusMe will also be offered a 20% discount on a six-month Habitica subscription! Learn more here. tr td h3 Important Info for Developers @@ -496,7 +518,7 @@ mixin oldNews tr td h3 Important Mobile App Updates - p We’ve released an iOS update and an Android update that contain the new code. It’s very important to download these updates immediately, or you may encounter significant bugs! + p We’ve released an iOS update and an Android update that contain the new code. It’s very important to download these updates immediately, or you may encounter significant bugs! tr td .Pet-Wolf-Veteran.pull-right @@ -514,7 +536,7 @@ mixin oldNews br p.strong We expect that on Saturday, May 21st, Habitica will be unavailable between 1 PM and 10 PM Pacific Time (8 pm - 5 am UTC). ul - li Don't worry, you will NOT lose any streaks or take any damage during this weekend, not even from Bosses! This maintenance will not harm your accounts. + li Don't worry, you will NOT lose any streaks or take any damage during this weekend, not even from Bosses! This maintenance will not harm your accounts. li If you will need to see your task list on Saturday, we recommend taking a screenshot of your tasks before the maintenance begins so that you can use them as a reference during downtime. li At the end of the maintenance, to thank people for their patience, everyone will receive a rare Veteran pet! li This maintenance should not result in any major visible differences to the site; it's all behind-the-scenes work. However, at the end of it, we will release new updates to the mobile apps, which will be required in order for the apps to work properly with the new changes! Be sure to download those updates on Saturday as soon as they are released. diff --git a/website/views/shared/tasks/edit/checklist.jade b/website/views/shared/tasks/edit/checklist.jade index ed77bb0a76..1c88e36559 100644 --- a/website/views/shared/tasks/edit/checklist.jade +++ b/website/views/shared/tasks/edit/checklist.jade @@ -17,7 +17,7 @@ //input(type='checkbox',ng-model='item.completed',ng-change='saveTask(task,true)') //-,ng-blur='saveTask(task,true)') span.checklist-icon.glyphicon.glyphicon-resize-vertical - input(type='text', ng-model='item.text', + input(type='text', ng-model='item.text', ui-keyup="{'13':'addChecklistItem(task,$event,$index)','38 40':'navigateChecklist(task,$index,$event)'}") a(ng-click='removeChecklistItem(task,$event,$index,true)') span.glyphicon.glyphicon-trash(tooltip=env.t('delete')) diff --git a/website/views/shared/tasks/meta_controls.jade b/website/views/shared/tasks/meta_controls.jade index 3feaef0d87..448886ae5e 100644 --- a/website/views/shared/tasks/meta_controls.jade +++ b/website/views/shared/tasks/meta_controls.jade @@ -53,7 +53,7 @@ |   // notes - // Make this icon available regardless of task ownership + // Make this icon available regardless of task ownership a.task-notes(ng-show='task.notes && !task._editing', ng-click='task.popoverOpen = !task.popoverOpen', popover-trigger='click', data-popover-html="{{task.notes | markdown}}", popover-placement="top", popover-append-to-body='{{::modal ? "false":"true"}}') span.glyphicon.glyphicon-comment |   diff --git a/website/views/shared/tasks/task_view/index.jade b/website/views/shared/tasks/task_view/index.jade index 19d51a2ae4..0c782358bf 100644 --- a/website/views/shared/tasks/task_view/index.jade +++ b/website/views/shared/tasks/task_view/index.jade @@ -33,7 +33,7 @@ ng-change='changeCheck(task)' ui-keypress='{13:"task.completed = !task.completed; changeCheck(task)"}' ) input.visuallyhidden.focusable(id='box-{{::obj._id}}_{{::task._id}}', type='checkbox', - ng-disabled='$state.includes("options.social.challenges")') + ng-if='!$state.includes("tasks")') label(for='box-{{::obj._id}}_{{::task._id}}') // main content