mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-10-26 10:42:52 +01:00
Merge branch 'develop' into paglias/realtime-chat-v1
This commit is contained in:
102
common/dist/sprites/spritesmith-largeSprites-0.css
vendored
102
common/dist/sprites/spritesmith-largeSprites-0.css
vendored
@@ -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;
|
||||
}
|
||||
|
||||
BIN
common/dist/sprites/spritesmith-largeSprites-0.png
vendored
BIN
common/dist/sprites/spritesmith-largeSprites-0.png
vendored
Binary file not shown.
|
Before Width: | Height: | Size: 469 KiB After Width: | Height: | Size: 475 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 8.0 KiB |
@@ -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",
|
||||
|
||||
@@ -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.",
|
||||
|
||||
@@ -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 <a href='mailto:admin@habitica.com'>admin@habitica.com</a> 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",
|
||||
|
||||
2
npm-shrinkwrap.json
generated
2
npm-shrinkwrap.json
generated
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "habitica",
|
||||
"version": "3.38.0",
|
||||
"version": "3.39.1",
|
||||
"dependencies": {
|
||||
"abbrev": {
|
||||
"version": "1.0.9",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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%)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -14,4 +14,4 @@ html.applying-action, html.applying-action *
|
||||
.cast-target:hover
|
||||
border: 5px solid green !important
|
||||
.selected-class
|
||||
background-color: green
|
||||
background-color: green
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -6,4 +6,4 @@
|
||||
margin-top: 40px
|
||||
padding-bottom: 20px
|
||||
border-top: 1px solid #e5e5e5
|
||||
background-color: #f5f5f5
|
||||
background-color: #f5f5f5
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
.stable .static-popover
|
||||
max-width: 550px
|
||||
|
||||
menu.pets div
|
||||
menu.pets div
|
||||
display: inline-block
|
||||
vertical-align: top
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -79,4 +79,4 @@
|
||||
}
|
||||
.task-column::-webkit-scrollbar-corner {
|
||||
background: transparent
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -58,7 +58,7 @@ habitrpg.controller("HeaderCtrl", ['$scope', 'Groups', 'User',
|
||||
}
|
||||
)
|
||||
if (User.user.party.orderAscending == "descending") {
|
||||
result = result.reverse()
|
||||
result = result.reverse()
|
||||
}
|
||||
|
||||
return result;
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ habitrpg.controller('SortableInventoryController', ['$scope',
|
||||
$scope.setGrouping = function (grouping) {
|
||||
$scope.groupingChoice = grouping;
|
||||
};
|
||||
|
||||
|
||||
$scope.orderChoice = 'set';
|
||||
$scope.setOrder($scope.orderChoice);
|
||||
}]);
|
||||
|
||||
@@ -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;
|
||||
window.env.t = window.habitrpgShared.i18n.t;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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');
|
||||
module.exports = require('../top-level/payments/iap');
|
||||
|
||||
@@ -14,4 +14,4 @@ api.redirectProfileQRCode = {
|
||||
},
|
||||
};
|
||||
|
||||
module.exports = api;
|
||||
module.exports = api;
|
||||
|
||||
@@ -19,4 +19,4 @@ module.exports = {
|
||||
getPurchaseData: iap.getPurchaseData,
|
||||
GOOGLE: iap.GOOGLE,
|
||||
APPLE: iap.APPLE,
|
||||
};
|
||||
};
|
||||
|
||||
@@ -15,4 +15,4 @@ export function makeSalt (len = 10) {
|
||||
.randomBytes(Math.ceil(len / 2))
|
||||
.toString('hex')
|
||||
.substring(0, len);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,4 +39,4 @@ let api = {
|
||||
},
|
||||
};
|
||||
|
||||
module.exports = api;
|
||||
module.exports = api;
|
||||
|
||||
@@ -25,4 +25,4 @@ if (MAINTENANCE_MODE !== 'true') {
|
||||
});
|
||||
|
||||
autoinc.init(db);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -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))};
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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}}
|
||||
|
||||
@@ -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}}')
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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()')
|
||||
|
||||
@@ -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')
|
||||
.btn.btn-primary(ng-disabled="!Payments.amazonPayments.canCheckout()", ng-click="Payments.amazonPayments.checkout()")=env.t('checkout')
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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()}}
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 <a href='/#/options/profile/backgrounds'>Background Shop</a> 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 <a href='https://habitica.wordpress.com/category/staff-spotlight/' target='_blank'>Staff Spotlight</a> 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, "<a href='/#/options/groups/challenges/4bbf63b5-10bc-49f9-8e95-5bd2ac99cd1c'>I Am The Night!</a>", 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 <a href='/#/options/settings/settings'>Settings page</a>. 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 <a href='http://www.takethis.org/' target='_blank'>Take This</a> 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, "<a href='/#/options/groups/challenges/22db61a5-1022-4f1a-87f6-ad7552bf740e'>Cast of Characters!</a>": 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 <a href='http://habitica.wikia.com/wiki/Event_Item_Sequences#Take_This_Armor_Set' target='_blank'>Take This item set</a>. 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 <a href='/#/options/profile/backgrounds'>Background Shop</a> 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, "<a href='/#/options/groups/challenges/4bbf63b5-10bc-49f9-8e95-5bd2ac99cd1c'>I Am The Night!</a>", 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 <a href='http://www.takethis.org/' target='_blank'>Take This</a> 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, "<a href='/#/options/groups/challenges/22db61a5-1022-4f1a-87f6-ad7552bf740e'>Cast of Characters!</a>": 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 <a href='http://habitica.wikia.com/wiki/Event_Item_Sequences#Take_This_Armor_Set' target='_blank'>Take This item set</a>. 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 <a href='http://focusme.com' target='_blank'>FocusMe</a> (and their staff members are big fans of Habitica), we’ve decided to offer <a href='http://focusme.com/habitica-special/' target='_blank'>a joint promotion</a> until Sunday June 19th, where anyone who purchases FocusMe will also be offered a 20% discount on a six-month Habitica subscription! <a href='https://habitica.wordpress.com/2016/06/09/habitica-and-focusme-partnership/' target='_blank'>Learn more here.</a>
|
||||
p Because the Habitica staff members are big fans of distraction-blocker <a href='http://focusme.com' target='_blank'>FocusMe</a> (and their staff members are big fans of Habitica), we’ve decided to offer <a href='http://focusme.com/habitica-special/' target='_blank'>a joint promotion</a> until Sunday June 19th, where anyone who purchases FocusMe will also be offered a 20% discount on a six-month Habitica subscription! <a href='https://habitica.wordpress.com/2016/06/09/habitica-and-focusme-partnership/' target='_blank'>Learn more here.</a>
|
||||
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 <a href='https://geo.itunes.apple.com/us/app/habitica/id994882113?mt=8' target='_blank'>iOS update</a> and an <a href='https://play.google.com/store/apps/details?id=com.habitrpg.android.habitica' target='_blank'>Android update</a> 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 <a href='https://geo.itunes.apple.com/us/app/habitica/id994882113?mt=8' target='_blank'>iOS update</a> and an <a href='https://play.google.com/store/apps/details?id=com.habitrpg.android.habitica' target='_blank'>Android update</a> 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 <a href='http://www.worldtimebuddy.com/?pl=1&lid=5368361,100&h=5368361' target='_blank'>1 PM and 10 PM Pacific Time (8 pm - 5 am UTC)</a>.
|
||||
ul
|
||||
li Don't worry, <strong>you will NOT lose any streaks or take any damage during this weekend, not even from Bosses!</strong> This maintenance will not harm your accounts.
|
||||
li Don't worry, <strong>you will NOT lose any streaks or take any damage during this weekend, not even from Bosses!</strong> This maintenance will not harm your accounts.
|
||||
li If you will need to see your task list on Saturday, <strong>we recommend taking a screenshot of your tasks before the maintenance begins</strong> so that you can use them as a reference during downtime.
|
||||
li At the end of the maintenance, to thank people for their patience, <strong>everyone will receive a rare Veteran pet!</strong>
|
||||
li This maintenance should not result in any major visible differences to the site; it's all behind-the-scenes work. However, <strong>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!</strong> Be sure to download those updates on Saturday as soon as they are released.
|
||||
|
||||
@@ -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'))
|
||||
|
||||
@@ -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
|
||||
|
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user