feat(quests): Dilatory Distress

Implements the "Dilatory Distress" quest chain, purchasable for Gold. Also adds four new items to the Enchanted Armoire.
This commit is contained in:
Sabe Jones 2015-07-13 18:21:32 -05:00
parent 209989d7aa
commit b9f795529b
43 changed files with 7972 additions and 7736 deletions

File diff suppressed because one or more lines are too long

View file

@ -1974,13 +1974,13 @@
}
.hair_mustache_1_red {
background-image: url(spritesmith0.png);
background-position: 0px -888px;
background-position: -1092px -1434px;
width: 90px;
height: 90px;
}
.customize-option.hair_mustache_1_red {
background-image: url(spritesmith0.png);
background-position: -25px -903px;
background-position: -1117px -1449px;
width: 60px;
height: 60px;
}
@ -1998,13 +1998,13 @@
}
.hair_mustache_1_white {
background-image: url(spritesmith0.png);
background-position: -1274px -1434px;
background-position: 0px -888px;
width: 90px;
height: 90px;
}
.customize-option.hair_mustache_1_white {
background-image: url(spritesmith0.png);
background-position: -1299px -1449px;
background-position: -25px -903px;
width: 60px;
height: 60px;
}
@ -3990,443 +3990,479 @@
}
.hair_base_10_brown {
background-image: url(spritesmith0.png);
background-position: -1092px -1434px;
background-position: 0px -1889px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_10_brown {
background-image: url(spritesmith0.png);
background-position: -1117px -1449px;
background-position: -25px -1904px;
width: 60px;
height: 60px;
}
.hair_base_10_candycane {
background-image: url(spritesmith0.png);
background-position: -910px -979px;
background-position: -91px -1889px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_10_candycane {
background-image: url(spritesmith0.png);
background-position: -935px -994px;
background-position: -116px -1904px;
width: 60px;
height: 60px;
}
.hair_base_10_candycorn {
background-image: url(spritesmith0.png);
background-position: -819px -979px;
background-position: -182px -1889px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_10_candycorn {
background-image: url(spritesmith0.png);
background-position: -844px -994px;
background-position: -207px -1904px;
width: 60px;
height: 60px;
}
.hair_base_10_festive {
background-image: url(spritesmith0.png);
background-position: -728px -979px;
background-position: -1274px -1434px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_10_festive {
background-image: url(spritesmith0.png);
background-position: -753px -994px;
background-position: -1299px -1449px;
width: 60px;
height: 60px;
}
.hair_base_10_frost {
background-image: url(spritesmith0.png);
background-position: -637px -979px;
background-position: -910px -979px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_10_frost {
background-image: url(spritesmith0.png);
background-position: -662px -994px;
background-position: -935px -994px;
width: 60px;
height: 60px;
}
.hair_base_10_ghostwhite {
background-image: url(spritesmith0.png);
background-position: -546px -979px;
background-position: -819px -979px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_10_ghostwhite {
background-image: url(spritesmith0.png);
background-position: -571px -994px;
background-position: -844px -994px;
width: 60px;
height: 60px;
}
.hair_base_10_green {
background-image: url(spritesmith0.png);
background-position: -455px -979px;
background-position: -728px -979px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_10_green {
background-image: url(spritesmith0.png);
background-position: -480px -994px;
background-position: -753px -994px;
width: 60px;
height: 60px;
}
.hair_base_10_halloween {
background-image: url(spritesmith0.png);
background-position: -364px -979px;
background-position: -637px -979px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_10_halloween {
background-image: url(spritesmith0.png);
background-position: -389px -994px;
background-position: -662px -994px;
width: 60px;
height: 60px;
}
.hair_base_10_holly {
background-image: url(spritesmith0.png);
background-position: -273px -979px;
background-position: -546px -979px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_10_holly {
background-image: url(spritesmith0.png);
background-position: -298px -994px;
background-position: -571px -994px;
width: 60px;
height: 60px;
}
.hair_base_10_hollygreen {
background-image: url(spritesmith0.png);
background-position: -182px -979px;
background-position: -455px -979px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_10_hollygreen {
background-image: url(spritesmith0.png);
background-position: -207px -994px;
background-position: -480px -994px;
width: 60px;
height: 60px;
}
.hair_base_10_midnight {
background-image: url(spritesmith0.png);
background-position: -91px -979px;
background-position: -364px -979px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_10_midnight {
background-image: url(spritesmith0.png);
background-position: -116px -994px;
background-position: -389px -994px;
width: 60px;
height: 60px;
}
.hair_base_10_pblue {
background-image: url(spritesmith0.png);
background-position: 0px -979px;
background-position: -273px -979px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_10_pblue {
background-image: url(spritesmith0.png);
background-position: -25px -994px;
background-position: -298px -994px;
width: 60px;
height: 60px;
}
.hair_base_10_pblue2 {
background-image: url(spritesmith0.png);
background-position: -990px -819px;
background-position: -182px -979px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_10_pblue2 {
background-image: url(spritesmith0.png);
background-position: -1015px -834px;
background-position: -207px -994px;
width: 60px;
height: 60px;
}
.hair_base_10_peppermint {
background-image: url(spritesmith0.png);
background-position: -990px -728px;
background-position: -91px -979px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_10_peppermint {
background-image: url(spritesmith0.png);
background-position: -1015px -743px;
background-position: -116px -994px;
width: 60px;
height: 60px;
}
.hair_base_10_pgreen {
background-image: url(spritesmith0.png);
background-position: -990px -637px;
background-position: 0px -979px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_10_pgreen {
background-image: url(spritesmith0.png);
background-position: -1015px -652px;
background-position: -25px -994px;
width: 60px;
height: 60px;
}
.hair_base_10_pgreen2 {
background-image: url(spritesmith0.png);
background-position: -990px -546px;
background-position: -990px -819px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_10_pgreen2 {
background-image: url(spritesmith0.png);
background-position: -1015px -561px;
background-position: -1015px -834px;
width: 60px;
height: 60px;
}
.hair_base_10_porange {
background-image: url(spritesmith0.png);
background-position: -990px -455px;
background-position: -990px -728px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_10_porange {
background-image: url(spritesmith0.png);
background-position: -1015px -470px;
background-position: -1015px -743px;
width: 60px;
height: 60px;
}
.hair_base_10_porange2 {
background-image: url(spritesmith0.png);
background-position: -990px -364px;
background-position: -990px -637px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_10_porange2 {
background-image: url(spritesmith0.png);
background-position: -1015px -379px;
background-position: -1015px -652px;
width: 60px;
height: 60px;
}
.hair_base_10_ppink {
background-image: url(spritesmith0.png);
background-position: -990px -273px;
background-position: -990px -546px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_10_ppink {
background-image: url(spritesmith0.png);
background-position: -1015px -288px;
background-position: -1015px -561px;
width: 60px;
height: 60px;
}
.hair_base_10_ppink2 {
background-image: url(spritesmith0.png);
background-position: -990px -182px;
background-position: -990px -455px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_10_ppink2 {
background-image: url(spritesmith0.png);
background-position: -1015px -197px;
background-position: -1015px -470px;
width: 60px;
height: 60px;
}
.hair_base_10_ppurple {
background-image: url(spritesmith0.png);
background-position: -990px -91px;
background-position: -990px -364px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_10_ppurple {
background-image: url(spritesmith0.png);
background-position: -1015px -106px;
background-position: -1015px -379px;
width: 60px;
height: 60px;
}
.hair_base_10_ppurple2 {
background-image: url(spritesmith0.png);
background-position: -990px 0px;
background-position: -990px -273px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_10_ppurple2 {
background-image: url(spritesmith0.png);
background-position: -1015px -15px;
background-position: -1015px -288px;
width: 60px;
height: 60px;
}
.hair_base_10_pumpkin {
background-image: url(spritesmith0.png);
background-position: -819px -888px;
background-position: -990px -182px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_10_pumpkin {
background-image: url(spritesmith0.png);
background-position: -844px -903px;
background-position: -1015px -197px;
width: 60px;
height: 60px;
}
.hair_base_10_purple {
background-image: url(spritesmith0.png);
background-position: -728px -888px;
background-position: -990px -91px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_10_purple {
background-image: url(spritesmith0.png);
background-position: -753px -903px;
background-position: -1015px -106px;
width: 60px;
height: 60px;
}
.hair_base_10_pyellow {
background-image: url(spritesmith0.png);
background-position: -637px -888px;
background-position: -990px 0px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_10_pyellow {
background-image: url(spritesmith0.png);
background-position: -662px -903px;
background-position: -1015px -15px;
width: 60px;
height: 60px;
}
.hair_base_10_pyellow2 {
background-image: url(spritesmith0.png);
background-position: -546px -888px;
background-position: -819px -888px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_10_pyellow2 {
background-image: url(spritesmith0.png);
background-position: -571px -903px;
background-position: -844px -903px;
width: 60px;
height: 60px;
}
.hair_base_10_rainbow {
background-image: url(spritesmith0.png);
background-position: -455px -888px;
background-position: -728px -888px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_10_rainbow {
background-image: url(spritesmith0.png);
background-position: -480px -903px;
background-position: -753px -903px;
width: 60px;
height: 60px;
}
.hair_base_10_red {
background-image: url(spritesmith0.png);
background-position: -364px -888px;
background-position: -637px -888px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_10_red {
background-image: url(spritesmith0.png);
background-position: -389px -903px;
background-position: -662px -903px;
width: 60px;
height: 60px;
}
.hair_base_10_snowy {
background-image: url(spritesmith0.png);
background-position: -273px -888px;
background-position: -546px -888px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_10_snowy {
background-image: url(spritesmith0.png);
background-position: -298px -903px;
background-position: -571px -903px;
width: 60px;
height: 60px;
}
.hair_base_10_white {
background-image: url(spritesmith0.png);
background-position: -182px -888px;
background-position: -455px -888px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_10_white {
background-image: url(spritesmith0.png);
background-position: -207px -903px;
background-position: -480px -903px;
width: 60px;
height: 60px;
}
.hair_base_10_winternight {
background-image: url(spritesmith0.png);
background-position: -91px -888px;
background-position: -364px -888px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_10_winternight {
background-image: url(spritesmith0.png);
background-position: -116px -903px;
background-position: -389px -903px;
width: 60px;
height: 60px;
}
.hair_base_10_winterstar {
background-image: url(spritesmith0.png);
background-position: -1081px -455px;
background-position: -273px -888px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_10_winterstar {
background-image: url(spritesmith0.png);
background-position: -1106px -470px;
background-position: -298px -903px;
width: 60px;
height: 60px;
}
.hair_base_10_yellow {
background-image: url(spritesmith0.png);
background-position: -1081px -364px;
background-position: -182px -888px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_10_yellow {
background-image: url(spritesmith0.png);
background-position: -1106px -379px;
background-position: -207px -903px;
width: 60px;
height: 60px;
}
.hair_base_10_zombie {
background-image: url(spritesmith0.png);
background-position: -1081px -273px;
background-position: -91px -888px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_10_zombie {
background-image: url(spritesmith0.png);
background-position: -1106px -288px;
background-position: -116px -903px;
width: 60px;
height: 60px;
}
.hair_base_11_TRUred {
background-image: url(spritesmith0.png);
background-position: -1081px -182px;
background-position: -1081px -455px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_11_TRUred {
background-image: url(spritesmith0.png);
background-position: -1106px -197px;
background-position: -1106px -470px;
width: 60px;
height: 60px;
}
.hair_base_11_aurora {
background-image: url(spritesmith0.png);
background-position: -1081px -91px;
background-position: -1081px -364px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_11_aurora {
background-image: url(spritesmith0.png);
background-position: -1106px -106px;
background-position: -1106px -379px;
width: 60px;
height: 60px;
}
.hair_base_11_black {
background-image: url(spritesmith0.png);
background-position: -1081px 0px;
background-position: -1081px -273px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_11_black {
background-image: url(spritesmith0.png);
background-position: -1106px -288px;
width: 60px;
height: 60px;
}
.hair_base_11_blond {
background-image: url(spritesmith0.png);
background-position: -1081px -182px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_11_blond {
background-image: url(spritesmith0.png);
background-position: -1106px -197px;
width: 60px;
height: 60px;
}
.hair_base_11_blue {
background-image: url(spritesmith0.png);
background-position: -1081px -91px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_11_blue {
background-image: url(spritesmith0.png);
background-position: -1106px -106px;
width: 60px;
height: 60px;
}
.hair_base_11_brown {
background-image: url(spritesmith0.png);
background-position: -1081px 0px;
width: 90px;
height: 90px;
}
.customize-option.hair_base_11_brown {
background-image: url(spritesmith0.png);
background-position: -1106px -15px;
width: 60px;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 220 KiB

After

Width:  |  Height:  |  Size: 221 KiB

File diff suppressed because it is too large Load diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 24 KiB

File diff suppressed because it is too large Load diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 104 KiB

After

Width:  |  Height:  |  Size: 109 KiB

File diff suppressed because it is too large Load diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

After

Width:  |  Height:  |  Size: 88 KiB

File diff suppressed because it is too large Load diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 533 KiB

After

Width:  |  Height:  |  Size: 554 KiB

File diff suppressed because it is too large Load diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 231 KiB

After

Width:  |  Height:  |  Size: 233 KiB

File diff suppressed because it is too large Load diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 197 KiB

After

Width:  |  Height:  |  Size: 199 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 696 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 683 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

View file

@ -74,6 +74,8 @@
"weaponSpecial3Notes": "Meetings, monsters, malaise: managed! Mash! Increases Strength, Intelligence, and Constitution by <%= attrs %> each.",
"weaponSpecialCriticalText": "Critical Hammer of Bug-Crushing",
"weaponSpecialCriticalNotes": "This champion slew a critical Github foe where many warriors fell. Fashioned from the bones of Bug, this hammer deals a mighty critical hit. Increases Strength and Perception by <%= attrs %> each.",
"weaponSpecialTridentOfCrashingTidesText": "Trident of Crashing Tides",
"weaponSpecialTridentOfCrashingTidesNotes": "Gives you the ability to command fish, and also deliver some mighty stabs to your tasks. Increases Intelligence by <%= int %>.",
"weaponSpecialYetiText": "Yeti-Tamer Spear",
"weaponSpecialYetiNotes": "This spear allows its user to command any yeti. Increases Strength by <%= str %>. Limited Edition 2013-2014 Winter Gear.",
@ -151,6 +153,8 @@
"weaponArmoireBasicCrossbowNotes": "This crossbow can pierce a task's armor from very far away! Increases Strength by <%= str %>, Perception by <%= per %>, and Constitution by <%= con %>. Enchanted Armoire: Independent Item.",
"weaponArmoireLunarSceptreText": "Soothing Lunar Sceptre",
"weaponArmoireLunarSceptreNotes": "The healing power of this wand waxes and wanes. Increases Constitution by <%= con %> and Intelligence by <%= int %>. Enchanted Armoire: Soothing Lunar Set (Item 3 of 3).",
"weaponArmoireRancherLassoText": "Rancher Lasso",
"weaponArmoireRancherLassoNotes": "Lassos: the ideal tool for rounding up and wrangling. Increases Strength by <%= str %>, Perception by <%= per %>, and Intelligence by <%= int %>. Enchanted Armoire: Rancher Set (Item 3 of 3).",
"armor": "armor",
@ -207,6 +211,8 @@
"armorSpecial1Notes": "Its tireless power inures the wearer to mundane discomfort. Increases all attributes by <%= attrs %>.",
"armorSpecial2Text": "Jean Chalard's Noble Tunic",
"armorSpecial2Notes": "Makes you extra fluffy! Increases Constitution and Intelligence by <%= attrs %> each.",
"armorSpecialFinnedOceanicArmorText": "Finned Oceanic Armor",
"armorSpecialFinnedOceanicArmorNotes": "Although delicate, this armor makes your skin as harmful to the touch as a fire coral. Increases Strength by <%= str %>.",
"armorSpecialYetiText": "Yeti-Tamer Robe",
"armorSpecialYetiNotes": "Fuzzy and fierce. Increases Constitution by <%= con %>. Limited Edition 2013-2014 Winter Gear.",
@ -311,6 +317,8 @@
"armorArmoireLunarArmorNotes": "The light of the moon will make you strong and savvy. Increases Strength by <%= str %> and Intelligence by <%= int %>. Enchanted Armoire: Soothing Lunar Set (Item 2 of 3).",
"armorArmoireGladiatorArmorText": "Gladiator Armor",
"armorArmoireGladiatorArmorNotes": "To be a gladiator you must be not only cunning... but strong. Increases Perception by <%= per %> and Strength by <%= str %>. Enchanted Armoire: Gladiator Set (Item 2 of 3).",
"armorArmoireRancherRobesText": "Rancher Robes",
"armorArmoireRancherRobesNotes": "Wrangle your mounts and round up your pets while wearing these magical Rancher Robes! Increases Strength by <%= str %>, Perception by <%= per %>, and Intelligence by <%= int %>. Enchanted Armoire: Rancher Set (Item 2 of 3).",
"headgear": "headgear",
@ -367,6 +375,8 @@
"headSpecial1Notes": "The favored crown of those who lead by example. Increases all attributes by <%= attrs %>.",
"headSpecial2Text": "Nameless Helm",
"headSpecial2Notes": "A testament to those who gave of themselves while asking nothing in return. Increases Intelligence and Strength by <%= attrs %> each.",
"headSpecialFireCoralCircletText": "Fire Coral Circlet",
"headSpecialFireCoralCircletNotes": "This circlet, designed by Habitica's greatest alchemists, allows you to breathe water and dive for treasure! Increases Perception by <%= per %>.",
"headSpecialNyeText": "Absurd Party Hat",
"headSpecialNyeNotes": "You've received an Absurd Party Hat! Wear it with pride while ringing in the New Year! Confers no benefit.",
@ -464,13 +474,17 @@
"headArmoireLunarCrownText": "Soothing Lunar Crown",
"headArmoireLunarCrownNotes": "This crown strengthens health and sharpens senses, especially when the moon is full. Increases Constitution by <%= con %> and Perception by <%= per %>. Enchanted Armoire: Soothing Lunar Set (Item 1 of 3).",
"headArmoireRedHairbowText": "Red Hairbow",
"headArmoireRedHairbowNotes": "Become strong, tough and smart while wearing this beautiful Red Hairbow! Increases Strength by <%= str %>, Constitution by <%= con %>, and Intelligence by <%= int %>. Enchanted Armoire: Independent Item.",
"headArmoireRedHairbowNotes": "Become strong, tough, and smart while wearing this beautiful Red Hairbow! Increases Strength by <%= str %>, Constitution by <%= con %>, and Intelligence by <%= int %>. Enchanted Armoire: Independent Item.",
"headArmoireVioletFloppyHatText": "Violet Floppy Hat",
"headArmoireVioletFloppyHatNotes": "Many spells have been sewn into this simple hat, giving it a pleasing purple color. Increases Perception by <%= per %>, Intelligence by <%= int %>, and Constitution by <%= con %>. Enchanted Armoire: Independent Item.",
"headArmoireGladiatorHelmText": "Gladiator Helm",
"headArmoireGladiatorHelmNotes": "To be a gladiator you must be not only strong.... but cunning. Increases Intelligence by <%= int %> and Perception by <%= per %>. Enchanted Armoire: Gladiator Set (Item 1 of 3).",
"headArmoireRancherHatText": "Rancher Hat",
"headArmoireRancherHatNotes": "Round up your pets and wrangle your mounts while wearing this magical Rancher Hat! Increases Strength by <%= str %>, Perception by <%= per %>, and Intelligence by <%= int %>. Enchanted Armoire: Independent Item.",
"headArmoireRancherHatNotes": "Round up your pets and wrangle your mounts while wearing this magical Rancher Hat! Increases Strength by <%= str %>, Perception by <%= per %>, and Intelligence by <%= int %>. Enchanted Armoire: Rancher Set (Item 1 of 3).",
"headArmoireBlueHairbowText": "Blue Hairbow",
"headArmoireBlueHairbowNotes": "Become perceptive, tough, and smart while wearing this beautiful Blue Hairbow! Increases Perception by <%= per %>, Constitution by <%= con %>, and Intelligence by <%= int %>. Enchanted Armoire: Independent Item.",
"headArmoireRoyalCrownText": "Royal Crown",
"headArmoireRoyalCrownNotes": "Hooray for the ruler, mighty and strong! Increases Strength by <%= str %>. Enchanted Armoire: Independent Item.",
"offhand": "shield-hand item",
@ -503,6 +517,8 @@
"shieldSpecial0Notes": "Sees beyond the veil of death, and displays what it finds there for enemies to fear. Increases Perception by <%= per %>.",
"shieldSpecial1Text": "Crystal Shield",
"shieldSpecial1Notes": "Shatters arrows and deflects the words of naysayers. Increases all attributes by <%= attrs %>.",
"shieldSpecialMoonpearlShieldText": "Moonpearl Shield",
"shieldSpecialMoonpearlShieldNotes": "Designed for fast swimming, and also some defense. Increases Constitution by <%= con %>.",
"shieldSpecialGoldenknightText": "Mustaine's Milestone Mashing Morning Star",
"shieldSpecialGoldenknightNotes": "Meetings, monsters, malaise: managed! Mash! Increases Constitution and Perception by <%= attrs %> each.",

View file

@ -68,17 +68,17 @@
"questSpiderDropSpiderEgg": "Spider (Egg)",
"questSpiderUnlockText": "Unlocks purchasable spider eggs in the Market",
"questVice1Text": "Free Yourself of the Dragon's Influence",
"questVice1Text": "Vice, Part 1: Free Yourself of the Dragon's Influence",
"questVice1Notes": "<p>They say there lies a terrible evil in the caverns of Mt. Habitica. A monster whose presence twists the wills of the strong heroes of the land, turning them towards bad habits and laziness! The beast is a grand dragon of immense power and comprised of the shadows themselves: Vice, the treacherous Shadow Wyrm. Brave Habiteers, stand up and defeat this foul beast once and for all, but only if you believe you can stand against its immense power. </p><h3>Vice Part 1: </h3><p>How can you expect to fight the beast if it already has control over you? Don't fall victim to laziness and vice! Work hard to fight against the dragon's dark influence and dispel his hold on you! </p>",
"questVice1Boss": "Vice's Shade",
"questVice1DropVice2Quest": "Vice Part 2 (Scroll)",
"questVice2Text": "Find the Lair of the Wyrm",
"questVice2Text": "Vice, Part 2: Find the Lair of the Wyrm",
"questVice2Notes": "With Vice's influence over you dispelled, you feel a surge of strength you didn't know you had return to you. Confident in yourselves and your ability to withstand the wyrm's influence, your party makes its way to Mt. Habitica. You approach the entrance to the mountain's caverns and pause. Swells of shadows, almost like fog, wisp out from the opening. It is near impossible to see anything in front of you. The light from your lanterns seem to end abruptly where the shadows begin. It is said that only magical light can pierce the dragon's infernal haze. If you can find enough light crystals, you could make your way to the dragon.",
"questVice2CollectLightCrystal": "Light Crystals",
"questVice2DropVice3Quest": "Vice Part 3 (Scroll)",
"questVice3Text": "Vice Awakens",
"questVice3Text": "Vice, Part 3: Vice Awakens",
"questVice3Notes": "After much effort, your party has discovered Vice's lair. The hulking monster eyes your party with distaste. As shadows swirl around you, a voice whispers through your head, \"More foolish citizens of Habitica come to stop me? Cute. You'd have been wise not to come.\" The scaly titan rears back its head and prepares to attack. This is your chance! Give it everything you've got and defeat Vice once and for all!",
"questVice3Completion": "The shadows dissipate from the cavern and a steely silence falls. My word, you've done it! You have defeated Vice! You and your party may finally breath a sigh of relief. Enjoy your victory, brave Habiteers, but take the lessons you've learned from battling Vice and move forward. There are still Habits to be done and potentially worse evils to conquer!",
"questVice3Boss": "Vice, the Shadow Wyrm",
@ -86,34 +86,34 @@
"questVice3DropDragonEgg": "Dragon (Egg)",
"questVice3DropShadeHatchingPotion": "Shade Hatching Potion",
"questMoonstone1Text": "The Moonstone Chain",
"questMoonstone1Text": "The Moonstone Chain, Part 1: The Moonstone Chain",
"questMoonstone1Notes": "<p>A terrible affliction has struck Habiticans. Bad Habits thought long-dead are rising back up with a vengeance. Dishes lie unwashed, textbooks linger unread, and procrastination runs rampant!</p><br/><p>You track some of your own returning Bad Habits to the Swamps of Stagnation and discover the culprit: the ghostly Necromancer, Recidivate. You rush in, weapons swinging, but they slide through her specter uselessly.</p><br/><p>\"Dont bother,\" she hisses with a dry rasp. \"Without a chain of moonstones, nothing can harm me and master jeweler @aurakami scattered all the moonstones across Habitica long ago!\" Panting, you retreat... but you know what you must do.</p>",
"questMoonstone1CollectMoonstone": "Moonstones",
"questMoonstone1DropMoonstone2Quest": "The Moonstone Chain Part 2: Recidivate the Necromancer (Scroll)",
"questMoonstone2Text": "Recidivate The Necromancer",
"questMoonstone2Text": "The Moonstone Chain, Part 2: Recidivate The Necromancer",
"questMoonstone2Notes": "<p>The brave weaponsmith @Inventrix helps you fashion the enchanted moonstones into a chain. Youre ready to confront Recidivate at last, but as you enter the Swamps of Stagnation, a terrible chill sweeps over you.</p><br/><p>Rotting breath whispers in your ear. \"Back again? How delightful...\" You spin and lunge, and under the light of the moonstone chain, your weapon strikes solid flesh. \"You may have bound me to the world once more,\" Recidivate snarls, \"but now it is time for you to leave it!\"</p>",
"questMoonstone2Boss": "The Necromancer",
"questMoonstone2DropMoonstone3Quest": "The Moonstone Chain Part 3: Recidivate Transformed (Scroll)",
"questMoonstone3Text": "Recidivate Transformed",
"questMoonstone3Text": "The Moonstone Chain, Part 3: Recidivate Transformed",
"questMoonstone3Notes": "<p>Recidivate crumples to the ground, and you strike at her with the moonstone chain. To your horror, Recidivate seizes the gems, eyes burning with triumph.</p><br/><p>\"Foolish creature of flesh!\" she shouts. \"These moonstones will restore me to a physical form, true, but not as you imagined. As the full moon waxes from the dark, so too does my power flourish, and from the shadows I summon the specter of your most feared foe!\"</p><br/><p>A sickly green fog rises from the swamp, and Recidivates body writhes and contorts into a shape that fills you with dread the undead body of Vice, horribly reborn.</p>",
"questMoonstone3Completion": "<p>Your breath comes hard and sweat stings your eyes as the undead Wyrm collapses. The remains of Recidivate dissipate into a thin grey mist that clears quickly under the onslaught of a refreshing breeze, and you hear the distant, rallying cries of Habiticans defeating their Bad Habits for once and for all.</p><br/><p>@Baconsaur the beast master swoops down on a gryphon. \"I saw the end of your battle from the sky, and I was greatly moved. Please, take this enchanted tunic your bravery speaks of a noble heart, and I believe you were meant to have it.\"</p>",
"questMoonstone3Boss": "Necro-Vice",
"questMoonstone3DropRottenMeat": "Rotten Meat (Food)",
"questMoonstone3DropZombiePotion": "Zombie Hatching Potion",
"questGoldenknight1Text": "A Stern Talking-To",
"questGoldenknight1Text": "The Golden Knight, Part 1: A Stern Talking-To",
"questGoldenknight1Notes": "<p>The Golden Knight has been getting on poor Habiticans' cases. Didn't do all of your Dailies? Checked off a negative Habit? She will use this as a reason to harass you about how you should follow her example. She is the shining example of a perfect Habitican, and you are naught but a failure. Well, that is not nice at all! Everyone makes mistakes. They should not have to be met with such negativity for it. Perhaps it is time you gather some testimonies from hurt Habiticans and give the Golden Knight a stern talking-to!</p>",
"questGoldenknight1CollectTestimony": "Testimonies",
"questGoldenknight1DropGoldenknight2Quest": "The Golden Knight Chain Part 2: Tarnished Gold (Scroll)",
"questGoldenknight2Text": "Gold Knight",
"questGoldenknight2Text": "The Golden Knight, Part 2: Gold Knight",
"questGoldenknight2Notes": "<p>Armed with hundreds of Habitican's testimonies, you finally confront the Golden Knight. You begin to recite the Habitcan's complaints to her, one by one. \"And @Pfeffernusse says that your constant bragging-\" The knight raises her hand to silence you and scoffs, \"Please, these people are merely jealous of my success. Instead of complaining, they should simply work as hard as I! Perhaps I shall show you the power you can attain through diligence such as mine!\" She raises her morningstar and prepares to attack you!</p>",
"questGoldenknight2Boss": "Gold Knight",
"questGoldenknight2DropGoldenknight3Quest": "The Golden Knight Chain Part 3: The Iron Knight (Scroll)",
"questGoldenknight3Text": "The Iron Knight",
"questGoldenknight3Text": "The Golden Knight, Part 3: The Iron Knight",
"questGoldenknight3Notes": "<p>@Jon Arinbjorn cries out to you to get your attention. In the aftermath of your battle, a new figure has appeared. A knight coated in stained-black iron slowly approaches you with sword in hand. The Golden Knight shouts to the figure, \"Father, no!\" but knight shows no signs of stopping. She turns to you and says, \"I am sorry. I have been a fool, with a head too big to see how cruel I have been. But my father is crueler than I could ever be. If he isn't stopped he'll destroy us all. Here, use my morningstar and halt the Iron Knight!\"</p>",
"questGoldenknight3Completion": "<p>With a satisfying clang, the Iron Knight falls to his knees and slumps over. \"You are quite strong,\" he pants. \"I have been humbled, today.\" The Golden Knight approaches you and says, \"Thank you. I believe we have gained some humility from our encounter with you. I will speak with my father and explain the complaints against us. Perhaps, we should begin apologizing to the other Habiticans.\" She mulls over in thought before turning back to you. \"Here: as our gift to you, I want you to keep my morningstar. It is yours now.\"</p>",
"questGoldenknight3Boss": "The Iron Knight",
@ -151,17 +151,17 @@
"questSeahorseDropSeahorseEgg": "Seahorse (Egg)",
"questSeahorseUnlockText": "Unlocks purchasable seahorse eggs in the Market",
"questAtom1Text": "Attack of the Mundane Questline, Pt. 1: Dish Disaster!",
"questAtom1Text": "Attack of the Mundane, Part 1: Dish Disaster!",
"questAtom1Notes": "You reach the shores of Washed-Up Lake for some well-earned relaxation... But the lake is polluted with unwashed dishes! How did this happen? Well, you simply cannot allow the lake to be in this state. There is only one thing you can do: clean the dishes and save your vacation spot! Better find some soap to clean up this mess. A lot of soap...",
"questAtom1CollectSoapBars": "Bars of Soap",
"questAtom1Drop": "The SnackLess Monster (Scroll)",
"questAtom1Drop": "The SnackLess Monster (Quest Scroll)",
"questAtom2Text": "Attack of the Mundane Questline, Pt. 2: The SnackLess Monster",
"questAtom2Text": "Attack of the Mundane, Part 2: The SnackLess Monster",
"questAtom2Notes": "Phew, this place is looking a lot nicer with all these dishes cleaned. Maybe, you can finally have some fun now. Oh - there seems to be a pizza box floating in the lake. Well, what's one more thing to clean really? But alas, it is no mere pizza box! With a sudden rush the box lifts from the water to reveal itself to be the head of a monster. It cannot be! The fabled SnackLess Monster?! It is said it has existed hidden in the lake since prehistoric times: a creature spawned from the leftover food and trash of the ancient Habiticans. Yuck!",
"questAtom2Boss": "The SnackLess Monster",
"questAtom2Drop": "The Laundromancer Scroll (Scroll)",
"questAtom2Drop": "The Laundromancer (Quest Scroll)",
"questAtom3Text": "Attack of the Mundane Questline, Pt. 3: The Laundromancer",
"questAtom3Text": "Attack of the Mundane, Part 3: The Laundromancer",
"questAtom3Notes": "With a deafening cry, and five delicious types of cheese bursting from its mouth, the SnackLess Monster falls to pieces. \"HOW DARE YOU!\" booms a voice from beneath the water's surface. A robed, blue figure emerges from the water, wielding a magic toilet brush. Filthy laundry begins to bubble up to the surface of the lake. \"I am the Laundromancer!\" he angrily announces. \"You have some nerve - washing my delightfully dirty dishes, destroying my pet, and entering my domain with such clean clothes. Prepare to feel the soggy wrath of my anti-laundry magic!\"",
"questAtom3Completion": "The wicked Laundromancer has been defeated! Clean laundry falls in piles all around you. Things are looking much better around here. As you begin to wade through the freshly pressed armor, a glint of metal catches your eye, and your gaze falls upon a gleaming helm. The original owner of this shining item may be unknown, but as you put it on, you feel the warming presence of a generous spirit. Too bad they didn't sew on a nametag.",
"questAtom3Boss": "The Laundromancer",
@ -251,6 +251,31 @@
"questWhaleBoss": "Wailing Whale",
"questWhaleCompletion": "After much hard work, the whale finally ceases her thunderous cry. \"Looks like she was drowning in waves of negative habits,\" @zoebeagle explains. \"Thanks to your consistent effort, we were able to turn the tides!\" As you step into the submarine, several whale eggs bob towards you, and you scoop them up.",
"questWhaleDropWhaleEgg": "Whale (Egg)",
"questWhaleUnlockText": "Unlocks purchasable whale eggs in the Market"
"questWhaleUnlockText": "Unlocks purchasable whale eggs in the Market",
"questDilatoryDistress1Text": "Dilatory Distress, Part 1: Message in a Bottle",
"questDilatoryDistress1Notes": "A message in a bottle arrived from the newly rebuilt city of Dilatory! It reads: \"Dear Habiticans, we need your help once again. Our princess has disappeared and the city is under siege by some unknown watery demons! The mantis shrimps are holding the attackers at bay. Please aid us!\" To make the long journey to the sunken city, one must be able to breathe water. Fortunately, the alchemists @Benga and @hazel can make it all possible! You only have to find the proper ingredients.",
"questDilatoryDistress1Completion": "You don the the finned armor and swim to Dilatory as quickly as you can. The merfolk and their mantis shrimp allies have managed to keep the monsters outside the city for the moment, but they are losing. No sooner are you within the castle walls than the horrifying siege descends!",
"questDilatoryDistress1CollectFireCoral": "Fire Coral",
"questDilatoryDistress1CollectBlueFins": "Blue Fins",
"questDilatoryDistress1DropArmor": "Finned Oceanic Armor (Armor)",
"questDilatoryDistress2Text": "Dilatory Distress, Part 2: Creatures of the Crevasse",
"questDilatoryDistress2Notes": "The siege can be seen from miles away: thousands of disembodied skulls rushing through a portal in the crevasse walls and making their way towards Dilatory.<br><br>When you meet King Manta in his war room, his eyes seem sunken, and his face is worried. \"My daughter Adva disappeared into the Dark Crevasse just before this siege began. Please find her and bring her back home safely! I will lend you my Fire Coral Circlet to aid you. If you succeed, it is yours.\"",
"questDilatoryDistress2Completion": "You vanquish the nightmarish horde of skulls, but you feel no closer to finding Adva. You speak to @Kiwibot, the royal tracker, to see if she has any ideas. \"The mantis shrimps that defend the city must have seen Adva escape,\" @Kiwibot says. \"Try following them into the Dark Crevasse.\"",
"questDilatoryDistress2Boss": "Water Skull Swarm",
"questDilatoryDistress2RageTitle": "Swarm Respawn",
"questDilatoryDistress2RageDescription": "Swarm Respawn: This bar fills when you don't complete your Dailies. When it is full, the Water Skull Swarm will heal 30% of its remaining health!",
"questDilatoryDistress2RageEffect": "`Water Skull Swarm uses SWARM RESPAWN!`\n\nEmboldened by their victories, more skulls pour forth from the crevasse, bolstering the swarm!",
"questDilatoryDistress2DropSkeletonPotion": "Skeleton Hatching Potion",
"questDilatoryDistress2DropCottonCandyBluePotion": "Cotton Candy Blue Hatching Potion",
"questDilatoryDistress2DropHeadgear": "Fire Coral Circlet (Headgear)",
"questDilatoryDistress3Text": "Dilatory Distress, Part 3: Not a Mere Maid",
"questDilatoryDistress3Notes": "You follow the mantis shrimps deep into the Crevasse, and discover an underwater fortress. Princess Adva, escorted by more watery skulls, awaits you inside the main hall. \"My father has sent you, has he not? Tell him I refuse to return. I am content to stay here and practice my sorcery. Leave now, or you shall feel the wrath of the ocean's new queen!\" Adva seems very adamant, but as she speaks you notice a strange, ruby pendant on her neck glowing ominously... Perhaps her delusions would cease should you break it?",
"questDilatoryDistress3Completion": "Finally, you manage to pull the bewitched pendant from Adva's neck and throw it away. Adva clutches her head. \"Where am I? What happened here?\" After hearing your story, she frowns. \"This necklace was given to me by a strange ambassador - a lady called 'Tzina'. I don't remember anything after that!\"<br><br>Back at Dilatory, Manta is overjoyed by your success. \"Allow me to reward you with this trident and shield! I ordered them from @aiseant and @starsystemic as a gift for Adva, but... I'd rather not put weapons in her hands any time soon.\"",
"questDilatoryDistress3Boss": "Adva, the Usurping Mermaid",
"questDilatoryDistress3DropFish": "Fish (Food)",
"questDilatoryDistress3DropWeapon": "Trident of Crashing Tides (Weapon)",
"questDilatoryDistress3DropShield": "Moonpearl Shield (Shield-Hand Item)"
}

View file

@ -117,27 +117,29 @@ gear =
5: text: t('weaponHealer5Text'), notes: t('weaponHealer5Notes', {int: 9}), int: 9, value:90
6: text: t('weaponHealer6Text'), notes: t('weaponHealer6Notes', {int: 11}), int: 11, value:120, last: true
special:
# Backer, Contributor, and Quest Rewards
0: text: t('weaponSpecial0Text'), notes: t('weaponSpecial0Notes', {str: 20}), str: 20, value:150, canOwn: ((u)-> +u.backer?.tier >= 70)
1: text: t('weaponSpecial1Text'), notes: t('weaponSpecial1Notes', {attrs: 6}), str: 6, per: 6, con: 6, int: 6, value:170, canOwn: ((u)-> +u.contributor?.level >= 4)
2: text: t('weaponSpecial2Text'), notes: t('weaponSpecial2Notes', {attrs: 25}), str: 25, per: 25, value:200, canOwn: ((u)-> (+u.backer?.tier >= 300) or u.items.gear.owned.weapon_special_2?)
3: text: t('weaponSpecial3Text'), notes: t('weaponSpecial3Notes', {attrs: 17}), str: 17, int: 17, con: 17, value:200, canOwn: ((u)-> (+u.backer?.tier >= 300) or u.items.gear.owned.weapon_special_3?)
critical: text: t('weaponSpecialCriticalText'), notes: t('weaponSpecialCriticalNotes', {attrs: 40}), str: 40, per: 40, value:200, canOwn: ((u)-> !!u.contributor?.critical)
# Winter event gear
tridentOfCrashingTides: text: t('weaponSpecialTridentOfCrashingTidesText'), notes: t('weaponSpecialTridentOfCrashingTidesNotes', {int: 15}), int: 15, value: 130, canOwn: ((u)-> u.items.gear.owned.weapon_special_tridentOfCrashingTides?)
# Winter Wonderland
yeti: event: events.winter, specialClass: 'warrior', text: t('weaponSpecialYetiText'), notes: t('weaponSpecialYetiNotes', {str: 15}), str: 15, value:90
ski: event: events.winter, specialClass: 'rogue', text: t('weaponSpecialSkiText'), notes: t('weaponSpecialSkiNotes', {str: 8}), str: 8, value: 90
candycane: event: events.winter, specialClass: 'wizard', twoHanded: true, text: t('weaponSpecialCandycaneText'), notes: t('weaponSpecialCandycaneNotes', {int: 15, per: 7}), int: 15, per: 7, value:160
snowflake: event: events.winter, specialClass: 'healer', text: t('weaponSpecialSnowflakeText'), notes: t('weaponSpecialSnowflakeNotes', {int: 9}), int: 9, value:90
#Spring Fling
# Spring Fling
springRogue: event: events.spring, specialClass: 'rogue', text: t('weaponSpecialSpringRogueText'), notes: t('weaponSpecialSpringRogueNotes', {str: 8}), value: 80, str: 8
springWarrior: event: events.spring, specialClass: 'warrior', text: t('weaponSpecialSpringWarriorText'), notes: t('weaponSpecialSpringWarriorNotes', {str: 15}), value: 90, str: 15
springMage: event: events.spring, specialClass: 'wizard', twoHanded:true, text: t('weaponSpecialSpringMageText'), notes: t('weaponSpecialSpringMageNotes', {int: 15, per: 7}), value: 160, int:15, per:7
springHealer: event: events.spring, specialClass: 'healer', text: t('weaponSpecialSpringHealerText'), notes: t('weaponSpecialSpringHealerNotes', {int: 9}), value: 90, int: 9
#Summer
# Summer Splash
summerRogue: event: events.summer, specialClass: 'rogue', text: t('weaponSpecialSummerRogueText'), notes: t('weaponSpecialSummerRogueNotes', {str: 8}), value: 80, str: 8
summerWarrior: event: events.summer, specialClass: 'warrior', text: t('weaponSpecialSummerWarriorText'), notes: t('weaponSpecialSummerWarriorNotes', {str: 15}), value: 90, str: 15
summerMage: event: events.summer, specialClass: 'wizard', twoHanded:true, text: t('weaponSpecialSummerMageText'), notes: t('weaponSpecialSummerMageNotes', {int: 15, per: 7}), value: 160, int:15, per:7
summerHealer: event: events.summer, specialClass: 'healer', text: t('weaponSpecialSummerHealerText'), notes: t('weaponSpecialSummerHealerNotes', {int: 9}), value: 90, int: 9
#Fall
# Fall Festival
fallRogue: event: events.fall, specialClass: 'rogue', text: t('weaponSpecialFallRogueText'), notes: t('weaponSpecialFallRogueNotes', {str: 8}), value: 80, str: 8
fallWarrior: event: events.fall, specialClass: 'warrior', text: t('weaponSpecialFallWarriorText'), notes: t('weaponSpecialFallWarriorNotes', {str: 15}), value: 90, str: 15
fallMage: event: events.fall, specialClass: 'wizard', twoHanded:true, text: t('weaponSpecialFallMageText'), notes: t('weaponSpecialFallMageNotes', {int: 15, per: 7}), value: 160, int:15, per:7
@ -165,43 +167,42 @@ gear =
armoire:
basicCrossbow: text: t('weaponArmoireBasicCrossbowText'), notes: t('weaponArmoireBasicCrossbowNotes', {str: 5, per: 5, con: 5}), value: 100, str: 5, per: 5, con: 5, canOwn: ((u)-> u.items.gear.owned.weapon_armoire_basicCrossbow?)
lunarSceptre: text: t('weaponArmoireLunarSceptreText'), notes: t('weaponArmoireLunarSceptreNotes', {con: 7, int: 7}), value: 100, con: 7, int: 7, set: 'soothing', canOwn: ((u)-> u.items.gear.owned.weapon_armoire_lunarSceptre?)
rancherLasso: text: t('weaponArmoireRancherLassoText'), notes: t('weaponArmoireRancherLassoNotes', twoHanded:true, {str: 5, per: 5, int: 5}), value: 100, str: 5, per: 5, int: 5, set: 'rancher', canOwn: ((u)-> u.items.gear.owned.weapon_armoire_rancherLasso?)
armor:
base:
0: text: t('armorBase0Text'), notes: t('armorBase0Notes'), value:0
warrior:
#0: text: "Plain Clothing", notes:'Ordinary clothing. Confers no benefit.', value:0
1: text: t('armorWarrior1Text'), notes: t('armorWarrior1Notes', {con: 3}), con: 3, value:30
2: text: t('armorWarrior2Text'), notes: t('armorWarrior2Notes', {con: 5}), con: 5, value:45
3: text: t('armorWarrior3Text'), notes: t('armorWarrior3Notes', {con: 7}), con: 7, value:65
4: text: t('armorWarrior4Text'), notes: t('armorWarrior4Notes', {con: 9}), con: 9, value:90
5: text: t('armorWarrior5Text'), notes: t('armorWarrior5Notes', {con: 11}), con: 11, value:120, last: true
rogue:
#0: text: "Plain Clothing", notes:'Ordinary clothing. Confers no benefit.', value:0
1: text: t('armorRogue1Text'), notes: t('armorRogue1Notes', {per: 6}), per: 6, value:30
2: text: t('armorRogue2Text'), notes: t('armorRogue2Notes', {per: 9}), per: 9, value:45
3: text: t('armorRogue3Text'), notes: t('armorRogue3Notes', {per: 12}), per: 12, value:65
4: text: t('armorRogue4Text'), notes: t('armorRogue4Notes', {per: 15}), per: 15, value:90
5: text: t('armorRogue5Text'), notes: t('armorRogue5Notes', {per: 18}), per: 18, value:120, last: true
wizard:
#0: text: "Apprentice Garb", notes:'For students of magic. Confers no benefit.', value:0
1: text: t('armorWizard1Text'), notes: t('armorWizard1Notes', {int: 2}), int: 2, value:30
2: text: t('armorWizard2Text'), notes: t('armorWizard2Notes', {int: 4}), int: 4, value:45
3: text: t('armorWizard3Text'), notes: t('armorWizard3Notes', {int: 6}), int: 6, value:65
4: text: t('armorWizard4Text'), notes: t('armorWizard4Notes', {int: 9}), int: 9, value:90
5: text: t('armorWizard5Text'), notes: t('armorWizard5Notes', {int: 12}), int: 12, value:120, last: true
healer:
#0: text: "Novice Robe", notes:'For healers in training. Confers no benefit.', value:0
1: text: t('armorHealer1Text'), notes: t('armorHealer1Notes', {con: 6}), con: 6, value:30
2: text: t('armorHealer2Text'), notes: t('armorHealer2Notes', {con: 9}), con: 9, value:45
3: text: t('armorHealer3Text'), notes: t('armorHealer3Notes', {con: 12}), con: 12, value:65
4: text: t('armorHealer4Text'), notes: t('armorHealer4Notes', {con: 15}), con: 15, value:90
5: text: t('armorHealer5Text'), notes: t('armorHealer5Notes', {con: 18}), con: 18, value:120, last: true
special:
# Backer, Contributor, and Quest Rewards
0: text: t('armorSpecial0Text'), notes: t('armorSpecial0Notes', {con: 20}), con: 20, value:150, canOwn: ((u)-> +u.backer?.tier >= 45)
1: text: t('armorSpecial1Text'), notes: t('armorSpecial1Notes', {attrs: 6}), con: 6, str: 6, per: 6, int: 6, value:170, canOwn: ((u)-> +u.contributor?.level >= 2)
2: text: t('armorSpecial2Text'), notes: t('armorSpecial2Notes', {attrs: 25}), int: 25, con: 25, value:200, canOwn: ((u)-> +u.backer?.tier >= 300 or u.items.gear.owned.armor_special_2?)
#Winter event
finnedOceanicArmor: text: t('armorSpecialFinnedOceanicArmorText'), notes: t('armorSpecialFinnedOceanicArmorNotes', {str: 15}), str: 15, value: 130, canOwn: ((u)-> u.items.gear.owned.armor_special_finnedOceanicArmor?)
# Winter Wonderland
yeti: event: events.winter, specialClass: 'warrior', text: t('armorSpecialYetiText'), notes: t('armorSpecialYetiNotes', {con: 9}), con: 9, value:90
ski: event: events.winter, specialClass: 'rogue', text: t('armorSpecialSkiText'), notes: t('armorSpecialSkiNotes', {per: 15}), per: 15, value:90
candycane: event: events.winter, specialClass: 'wizard', text: t('armorSpecialCandycaneText'), notes: t('armorSpecialCandycaneNotes', {int: 9}), int: 9, value:90
@ -212,12 +213,12 @@ gear =
springWarrior: event: events.spring, specialClass: 'warrior', text: t('armorSpecialSpringWarriorText'), notes: t('armorSpecialSpringWarriorNotes', {con: 9}), value: 90, con: 9
springMage: event: events.spring, specialClass: 'wizard', text: t('armorSpecialSpringMageText'), notes: t('armorSpecialSpringMageNotes', {int: 9}), value: 90, int: 9
springHealer: event: events.spring, specialClass: 'healer', text: t('armorSpecialSpringHealerText'), notes: t('armorSpecialSpringHealerNotes', {con: 15}), value: 90, con: 15
# Summer
# Summer Splash
summerRogue: event: events.summer, specialClass: 'rogue', text: t('armorSpecialSummerRogueText'), notes: t('armorSpecialSummerRogueNotes', {per: 15}), value: 90, per: 15
summerWarrior: event: events.summer, specialClass: 'warrior', text: t('armorSpecialSummerWarriorText'), notes: t('armorSpecialSummerWarriorNotes', {con: 9}), value: 90, con: 9
summerMage: event: events.summer, specialClass: 'wizard', text: t('armorSpecialSummerMageText'), notes: t('armorSpecialSummerMageNotes', {int: 9}), value: 90, int: 9
summerHealer: event: events.summer, specialClass: 'healer', text: t('armorSpecialSummerHealerText'), notes: t('armorSpecialSummerHealerNotes', {con: 15}), value: 90, con: 15
# Fall
# Fall Festival
fallRogue: event: events.fall, specialClass: 'rogue', text: t('armorSpecialFallRogueText'), notes: t('armorSpecialFallRogueNotes', {per: 15}), value: 90, per: 15
fallWarrior: event: events.fall, specialClass: 'warrior', text: t('armorSpecialFallWarriorText'), notes: t('armorSpecialFallWarriorNotes', {con: 9}), value: 90, con: 9
fallMage: event: events.fall, specialClass: 'wizard', text: t('armorSpecialFallMageText'), notes: t('armorSpecialFallMageNotes', {int: 9}), value: 90, int: 9
@ -258,43 +259,42 @@ gear =
armoire:
lunarArmor: text: t('armorArmoireLunarArmorText'), notes: t('armorArmoireLunarArmorNotes', {str: 7, int: 7}), value: 100, str: 7, int: 7, set: 'soothing', canOwn: ((u)-> u.items.gear.owned.armor_armoire_lunarArmor?)
gladiatorArmor: text: t('armorArmoireGladiatorArmorText'), notes: t('armorArmoireGladiatorArmorNotes', {str: 7, per: 7}), value: 100, str: 7, per: 7, set: 'gladiator', canOwn: ((u)-> u.items.gear.owned.armor_armoire_gladiatorArmor?)
rancherRobes: text: t('armorArmoireRancherRobesText'), notes: t('armorArmoireRancherRobesNotes', {str: 5, per: 5, int: 5}), value: 100, str: 5, per: 5, int: 5, set: 'rancher', canOwn: ((u)-> u.items.gear.owned.armor_armoire_rancherRobes?)
head:
base:
0: text: t('headBase0Text'), notes: t('headBase0Notes'), value:0
warrior:
#0: text: "No Helm", notes:'No headgear.', value:0
1: text: t('headWarrior1Text'), notes: t('headWarrior1Notes', {str: 2}), str: 2, value:15
2: text: t('headWarrior2Text'), notes: t('headWarrior2Notes', {str: 4}), str: 4, value:25
3: text: t('headWarrior3Text'), notes: t('headWarrior3Notes', {str: 6}), str: 6, value:40
4: text: t('headWarrior4Text'), notes: t('headWarrior4Notes', {str: 9}), str: 9, value:60
5: text: t('headWarrior5Text'), notes: t('headWarrior5Notes', {str: 12}), str: 12, value:80, last: true
rogue:
#0: text: "No Hood", notes:'No headgear.', value:0
1: text: t('headRogue1Text'), notes: t('headRogue1Notes', {per: 2}), per: 2, value:15
2: text: t('headRogue2Text'), notes: t('headRogue2Notes', {per: 4}), per: 4, value:25
3: text: t('headRogue3Text'), notes: t('headRogue3Notes', {per: 6}), per: 6, value:40
4: text: t('headRogue4Text'), notes: t('headRogue4Notes', {per: 9}), per: 9, value:60
5: text: t('headRogue5Text'), notes: t('headRogue5Notes', {per: 12}), per: 12, value:80, last: true
wizard:
#0: text: "No Hat", notes:'No headgear.', value:0
1: text: t('headWizard1Text'), notes: t('headWizard1Notes', {per: 2}), per: 2, value:15
2: text: t('headWizard2Text'), notes: t('headWizard2Notes', {per: 3}), per: 3, value:25
3: text: t('headWizard3Text'), notes: t('headWizard3Notes', {per: 5}), per: 5, value:40
4: text: t('headWizard4Text'), notes: t('headWizard4Notes', {per: 7}), per: 7, value:60
5: text: t('headWizard5Text'), notes: t('headWizard5Notes', {per: 10}), per: 10, value:80, last: true
healer:
#0: text: "No Circlet", notes:'No headgear.', value:0
1: text: t('headHealer1Text'), notes: t('headHealer1Notes', {int: 2}), int: 2, value:15
2: text: t('headHealer2Text'), notes: t('headHealer2Notes', {int: 3}), int: 3, value:25
3: text: t('headHealer3Text'), notes: t('headHealer3Notes', {int: 5}), int: 5, value:40
4: text: t('headHealer4Text'), notes: t('headHealer4Notes', {int: 7}), int: 7, value:60
5: text: t('headHealer5Text'), notes: t('headHealer5Notes', {int: 9}), int: 9, value:80, last: true
special:
# Backer, Contributor, and Quest Rewards
0: text: t('headSpecial0Text'), notes: t('headSpecial0Notes', {int: 20}), int: 20, value:150, canOwn: ((u)-> +u.backer?.tier >= 45)
1: text: t('headSpecial1Text'), notes: t('headSpecial1Notes', {attrs: 6}), con: 6, str: 6, per: 6, int: 6, value:170, canOwn: ((u)-> +u.contributor?.level >= 3)
2: text: t('headSpecial2Text'), notes: t('headSpecial2Notes', {attrs: 25}), int: 25, str: 25, value:200, canOwn: ((u)-> (+u.backer?.tier >= 300) or u.items.gear.owned.head_special_2?)
#Winter event
fireCoralCirclet: text: t('headSpecialFireCoralCircletText'), notes: t('headSpecialFireCoralCircletNotes', {per: 15}), per: 15, value: 130, canOwn: ((u)-> u.items.gear.owned.head_special_fireCoralCirclet?)
# Winter Wonderland
nye: event: events.winter, text: t('headSpecialNyeText'), notes: t('headSpecialNyeNotes'), value: 0
yeti: event: events.winter, specialClass: 'warrior', text: t('headSpecialYetiText'), notes: t('headSpecialYetiNotes', {str: 9}), str: 9, value:60
ski: event: events.winter, specialClass: 'rogue', text: t('headSpecialSkiText'), notes: t('headSpecialSkiNotes', {per: 9}), per: 9, value:60
@ -305,12 +305,12 @@ gear =
springWarrior: event: events.spring, specialClass: 'warrior', text: t('headSpecialSpringWarriorText'), notes: t('headSpecialSpringWarriorNotes', {str: 9}),value: 60,str: 9
springMage: event: events.spring, specialClass: 'wizard', text: t('headSpecialSpringMageText'), notes: t('headSpecialSpringMageNotes', {per: 7}),value: 60,per: 7
springHealer: event: events.spring, specialClass: 'healer', text: t('headSpecialSpringHealerText'), notes: t('headSpecialSpringHealerNotes', {int: 7}), value: 60, int: 7
# Summer
# Summer Splash
summerRogue: event: events.summer, specialClass: 'rogue', text: t('headSpecialSummerRogueText'), notes: t('headSpecialSummerRogueNotes', {per: 9}),value: 60,per: 9
summerWarrior: event: events.summer, specialClass: 'warrior', text: t('headSpecialSummerWarriorText'), notes: t('headSpecialSummerWarriorNotes', {str: 9}),value: 60,str: 9
summerMage: event: events.summer, specialClass: 'wizard', text: t('headSpecialSummerMageText'), notes: t('headSpecialSummerMageNotes', {per: 7}),value: 60,per: 7
summerHealer: event: events.summer, specialClass: 'healer', text: t('headSpecialSummerHealerText'), notes: t('headSpecialSummerHealerNotes', {int: 7}), value: 60, int: 7
# Fall
# Fall Festival
fallRogue: event: events.fall, specialClass: 'rogue', text: t('headSpecialFallRogueText'), notes: t('headSpecialFallRogueNotes', {per: 9}),value: 60,per: 9
fallWarrior: event: events.fall, specialClass: 'warrior', text: t('headSpecialFallWarriorText'), notes: t('headSpecialFallWarriorNotes', {str: 9}),value: 60,str: 9
fallMage: event: events.fall, specialClass: 'wizard', text: t('headSpecialFallMageText'), notes: t('headSpecialFallMageNotes', {per: 7}),value: 60,per: 7
@ -350,7 +350,9 @@ gear =
redHairbow: text: t('headArmoireRedHairbowText'), notes: t('headArmoireRedHairbowNotes', {str: 5, int: 5, con: 5}), value: 100, str: 5, int: 5, con: 5, canOwn: ((u)-> u.items.gear.owned.head_armoire_redHairbow?)
violetFloppyHat: text: t('headArmoireVioletFloppyHatText'), notes: t('headArmoireVioletFloppyHatNotes', {per: 5, int: 5, con: 5}), value: 100, per: 5, int: 5, con: 5, canOwn: ((u)-> u.items.gear.owned.head_armoire_violetFloppyHat?)
gladiatorHelm: text: t('headArmoireGladiatorHelmText'), notes: t('headArmoireGladiatorHelmNotes', {per: 7, int: 7}), value: 100, per: 7, int: 7, set: 'gladiator', canOwn: ((u)-> u.items.gear.owned.head_armoire_gladiatorHelm?)
rancherHat: text: t('headArmoireRancherHatText'), notes: t('headArmoireRancherHatNotes', {str: 5, per: 5, int: 5}), value: 100, str: 5, per: 5, int: 5, canOwn: ((u)-> u.items.gear.owned.head_armoire_rancherHat?)
rancherHat: text: t('headArmoireRancherHatText'), notes: t('headArmoireRancherHatNotes', {str: 5, per: 5, int: 5}), value: 100, str: 5, per: 5, int: 5, set: 'rancher', canOwn: ((u)-> u.items.gear.owned.head_armoire_rancherHat?)
royalCrown: text: t('headArmoireRoyalCrownText'), notes: t('headArmoireRoyalCrownNotes', {str: 10}), value: 100, str: 10, canOwn: ((u)-> u.items.gear.owned.head_armoire_royalCrown?)
blueHairbow: text: t('headArmoireBlueHairbowText'), notes: t('headArmoireBlueHairbowNotes', {per: 5, int: 5, con: 5}), value: 100, per: 5, int: 5, con: 5, canOwn: ((u)-> u.items.gear.owned.head_armoire_blueHairbow?)
shield:
base:
@ -381,22 +383,24 @@ gear =
4: text: t('shieldHealer4Text'), notes: t('shieldHealer4Notes', {con: 9}), con: 9, value:70
5: text: t('shieldHealer5Text'), notes: t('shieldHealer5Notes', {con: 12}), con: 12, value:90, last: true
special:
# Backer, Contributor, and Quest Rewards
0: text: t('shieldSpecial0Text'), notes: t('shieldSpecial0Notes', {per: 20}), per: 20, value:150, canOwn: ((u)-> +u.backer?.tier >= 45)
1: text: t('shieldSpecial1Text'), notes: t('shieldSpecial1Notes', {attrs: 6}), con: 6, str: 6, per: 6, int:6, value:170, canOwn: ((u)-> +u.contributor?.level >= 5)
goldenknight: text: t('shieldSpecialGoldenknightText'), notes: t('shieldSpecialGoldenknightNotes', {attrs: 25}), con: 25, per: 25, value:200, canOwn: ((u)-> u.items.gear.owned.shield_special_goldenknight?)
#Winter event
moonpearlShield: text: t('shieldSpecialMoonpearlShieldText'), notes: t('shieldSpecialMoonpearlShieldNotes', {con: 15}), con: 15, value: 130, canOwn: ((u)-> u.items.gear.owned.shield_special_moonpearlShield?)
# Winter Wonderland
yeti: event: events.winter, specialClass: 'warrior', text: t('shieldSpecialYetiText'), notes: t('shieldSpecialYetiNotes', {con: 7}), con: 7, value: 70
ski: event: events.winter, specialClass: 'rogue', text: t('weaponSpecialSkiText'), notes: t('weaponSpecialSkiNotes', {str: 8}), str: 8, value: 90
snowflake: event: events.winter, specialClass: 'healer', text: t('shieldSpecialSnowflakeText'), notes: t('shieldSpecialSnowflakeNotes', {con: 9}), con: 9, value: 70
#Spring Fling
# Spring Fling
springRogue: event: events.spring, specialClass: 'rogue', text: t('shieldSpecialSpringRogueText'), notes: t('shieldSpecialSpringRogueNotes', {str: 8}), value: 80, str: 8
springWarrior: event: events.spring, specialClass: 'warrior', text: t('shieldSpecialSpringWarriorText'), notes: t('shieldSpecialSpringWarriorNotes', {con: 7}), value: 70, con: 7
springHealer: event: events.spring, specialClass: 'healer', text: t('shieldSpecialSpringHealerText'), notes: t('shieldSpecialSpringHealerNotes', {con: 9}), value: 70, con: 9
#Summer
# Summer Splash
summerRogue: event: events.summer, specialClass: 'rogue', text: t('shieldSpecialSummerRogueText'), notes: t('shieldSpecialSummerRogueNotes', {str: 8}), value: 80, str: 8
summerWarrior: event: events.summer, specialClass: 'warrior', text: t('shieldSpecialSummerWarriorText'), notes: t('shieldSpecialSummerWarriorNotes', {con: 7}), value: 70, con: 7
summerHealer: event: events.summer, specialClass: 'healer', text: t('shieldSpecialSummerHealerText'), notes: t('shieldSpecialSummerHealerNotes', {con: 9}), value: 70, con: 9
#Fall
# Fall Festival
fallRogue: event: events.fall, specialClass: 'rogue', text: t('shieldSpecialFallRogueText'), notes: t('shieldSpecialFallRogueNotes', {str: 8}), value: 80, str: 8
fallWarrior: event: events.fall, specialClass: 'warrior', text: t('shieldSpecialFallWarriorText'), notes: t('shieldSpecialFallWarriorNotes', {con: 7}), value: 70, con: 7
fallHealer: event: events.fall, specialClass: 'healer', text: t('shieldSpecialFallHealerText'), notes: t('shieldSpecialFallHealerNotes', {con: 9}), value: 70, con: 9
@ -1659,6 +1663,7 @@ api.quests =
text: t('questBasilistText')
notes: t('questBasilistNotes')
completion: t('questBasilistCompletion')
value: 4
category: 'unlockable'
unlockCondition:
condition: 'party invite'
@ -1876,6 +1881,70 @@ api.quests =
gp: 37
exp: 275
unlock: t('questWhaleUnlockText')
dilatoryDistress1:
text: t('questDilatoryDistress1Text')
notes: t('questDilatoryDistress1Notes')
completion: t('questDilatoryDistress1Completion')
value: 4
goldValue: 200
category: 'gold'
collect:
fireCoral: text: t('questDilatoryDistress1CollectFireCoral'), count: 25
blueFins: text: t('questDilatoryDistress1CollectBlueFins'), count: 25
drop:
items: [
{type: 'gear', key: "armor_special_finnedOceanicArmor", text: t('questDilatoryDistress1DropArmor')}
]
gp: 0
exp: 75
dilatoryDistress2:
text: t('questDilatoryDistress2Text')
notes: t('questDilatoryDistress2Notes')
completion: t('questDilatoryDistress2Completion')
previous: 'dilatoryDistress1'
value: 4
goldValue: 300
category: 'gold'
boss:
name: t('questDilatoryDistress2Boss')
hp: 500
rage:
title: t("questDilatoryDistress2RageTitle")
description: t("questDilatoryDistress2RageDescription")
value: 50
healing: .3
effect:t('questDilatoryDistress2RageEffect')
drop:
items: [
{type: 'hatchingPotions', key: 'Skeleton', text: t('questDilatoryDistress2DropSkeletonPotion')}
{type: 'hatchingPotions', key: 'CottonCandyBlue', text: t('questDilatoryDistress2DropCottonCandyBluePotion')}
{type: 'gear', key: "head_special_fireCoralCirclet", text: t('questDilatoryDistress2DropHeadgear')}
]
gp: 0
exp: 500
dilatoryDistress3:
text: t('questDilatoryDistress3Text')
notes: t('questDilatoryDistress3Notes')
completion: t('questDilatoryDistress3Completion')
previous: 'dilatoryDistress2'
value: 4
goldValue: 400
category: 'gold'
boss:
name: t('questDilatoryDistress3Boss')
hp: 1000
str: 2
drop:
items: [
{type: 'food', key: 'Fish', text: t('questDilatoryDistress3DropFish')}
{type: 'food', key: 'Fish', text: t('questDilatoryDistress3DropFish')}
{type: 'food', key: 'Fish', text: t('questDilatoryDistress3DropFish')}
{type: 'gear', key: "weapon_special_tridentOfCrashingTides", text: t('questDilatoryDistress3DropWeapon')}
{type: 'gear', key: "shield_special_moonpearlShield", text: t('questDilatoryDistress3DropShield')}
]
gp: 0
exp: 650
_.each api.quests, (v,key) ->
_.defaults v, {key,canBuy:true}

View file

@ -925,11 +925,11 @@ api.wrap = (user, main=true) ->
{key} = req.params
item = content.quests[key]
return cb?({code:404, message:"Quest '#{key} not found (see https://github.com/HabitRPG/habitrpg/blob/develop/common/script/content.coffee)"}) unless item
return cb?({code:401, message: i18n.t('messageNotEnoughGold', req.language)}) if user.stats.gp < item.value
return cb?({code:401, message: i18n.t('messageNotEnoughGold', req.language)}) if user.stats.gp < item.goldValue
message = i18n.t('messageBought', {itemText: item.text(req.language)}, req.language)
user.items.quests[item.key] ?= 0
user.items.quests[item.key] += 1
user.stats.gp -= item.value
user.stats.gp -= item.goldValue
cb? {code:200, message}, user.items.quests
buyMysterySet: (req, cb)->

View file

@ -0,0 +1,5 @@
db.users.update(
{'flags.armoireEmpty':true},
{$set:{'flags.armoireEmpty':false}},
{multi:true}
);

View file

@ -29,11 +29,11 @@
button.customize-option(data-popover-html="{{::lockQuest(quest,true) ? env.t('scrollsPre') : questPopover(quest) | markdown}}", popover-title='{{::quest.text()}}', popover-append-to-body="true", popover-trigger='mouseenter', ng-click='buyQuest(quest.key)', ng-class='lockQuest(quest) ? "inventory_quest_scroll_locked inventory_quest_scroll_{{::quest.key}}_locked locked" : "inventory_quest_scroll inventory_quest_scroll_{{::quest.key}}"')
p(ng-if='quest.unlockCondition')
| {{::quest.unlockCondition.text()}}
p(ng-if='quest.value && quest.category !== "gold" && !lockQuest(quest)')
p(ng-if='!quest.unlockCondition && quest.category !== "gold" && !lockQuest(quest)')
| {{::quest.value}}&nbsp;
span.Pet_Currency_Gem1x.inline-gems
p(ng-if='quest.value && quest.category === "gold" && !lockQuest(quest)')
| {{::quest.value}}&nbsp;
p(ng-if='quest.category === "gold" && !lockQuest(quest)')
| {{::quest.goldValue}}&nbsp;
span.shop_gold
p(ng-if='quest.lvl && lockQuest(quest)')=env.t('level')
| {{::quest.lvl}}

View file

@ -4,6 +4,7 @@ else
div(class="quest_{{::group.quest.key}}")
.hero-stats
h4 {{::Content.quests[group.quest.key].boss.name()}}
.meter-label(tooltip=env.t('bossHP'))
span.glyphicon.glyphicon-heart
.meter.health
@ -16,7 +17,7 @@ else
span.glyphicon.glyphicon-fire
.meter.mana(popover="{{::boss.rage.description()}}",
popover-title="{{::boss.rage.title()}}",
popover-trigger='mouseenter', popover-placement='right')
popover-trigger='mouseenter', popover-placement='bottom')
.bar(ng-style='{width: Shared.percent(progress.rage, boss.rage.value) + "%"}')
span.meter-text.value
| {{Math.ceil(progress.rage) | roundLargeNumbers}}