Merge branch 'develop' into new_party_badges

This commit is contained in:
Kaitlin Hipkin
2016-03-15 16:17:25 -04:00
173 changed files with 8452 additions and 7592 deletions
-2
View File
@@ -32,7 +32,6 @@
"no-octal": 2,
"no-process-env": 2,
"no-proto": 2,
"no-implied-eval": 2,
"yoda": 2,
"wrap-iife": 2,
"radix": 2,
@@ -59,7 +58,6 @@
"no-path-concat": 2,
"arrow-spacing": 2,
"constructor-super": 2,
"generator-star-spacing": 2,
"no-arrow-condition": 2,
"no-class-assign": 2,
"no-const-assign": 2,
+1 -1
View File
@@ -1 +1 @@
0.10.40
4.3.1
+1 -1
View File
@@ -1,6 +1,6 @@
language: node_js
node_js:
- '0.10'
- '4.3.1'
before_install:
- "npm install -g npm@2"
- "npm install -g gulp"
Binary file not shown.

Before

Width:  |  Height:  |  Size: 234 KiB

After

Width:  |  Height:  |  Size: 233 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 293 KiB

After

Width:  |  Height:  |  Size: 291 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 59 KiB

File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 146 KiB

After

Width:  |  Height:  |  Size: 142 KiB

+1404 -1224
View File
File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 KiB

After

Width:  |  Height:  |  Size: 158 KiB

+144
View File
@@ -0,0 +1,144 @@
.Pet-Wolf-CottonCandyBlue {
background-image: url(spritesmith-main-12.png);
background-position: -82px 0px;
width: 81px;
height: 99px;
}
.Pet-Wolf-CottonCandyPink {
background-image: url(spritesmith-main-12.png);
background-position: -246px -200px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Desert {
background-image: url(spritesmith-main-12.png);
background-position: -246px 0px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Golden {
background-image: url(spritesmith-main-12.png);
background-position: -164px 0px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Peppermint {
background-image: url(spritesmith-main-12.png);
background-position: 0px -100px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Red {
background-image: url(spritesmith-main-12.png);
background-position: -82px -100px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Shade {
background-image: url(spritesmith-main-12.png);
background-position: -164px -100px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Skeleton {
background-image: url(spritesmith-main-12.png);
background-position: 0px 0px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Spooky {
background-image: url(spritesmith-main-12.png);
background-position: -246px -100px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Veteran {
background-image: url(spritesmith-main-12.png);
background-position: 0px -200px;
width: 81px;
height: 99px;
}
.Pet-Wolf-White {
background-image: url(spritesmith-main-12.png);
background-position: -82px -200px;
width: 81px;
height: 99px;
}
.Pet-Wolf-Zombie {
background-image: url(spritesmith-main-12.png);
background-position: -164px -200px;
width: 81px;
height: 99px;
}
.Pet_HatchingPotion_Base {
background-image: url(spritesmith-main-12.png);
background-position: -294px -300px;
width: 48px;
height: 51px;
}
.Pet_HatchingPotion_CottonCandyBlue {
background-image: url(spritesmith-main-12.png);
background-position: -328px -52px;
width: 48px;
height: 51px;
}
.Pet_HatchingPotion_CottonCandyPink {
background-image: url(spritesmith-main-12.png);
background-position: -328px -104px;
width: 48px;
height: 51px;
}
.Pet_HatchingPotion_Desert {
background-image: url(spritesmith-main-12.png);
background-position: -328px -156px;
width: 48px;
height: 51px;
}
.Pet_HatchingPotion_Golden {
background-image: url(spritesmith-main-12.png);
background-position: -328px -208px;
width: 48px;
height: 51px;
}
.Pet_HatchingPotion_Peppermint {
background-image: url(spritesmith-main-12.png);
background-position: 0px -300px;
width: 48px;
height: 51px;
}
.Pet_HatchingPotion_Red {
background-image: url(spritesmith-main-12.png);
background-position: -49px -300px;
width: 48px;
height: 51px;
}
.Pet_HatchingPotion_Shade {
background-image: url(spritesmith-main-12.png);
background-position: -98px -300px;
width: 48px;
height: 51px;
}
.Pet_HatchingPotion_Skeleton {
background-image: url(spritesmith-main-12.png);
background-position: -147px -300px;
width: 48px;
height: 51px;
}
.Pet_HatchingPotion_Spooky {
background-image: url(spritesmith-main-12.png);
background-position: -196px -300px;
width: 48px;
height: 51px;
}
.Pet_HatchingPotion_White {
background-image: url(spritesmith-main-12.png);
background-position: -245px -300px;
width: 48px;
height: 51px;
}
.Pet_HatchingPotion_Zombie {
background-image: url(spritesmith-main-12.png);
background-position: -328px 0px;
width: 48px;
height: 51px;
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 136 KiB

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 133 KiB

After

Width:  |  Height:  |  Size: 133 KiB

+239 -233
View File
@@ -120,175 +120,31 @@
}
.shop_body_special_wondercon_black {
background-image: url(spritesmith-main-5.png);
background-position: -1700px -144px;
background-position: -697px -1680px;
width: 40px;
height: 40px;
}
.shop_body_special_wondercon_gold {
background-image: url(spritesmith-main-5.png);
background-position: -1066px -1680px;
background-position: -1107px -1680px;
width: 40px;
height: 40px;
}
.shop_body_special_wondercon_red {
background-image: url(spritesmith-main-5.png);
background-position: -1025px -1680px;
background-position: -1066px -1680px;
width: 40px;
height: 40px;
}
.shop_eyewear_special_wondercon_black {
background-image: url(spritesmith-main-5.png);
background-position: -984px -1680px;
background-position: -1025px -1680px;
width: 40px;
height: 40px;
}
.shop_eyewear_special_wondercon_red {
background-image: url(spritesmith-main-5.png);
background-position: -943px -1680px;
width: 40px;
height: 40px;
}
.headAccessory_special_bearEars {
background-image: url(spritesmith-main-5.png);
background-position: -728px -1303px;
width: 90px;
height: 90px;
}
.customize-option.headAccessory_special_bearEars {
background-image: url(spritesmith-main-5.png);
background-position: -753px -1318px;
width: 60px;
height: 60px;
}
.headAccessory_special_cactusEars {
background-image: url(spritesmith-main-5.png);
background-position: -819px -1303px;
width: 90px;
height: 90px;
}
.customize-option.headAccessory_special_cactusEars {
background-image: url(spritesmith-main-5.png);
background-position: -844px -1318px;
width: 60px;
height: 60px;
}
.headAccessory_special_foxEars {
background-image: url(spritesmith-main-5.png);
background-position: -910px -1303px;
width: 90px;
height: 90px;
}
.customize-option.headAccessory_special_foxEars {
background-image: url(spritesmith-main-5.png);
background-position: -935px -1318px;
width: 60px;
height: 60px;
}
.headAccessory_special_lionEars {
background-image: url(spritesmith-main-5.png);
background-position: -1001px -1303px;
width: 90px;
height: 90px;
}
.customize-option.headAccessory_special_lionEars {
background-image: url(spritesmith-main-5.png);
background-position: -1026px -1318px;
width: 60px;
height: 60px;
}
.headAccessory_special_pandaEars {
background-image: url(spritesmith-main-5.png);
background-position: -1092px -1303px;
width: 90px;
height: 90px;
}
.customize-option.headAccessory_special_pandaEars {
background-image: url(spritesmith-main-5.png);
background-position: -1117px -1318px;
width: 60px;
height: 60px;
}
.headAccessory_special_pigEars {
background-image: url(spritesmith-main-5.png);
background-position: -1183px -1303px;
width: 90px;
height: 90px;
}
.customize-option.headAccessory_special_pigEars {
background-image: url(spritesmith-main-5.png);
background-position: -1208px -1318px;
width: 60px;
height: 60px;
}
.headAccessory_special_tigerEars {
background-image: url(spritesmith-main-5.png);
background-position: -1274px -1303px;
width: 90px;
height: 90px;
}
.customize-option.headAccessory_special_tigerEars {
background-image: url(spritesmith-main-5.png);
background-position: -1299px -1318px;
width: 60px;
height: 60px;
}
.headAccessory_special_wolfEars {
background-image: url(spritesmith-main-5.png);
background-position: -1427px 0px;
width: 90px;
height: 90px;
}
.customize-option.headAccessory_special_wolfEars {
background-image: url(spritesmith-main-5.png);
background-position: -1452px -15px;
width: 60px;
height: 60px;
}
.shop_headAccessory_special_bearEars {
background-image: url(spritesmith-main-5.png);
background-position: -1700px -349px;
width: 40px;
height: 40px;
}
.shop_headAccessory_special_cactusEars {
background-image: url(spritesmith-main-5.png);
background-position: -1700px -308px;
width: 40px;
height: 40px;
}
.shop_headAccessory_special_foxEars {
background-image: url(spritesmith-main-5.png);
background-position: -1700px -267px;
width: 40px;
height: 40px;
}
.shop_headAccessory_special_lionEars {
background-image: url(spritesmith-main-5.png);
background-position: -1700px -226px;
width: 40px;
height: 40px;
}
.shop_headAccessory_special_pandaEars {
background-image: url(spritesmith-main-5.png);
background-position: -1107px -1680px;
width: 40px;
height: 40px;
}
.shop_headAccessory_special_pigEars {
background-image: url(spritesmith-main-5.png);
background-position: -656px -1680px;
width: 40px;
height: 40px;
}
.shop_headAccessory_special_tigerEars {
background-image: url(spritesmith-main-5.png);
background-position: -246px -1680px;
width: 40px;
height: 40px;
}
.shop_headAccessory_special_wolfEars {
background-image: url(spritesmith-main-5.png);
background-position: -1151px -1113px;
background-position: -984px -1680px;
width: 40px;
height: 40px;
}
@@ -438,145 +294,289 @@
}
.shop_head_healer_1 {
background-image: url(spritesmith-main-5.png);
background-position: -902px -1680px;
background-position: -943px -1680px;
width: 40px;
height: 40px;
}
.shop_head_healer_2 {
background-image: url(spritesmith-main-5.png);
background-position: -861px -1680px;
background-position: -902px -1680px;
width: 40px;
height: 40px;
}
.shop_head_healer_3 {
background-image: url(spritesmith-main-5.png);
background-position: -820px -1680px;
background-position: -861px -1680px;
width: 40px;
height: 40px;
}
.shop_head_healer_4 {
background-image: url(spritesmith-main-5.png);
background-position: -779px -1680px;
background-position: -820px -1680px;
width: 40px;
height: 40px;
}
.shop_head_healer_5 {
background-image: url(spritesmith-main-5.png);
background-position: -738px -1680px;
background-position: -779px -1680px;
width: 40px;
height: 40px;
}
.shop_head_rogue_1 {
background-image: url(spritesmith-main-5.png);
background-position: -697px -1680px;
background-position: -738px -1680px;
width: 40px;
height: 40px;
}
.shop_head_rogue_2 {
background-image: url(spritesmith-main-5.png);
background-position: -615px -1680px;
background-position: -656px -1680px;
width: 40px;
height: 40px;
}
.shop_head_rogue_3 {
background-image: url(spritesmith-main-5.png);
background-position: -574px -1680px;
background-position: -615px -1680px;
width: 40px;
height: 40px;
}
.shop_head_rogue_4 {
background-image: url(spritesmith-main-5.png);
background-position: -533px -1680px;
background-position: -574px -1680px;
width: 40px;
height: 40px;
}
.shop_head_rogue_5 {
background-image: url(spritesmith-main-5.png);
background-position: -492px -1680px;
background-position: -533px -1680px;
width: 40px;
height: 40px;
}
.shop_head_special_0 {
background-image: url(spritesmith-main-5.png);
background-position: -451px -1680px;
background-position: -492px -1680px;
width: 40px;
height: 40px;
}
.shop_head_special_1 {
background-image: url(spritesmith-main-5.png);
background-position: -369px -1680px;
background-position: -410px -1680px;
width: 40px;
height: 40px;
}
.shop_head_special_2 {
background-image: url(spritesmith-main-5.png);
background-position: -328px -1680px;
background-position: -369px -1680px;
width: 40px;
height: 40px;
}
.shop_head_special_fireCoralCirclet {
background-image: url(spritesmith-main-5.png);
background-position: -287px -1680px;
background-position: -328px -1680px;
width: 40px;
height: 40px;
}
.shop_head_warrior_1 {
background-image: url(spritesmith-main-5.png);
background-position: -164px -1680px;
background-position: -205px -1680px;
width: 40px;
height: 40px;
}
.shop_head_warrior_2 {
background-image: url(spritesmith-main-5.png);
background-position: -123px -1680px;
background-position: -164px -1680px;
width: 40px;
height: 40px;
}
.shop_head_warrior_3 {
background-image: url(spritesmith-main-5.png);
background-position: -82px -1680px;
background-position: -123px -1680px;
width: 40px;
height: 40px;
}
.shop_head_warrior_4 {
background-image: url(spritesmith-main-5.png);
background-position: -41px -1680px;
background-position: -82px -1680px;
width: 40px;
height: 40px;
}
.shop_head_warrior_5 {
background-image: url(spritesmith-main-5.png);
background-position: 0px -1680px;
background-position: -41px -1680px;
width: 40px;
height: 40px;
}
.shop_head_wizard_1 {
background-image: url(spritesmith-main-5.png);
background-position: -1380px -1253px;
background-position: 0px -1680px;
width: 40px;
height: 40px;
}
.shop_head_wizard_2 {
background-image: url(spritesmith-main-5.png);
background-position: -1380px -1212px;
background-position: -1380px -1253px;
width: 40px;
height: 40px;
}
.shop_head_wizard_3 {
background-image: url(spritesmith-main-5.png);
background-position: -1233px -1113px;
background-position: -1380px -1212px;
width: 40px;
height: 40px;
}
.shop_head_wizard_4 {
background-image: url(spritesmith-main-5.png);
background-position: -1700px -431px;
background-position: -1700px -442px;
width: 40px;
height: 40px;
}
.shop_head_wizard_5 {
background-image: url(spritesmith-main-5.png);
background-position: -1700px -390px;
background-position: -1700px -401px;
width: 40px;
height: 40px;
}
.headAccessory_special_bearEars {
background-image: url(spritesmith-main-5.png);
background-position: -728px -1303px;
width: 90px;
height: 90px;
}
.customize-option.headAccessory_special_bearEars {
background-image: url(spritesmith-main-5.png);
background-position: -753px -1318px;
width: 60px;
height: 60px;
}
.headAccessory_special_cactusEars {
background-image: url(spritesmith-main-5.png);
background-position: -819px -1303px;
width: 90px;
height: 90px;
}
.customize-option.headAccessory_special_cactusEars {
background-image: url(spritesmith-main-5.png);
background-position: -844px -1318px;
width: 60px;
height: 60px;
}
.headAccessory_special_foxEars {
background-image: url(spritesmith-main-5.png);
background-position: -910px -1303px;
width: 90px;
height: 90px;
}
.customize-option.headAccessory_special_foxEars {
background-image: url(spritesmith-main-5.png);
background-position: -935px -1318px;
width: 60px;
height: 60px;
}
.headAccessory_special_lionEars {
background-image: url(spritesmith-main-5.png);
background-position: -1001px -1303px;
width: 90px;
height: 90px;
}
.customize-option.headAccessory_special_lionEars {
background-image: url(spritesmith-main-5.png);
background-position: -1026px -1318px;
width: 60px;
height: 60px;
}
.headAccessory_special_pandaEars {
background-image: url(spritesmith-main-5.png);
background-position: -1092px -1303px;
width: 90px;
height: 90px;
}
.customize-option.headAccessory_special_pandaEars {
background-image: url(spritesmith-main-5.png);
background-position: -1117px -1318px;
width: 60px;
height: 60px;
}
.headAccessory_special_pigEars {
background-image: url(spritesmith-main-5.png);
background-position: -1183px -1303px;
width: 90px;
height: 90px;
}
.customize-option.headAccessory_special_pigEars {
background-image: url(spritesmith-main-5.png);
background-position: -1208px -1318px;
width: 60px;
height: 60px;
}
.headAccessory_special_tigerEars {
background-image: url(spritesmith-main-5.png);
background-position: -1274px -1303px;
width: 90px;
height: 90px;
}
.customize-option.headAccessory_special_tigerEars {
background-image: url(spritesmith-main-5.png);
background-position: -1299px -1318px;
width: 60px;
height: 60px;
}
.headAccessory_special_wolfEars {
background-image: url(spritesmith-main-5.png);
background-position: -1427px 0px;
width: 90px;
height: 90px;
}
.customize-option.headAccessory_special_wolfEars {
background-image: url(spritesmith-main-5.png);
background-position: -1452px -15px;
width: 60px;
height: 60px;
}
.shop_headAccessory_special_bearEars {
background-image: url(spritesmith-main-5.png);
background-position: -1700px -360px;
width: 40px;
height: 40px;
}
.shop_headAccessory_special_cactusEars {
background-image: url(spritesmith-main-5.png);
background-position: -1700px -319px;
width: 40px;
height: 40px;
}
.shop_headAccessory_special_foxEars {
background-image: url(spritesmith-main-5.png);
background-position: -1700px -278px;
width: 40px;
height: 40px;
}
.shop_headAccessory_special_lionEars {
background-image: url(spritesmith-main-5.png);
background-position: -1700px -237px;
width: 40px;
height: 40px;
}
.shop_headAccessory_special_pandaEars {
background-image: url(spritesmith-main-5.png);
background-position: -1148px -1680px;
width: 40px;
height: 40px;
}
.shop_headAccessory_special_pigEars {
background-image: url(spritesmith-main-5.png);
background-position: -451px -1680px;
width: 40px;
height: 40px;
}
.shop_headAccessory_special_tigerEars {
background-image: url(spritesmith-main-5.png);
background-position: -246px -1680px;
width: 40px;
height: 40px;
}
.shop_headAccessory_special_wolfEars {
background-image: url(spritesmith-main-5.png);
background-position: -1151px -1113px;
width: 40px;
height: 40px;
}
@@ -714,103 +714,103 @@
}
.shop_shield_healer_3 {
background-image: url(spritesmith-main-5.png);
background-position: -1700px -1087px;
background-position: -1700px -1098px;
width: 40px;
height: 40px;
}
.shop_shield_healer_4 {
background-image: url(spritesmith-main-5.png);
background-position: -1700px -1046px;
background-position: -1700px -1057px;
width: 40px;
height: 40px;
}
.shop_shield_healer_5 {
background-image: url(spritesmith-main-5.png);
background-position: -1700px -1005px;
background-position: -1700px -1016px;
width: 40px;
height: 40px;
}
.shop_shield_rogue_0 {
background-image: url(spritesmith-main-5.png);
background-position: -1700px -964px;
background-position: -1700px -975px;
width: 40px;
height: 40px;
}
.shop_shield_rogue_1 {
background-image: url(spritesmith-main-5.png);
background-position: -1700px -923px;
background-position: -1700px -934px;
width: 40px;
height: 40px;
}
.shop_shield_rogue_2 {
background-image: url(spritesmith-main-5.png);
background-position: -1700px -882px;
background-position: -1700px -893px;
width: 40px;
height: 40px;
}
.shop_shield_rogue_3 {
background-image: url(spritesmith-main-5.png);
background-position: -1700px -841px;
background-position: -1700px -852px;
width: 40px;
height: 40px;
}
.shop_shield_rogue_4 {
background-image: url(spritesmith-main-5.png);
background-position: -1700px -800px;
background-position: -1700px -811px;
width: 40px;
height: 40px;
}
.shop_shield_rogue_5 {
background-image: url(spritesmith-main-5.png);
background-position: -1700px -759px;
background-position: -1700px -770px;
width: 40px;
height: 40px;
}
.shop_shield_rogue_6 {
background-image: url(spritesmith-main-5.png);
background-position: -1700px -718px;
background-position: -1700px -729px;
width: 40px;
height: 40px;
}
.shop_shield_special_0 {
background-image: url(spritesmith-main-5.png);
background-position: -1700px -677px;
background-position: -1700px -688px;
width: 40px;
height: 40px;
}
.shop_shield_special_1 {
background-image: url(spritesmith-main-5.png);
background-position: -1700px -636px;
background-position: -1700px -647px;
width: 40px;
height: 40px;
}
.shop_shield_special_goldenknight {
background-image: url(spritesmith-main-5.png);
background-position: -1700px -595px;
background-position: -1700px -606px;
width: 40px;
height: 40px;
}
.shop_shield_special_moonpearlShield {
background-image: url(spritesmith-main-5.png);
background-position: -1700px -554px;
background-position: -1700px -565px;
width: 40px;
height: 40px;
}
.shop_shield_warrior_1 {
background-image: url(spritesmith-main-5.png);
background-position: -1700px -513px;
background-position: -1700px -524px;
width: 40px;
height: 40px;
}
.shop_shield_warrior_2 {
background-image: url(spritesmith-main-5.png);
background-position: -1700px -472px;
background-position: -1700px -483px;
width: 40px;
height: 40px;
}
.shop_shield_warrior_3 {
background-image: url(spritesmith-main-5.png);
background-position: -410px -1680px;
background-position: -287px -1680px;
width: 40px;
height: 40px;
}
@@ -930,85 +930,85 @@
}
.shop_weapon_special_3 {
background-image: url(spritesmith-main-5.png);
background-position: -1700px -1128px;
background-position: -1700px -1139px;
width: 40px;
height: 40px;
}
.shop_weapon_special_critical {
background-image: url(spritesmith-main-5.png);
background-position: -1700px -185px;
background-position: -1700px -196px;
width: 40px;
height: 40px;
}
.shop_weapon_special_tridentOfCrashingTides {
background-image: url(spritesmith-main-5.png);
background-position: -1700px -1169px;
background-position: -1700px -1180px;
width: 40px;
height: 40px;
}
.shop_weapon_warrior_0 {
background-image: url(spritesmith-main-5.png);
background-position: -1700px -1210px;
background-position: -1700px -1221px;
width: 40px;
height: 40px;
}
.shop_weapon_warrior_1 {
background-image: url(spritesmith-main-5.png);
background-position: -1700px -1251px;
background-position: -1700px -1262px;
width: 40px;
height: 40px;
}
.shop_weapon_warrior_2 {
background-image: url(spritesmith-main-5.png);
background-position: -1700px -1292px;
background-position: -1700px -1303px;
width: 40px;
height: 40px;
}
.shop_weapon_warrior_3 {
background-image: url(spritesmith-main-5.png);
background-position: -1700px -1333px;
background-position: -1700px -1344px;
width: 40px;
height: 40px;
}
.shop_weapon_warrior_4 {
background-image: url(spritesmith-main-5.png);
background-position: -1700px -1374px;
background-position: -1700px -1385px;
width: 40px;
height: 40px;
}
.shop_weapon_warrior_5 {
background-image: url(spritesmith-main-5.png);
background-position: -1700px -1415px;
background-position: -1700px -1426px;
width: 40px;
height: 40px;
}
.shop_weapon_warrior_6 {
background-image: url(spritesmith-main-5.png);
background-position: -1700px -1456px;
background-position: -1700px -1467px;
width: 40px;
height: 40px;
}
.shop_weapon_wizard_0 {
background-image: url(spritesmith-main-5.png);
background-position: -1700px -1497px;
background-position: -1700px -1508px;
width: 40px;
height: 40px;
}
.shop_weapon_wizard_1 {
background-image: url(spritesmith-main-5.png);
background-position: -1700px -1538px;
background-position: -1700px -1549px;
width: 40px;
height: 40px;
}
.shop_weapon_wizard_2 {
background-image: url(spritesmith-main-5.png);
background-position: -1700px -1579px;
background-position: -1700px -1590px;
width: 40px;
height: 40px;
}
.shop_weapon_wizard_3 {
background-image: url(spritesmith-main-5.png);
background-position: -1700px -1620px;
background-position: -1700px -1631px;
width: 40px;
height: 40px;
}
@@ -1230,13 +1230,13 @@
}
.Pet_Currency_Gem {
background-image: url(spritesmith-main-5.png);
background-position: -1700px -104px;
background-position: -1700px -156px;
width: 45px;
height: 39px;
}
.Pet_Currency_Gem1x {
background-image: url(spritesmith-main-5.png);
background-position: -1700px -1661px;
background-position: -1670px -364px;
width: 15px;
height: 13px;
}
@@ -1500,7 +1500,7 @@
}
.zzz {
background-image: url(spritesmith-main-5.png);
background-position: -205px -1680px;
background-position: -1233px -1113px;
width: 40px;
height: 40px;
}
@@ -1656,7 +1656,7 @@
}
.inventory_quest_scroll_dilatoryDistress3_locked {
background-image: url(spritesmith-main-5.png);
background-position: -1700px -52px;
background-position: -1700px -104px;
width: 48px;
height: 51px;
}
@@ -1858,78 +1858,84 @@
width: 48px;
height: 51px;
}
.inventory_quest_scroll_snake {
.inventory_quest_scroll_snail {
background-image: url(spritesmith-main-5.png);
background-position: -1078px -1628px;
width: 48px;
height: 51px;
}
.inventory_quest_scroll_spider {
.inventory_quest_scroll_snake {
background-image: url(spritesmith-main-5.png);
background-position: -1127px -1628px;
width: 48px;
height: 51px;
}
.inventory_quest_scroll_trex {
background-image: url(spritesmith-main-5.png);
background-position: -1225px -1628px;
width: 48px;
height: 51px;
}
.inventory_quest_scroll_trex_undead {
.inventory_quest_scroll_spider {
background-image: url(spritesmith-main-5.png);
background-position: -1176px -1628px;
width: 48px;
height: 51px;
}
.inventory_quest_scroll_unicorn {
.inventory_quest_scroll_trex {
background-image: url(spritesmith-main-5.png);
background-position: -1274px -1628px;
width: 48px;
height: 51px;
}
.inventory_quest_scroll_vice1 {
.inventory_quest_scroll_trex_undead {
background-image: url(spritesmith-main-5.png);
background-position: -1372px -1628px;
background-position: -1225px -1628px;
width: 48px;
height: 51px;
}
.inventory_quest_scroll_vice1_locked {
.inventory_quest_scroll_unicorn {
background-image: url(spritesmith-main-5.png);
background-position: -1323px -1628px;
width: 48px;
height: 51px;
}
.inventory_quest_scroll_vice2 {
background-image: url(spritesmith-main-5.png);
background-position: -1470px -1628px;
width: 48px;
height: 51px;
}
.inventory_quest_scroll_vice2_locked {
.inventory_quest_scroll_vice1 {
background-image: url(spritesmith-main-5.png);
background-position: -1421px -1628px;
width: 48px;
height: 51px;
}
.inventory_quest_scroll_vice3 {
.inventory_quest_scroll_vice1_locked {
background-image: url(spritesmith-main-5.png);
background-position: -1568px -1628px;
background-position: -1372px -1628px;
width: 48px;
height: 51px;
}
.inventory_quest_scroll_vice3_locked {
.inventory_quest_scroll_vice2 {
background-image: url(spritesmith-main-5.png);
background-position: -1519px -1628px;
width: 48px;
height: 51px;
}
.inventory_quest_scroll_whale {
.inventory_quest_scroll_vice2_locked {
background-image: url(spritesmith-main-5.png);
background-position: -1470px -1628px;
width: 48px;
height: 51px;
}
.inventory_quest_scroll_vice3 {
background-image: url(spritesmith-main-5.png);
background-position: -1617px -1628px;
width: 48px;
height: 51px;
}
.inventory_quest_scroll_vice3_locked {
background-image: url(spritesmith-main-5.png);
background-position: -1568px -1628px;
width: 48px;
height: 51px;
}
.inventory_quest_scroll_whale {
background-image: url(spritesmith-main-5.png);
background-position: -1700px 0px;
width: 48px;
height: 51px;
}
.quest_atom1 {
background-image: url(spritesmith-main-5.png);
background-position: -679px -886px;
@@ -1986,7 +1992,7 @@
}
.quest_dilatoryDistress1_fireCoral {
background-image: url(spritesmith-main-5.png);
background-position: -1700px 0px;
background-position: -1700px -52px;
width: 48px;
height: 51px;
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 318 KiB

After

Width:  |  Height:  |  Size: 319 KiB

File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 216 KiB

After

Width:  |  Height:  |  Size: 225 KiB

+1365 -1347
View File
File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 136 KiB

After

Width:  |  Height:  |  Size: 140 KiB

File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 151 KiB

After

Width:  |  Height:  |  Size: 153 KiB

File diff suppressed because it is too large Load Diff
Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 KiB

After

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

+6 -2
View File
@@ -49,7 +49,7 @@
"dropEggBearCubText": "Bear Cub",
"dropEggBearCubMountText": "Bear",
"dropEggBearCubAdjective": "a cuddly",
"dropEggBearCubAdjective": "a brave",
"questEggGryphonText": "Gryphon",
"questEggGryphonMountText": "Gryphon",
@@ -69,7 +69,7 @@
"questEggRatText": "Rat",
"questEggRatMountText": "Rat",
"questEggRatAdjective": "a dirty",
"questEggRatAdjective": "a sociable",
"questEggOctopusText": "Octopus",
"questEggOctopusMountText": "Octopus",
@@ -155,6 +155,10 @@
"questEggMonkeyMountText": "Monkey",
"questEggMonkeyAdjective": "a mischievous",
"questEggSnailText": "Snail",
"questEggSnailMountText": "Snail",
"questEggSnailAdjective": "a slow but steady",
"eggNotes": "Find a hatching potion to pour on this egg, and it will hatch into <%= eggAdjective(locale) %> <%= eggText(locale) %>.",
"hatchingPotionBase": "Base",
+8 -1
View File
@@ -339,5 +339,12 @@
"questMonkeyCompletion": "You did it! No bananas for those fiends today. Overwhelmed by your diligence, the monkeys flee in panic. \"Look,\" says @Misceo. \"They left a few eggs behind.\"<br><br>@Leephon grins. \"Maybe a well-trained pet monkey can help you as much as the wild ones hinder you!\"",
"questMonkeyBoss": "Monstrous Mandrill",
"questMonkeyDropMonkeyEgg": "Monkey (Egg)",
"questMonkeyUnlockText": "Unlocks purchasable Monkey eggs in the Market"
"questMonkeyUnlockText": "Unlocks purchasable Monkey eggs in the Market",
"questSnailText": "The Snail of Drudgery Sludge",
"questSnailNotes": "You're excited to begin questing in the abandoned Dungeons of Drudgery, but as soon as you enter, you feel the ground under your feet start to suck at your boots. You look up to the path ahead and see Habiticans mired in slime. @Overomega yells, \"They have too many unimportant tasks and dailies, and they're getting stuck on things that don't matter! Pull them out!\"<br><br>\"You need to find the source of the ooze,\" @Pfeffernusse agrees, \"or the tasks that they cannot accomplish will drag them down forever!\"<br><br>Pulling out your weapon, you wade through the gooey mud.... and encounter the fearsome Snail of Drudgery Sludge.",
"questSnailCompletion": "You bring your weapon down on the great Snail's shell, cracking it in two, releasing a flood of water. The slime is washed away, and the Habiticans around you rejoice. \"Look!\" says @Misceo. \"There's a small group of snail eggs in the remnants of the muck.\"",
"questSnailBoss": "Snail of Drudgery Sludge",
"questSnailDropSnailEgg": "Snail (Egg)",
"questSnailUnlockText": "Unlocks purchasable Snail eggs in the Market"
}
+9 -6
View File
@@ -2,7 +2,13 @@ import t from './translation';
const NUMBER_OF_QUESTIONS = 12;
export const questions = [];
let faq = {
questions: [],
stillNeedHelp: {
ios: t('iosFaqStillNeedHelp'),
web: t('webFaqStillNeedHelp'),
},
};
for (let i = 0; i <= NUMBER_OF_QUESTIONS; i++) {
let question = {
@@ -11,10 +17,7 @@ for (let i = 0; i <= NUMBER_OF_QUESTIONS; i++) {
web: t(`webFaqAnswer${i}`),
};
questions.push(question);
faq.questions.push(question);
}
export const stillNeedHelp = {
ios: t('iosFaqStillNeedHelp'),
web: t('webFaqStillNeedHelp'),
};
module.exports = faq;
+39
View File
@@ -373,6 +373,13 @@ api.questEggs = {
return u.achievements.quests && (u.achievements.quests.monkey != null) > 0;
})
},
Snail: {
text: t('questEggSnailText'),
adjective: t('questEggSnailAdjective'),
canBuy: (function(u) {
return u.achievements.quests && (u.achievements.quests.snail != null) > 0;
})
},
};
_.each(api.questEggs, function(egg, key) {
@@ -2488,6 +2495,38 @@ api.quests = {
unlock: t('questMonkeyUnlockText')
}
},
snail: {
text: t('questSnailText'),
notes: t('questSnailNotes'),
completion: t('questSnailCompletion'),
value: 4,
category: 'pet',
boss: {
name: t('questSnailBoss'),
hp: 500,
str: 1.5
},
drop: {
items: [
{
type: 'eggs',
key: 'Snail',
text: t('questSnailDropSnailEgg')
}, {
type: 'eggs',
key: 'Snail',
text: t('questSnailDropSnailEgg')
}, {
type: 'eggs',
key: 'Snail',
text: t('questSnailDropSnailEgg')
}
],
gp: 37,
exp: 275,
unlock: t('questSnailUnlockText')
}
},
};
_.each(api.quests, function(v, key) {
+56
View File
@@ -0,0 +1,56 @@
import _ from 'lodash';
import splitWhitespace from '../libs/splitWhitespace';
/*
Updates user stats with new stats. Handles death, leveling up, etc
{stats} new stats
{update} if aggregated changes, pass in userObj as update. otherwise commits will be made immediately
*/
module.exports = function(user) {
return user.stats[(function() {
var diff, ideal, lvlDiv7, preference, stats, suggested;
switch (user.preferences.allocationMode) {
case "flat":
stats = _.pick(user.stats, splitWhitespace('con str per int'));
return _.invert(stats)[_.min(stats)];
case "classbased":
lvlDiv7 = user.stats.lvl / 7;
ideal = [lvlDiv7 * 3, lvlDiv7 * 2, lvlDiv7, lvlDiv7];
preference = (function() {
switch (user.stats["class"]) {
case "wizard":
return ["int", "per", "con", "str"];
case "rogue":
return ["per", "str", "int", "con"];
case "healer":
return ["con", "int", "str", "per"];
default:
return ["str", "con", "per", "int"];
}
})();
diff = [user.stats[preference[0]] - ideal[0], user.stats[preference[1]] - ideal[1], user.stats[preference[2]] - ideal[2], user.stats[preference[3]] - ideal[3]];
suggested = _.findIndex(diff, (function(val) {
if (val === _.min(diff)) {
return true;
}
}));
if (~suggested) {
return preference[suggested];
} else {
return "str";
}
case "taskbased":
suggested = _.invert(user.stats.training)[_.max(user.stats.training)];
_.merge(user.stats.training, {
str: 0,
int: 0,
con: 0,
per: 0
});
return suggested || "str";
default:
return "str";
}
})()]++;
};
+15
View File
@@ -0,0 +1,15 @@
module.exports = function(user, stat, chance) {
var s;
if (stat == null) {
stat = 'str';
}
if (chance == null) {
chance = .03;
}
s = user._statsComputed[stat];
if (user.fns.predictableRandom() <= chance * (1 + s / 100)) {
return 1.5 + 4 * s / (s + 200);
} else {
return 1;
}
};
+279
View File
@@ -0,0 +1,279 @@
import moment from 'moment';
import _ from 'lodash';
import {
daysSince,
shouldDo,
} from '../cron';
import {
capByLevel,
toNextLevel,
} from '../statHelpers';
/*
------------------------------------------------------
Cron
------------------------------------------------------
*/
/*
At end of day, add value to all incomplete Daily & Todo tasks (further incentive)
For incomplete Dailys, deduct experience
Make sure to run this function once in a while as server will not take care of overnight calculations.
And you have to run it every time client connects.
{user}
*/
module.exports = function(user, options) {
var _progress, analyticsData, base, base1, base2, base3, base4, clearBuffs, dailyChecked, dailyDueUnchecked, daysMissed, expTally, lvl, lvlDiv2, multiDaysCountAsOneDay, now, perfect, plan, progress, ref, ref1, ref2, ref3, todoTally;
if (options == null) {
options = {};
}
now = +options.now || +(new Date);
daysMissed = daysSince(user.lastCron, _.defaults({
now: now
}, user.preferences));
if (!(daysMissed > 0)) {
return;
}
user.auth.timestamps.loggedin = new Date();
user.lastCron = now;
if (user.items.lastDrop.count > 0) {
user.items.lastDrop.count = 0;
}
perfect = true;
clearBuffs = {
str: 0,
int: 0,
per: 0,
con: 0,
stealth: 0,
streaks: false
};
plan = (ref = user.purchased) != null ? ref.plan : void 0;
if (plan != null ? plan.customerId : void 0) {
if (typeof plan.dateUpdated === "undefined") {
// partial compensation for bug in subscription creation - https://github.com/HabitRPG/habitrpg/issues/6682
plan.dateUpdated = new Date();
}
if (moment(plan.dateUpdated).format('MMYYYY') !== moment().format('MMYYYY')) {
plan.gemsBought = 0;
plan.dateUpdated = new Date();
_.defaults(plan.consecutive, {
count: 0,
offset: 0,
trinkets: 0,
gemCapExtra: 0
});
plan.consecutive.count++;
if (plan.consecutive.offset > 0) {
plan.consecutive.offset--;
} else if (plan.consecutive.count % 3 === 0) {
plan.consecutive.trinkets++;
plan.consecutive.gemCapExtra += 5;
if (plan.consecutive.gemCapExtra > 25) {
plan.consecutive.gemCapExtra = 25;
}
}
}
if (plan.dateTerminated && moment(plan.dateTerminated).isBefore(+(new Date))) {
_.merge(plan, {
planId: null,
customerId: null,
paymentMethod: null
});
_.merge(plan.consecutive, {
count: 0,
offset: 0,
gemCapExtra: 0
});
if (typeof user.markModified === "function") {
user.markModified('purchased.plan');
}
}
}
if (user.preferences.sleep === true) {
user.stats.buffs = clearBuffs;
user.dailys.forEach(function(daily) {
var completed, repeat, thatDay;
completed = daily.completed, repeat = daily.repeat;
thatDay = moment(now).subtract({
days: 1
});
if (shouldDo(thatDay.toDate(), daily, user.preferences) || completed) {
_.each(daily.checklist, (function(box) {
box.completed = false;
return true;
}));
}
return daily.completed = false;
});
return;
}
multiDaysCountAsOneDay = true;
todoTally = 0;
user.todos.forEach(function(task) {
var absVal, completed, delta, id;
if (!task) {
return;
}
id = task.id, completed = task.completed;
delta = user.ops.score({
params: {
id: task.id,
direction: 'down'
},
query: {
times: multiDaysCountAsOneDay != null ? multiDaysCountAsOneDay : {
1: daysMissed
},
cron: true
}
});
absVal = completed ? Math.abs(task.value) : task.value;
return todoTally += absVal;
});
dailyChecked = 0;
dailyDueUnchecked = 0;
if ((base = user.party.quest.progress).down == null) {
base.down = 0;
}
user.dailys.forEach(function(task) {
var EvadeTask, completed, delta, fractionChecked, id, j, n, ref1, ref2, scheduleMisses, thatDay;
if (!task) {
return;
}
id = task.id, completed = task.completed;
EvadeTask = 0;
scheduleMisses = daysMissed;
if (completed) {
dailyChecked += 1;
} else {
scheduleMisses = 0;
for (n = j = 0, ref1 = daysMissed; 0 <= ref1 ? j < ref1 : j > ref1; n = 0 <= ref1 ? ++j : --j) {
thatDay = moment(now).subtract({
days: n + 1
});
if (shouldDo(thatDay.toDate(), task, user.preferences)) {
scheduleMisses++;
if (user.stats.buffs.stealth) {
user.stats.buffs.stealth--;
EvadeTask++;
}
if (multiDaysCountAsOneDay) {
break;
}
}
}
if (scheduleMisses > EvadeTask) {
perfect = false;
if (((ref2 = task.checklist) != null ? ref2.length : void 0) > 0) {
fractionChecked = _.reduce(task.checklist, (function(m, i) {
return m + (i.completed ? 1 : 0);
}), 0) / task.checklist.length;
dailyDueUnchecked += 1 - fractionChecked;
dailyChecked += fractionChecked;
} else {
dailyDueUnchecked += 1;
}
delta = user.ops.score({
params: {
id: task.id,
direction: 'down'
},
query: {
times: multiDaysCountAsOneDay != null ? multiDaysCountAsOneDay : {
1: scheduleMisses - EvadeTask
},
cron: true
}
});
user.party.quest.progress.down += delta * (task.priority < 1 ? task.priority : 1);
}
}
(task.history != null ? task.history : task.history = []).push({
date: +(new Date),
value: task.value
});
task.completed = false;
if (completed || (scheduleMisses > 0)) {
return _.each(task.checklist, (function(i) {
i.completed = false;
return true;
}));
}
});
user.habits.forEach(function(task) {
if (task.up === false || task.down === false) {
if (Math.abs(task.value) < 0.1) {
return task.value = 0;
} else {
return task.value = task.value / 2;
}
}
});
((base1 = (user.history != null ? user.history : user.history = {})).todos != null ? base1.todos : base1.todos = []).push({
date: now,
value: todoTally
});
expTally = user.stats.exp;
lvl = 0;
while (lvl < (user.stats.lvl - 1)) {
lvl++;
expTally += toNextLevel(lvl);
}
((base2 = user.history).exp != null ? base2.exp : base2.exp = []).push({
date: now,
value: expTally
});
if (!((ref1 = user.purchased) != null ? (ref2 = ref1.plan) != null ? ref2.customerId : void 0 : void 0)) {
user.fns.preenUserHistory();
if (typeof user.markModified === "function") {
user.markModified('history');
}
if (typeof user.markModified === "function") {
user.markModified('dailys');
}
}
user.stats.buffs = perfect ? ((base3 = user.achievements).perfect != null ? base3.perfect : base3.perfect = 0, user.achievements.perfect++, lvlDiv2 = Math.ceil(capByLevel(user.stats.lvl) / 2), {
str: lvlDiv2,
int: lvlDiv2,
per: lvlDiv2,
con: lvlDiv2,
stealth: 0,
streaks: false
}) : clearBuffs;
if (dailyDueUnchecked === 0 && dailyChecked === 0) {
dailyChecked = 1;
}
user.stats.mp += _.max([10, .1 * user._statsComputed.maxMP]) * dailyChecked / (dailyDueUnchecked + dailyChecked);
if (user.stats.mp > user._statsComputed.maxMP) {
user.stats.mp = user._statsComputed.maxMP;
}
progress = user.party.quest.progress;
_progress = _.cloneDeep(progress);
_.merge(progress, {
down: 0,
up: 0
});
progress.collect = _.transform(progress.collect, (function(m, v, k) {
return m[k] = 0;
}));
if ((base4 = user.flags).cronCount == null) {
base4.cronCount = 0;
}
user.flags.cronCount++;
analyticsData = {
category: 'behavior',
gaLabel: 'Cron Count',
gaValue: user.flags.cronCount,
uuid: user._id,
user: user,
resting: user.preferences.sleep,
cronCount: user.flags.cronCount,
progressUp: _.min([_progress.up, 900]),
progressDown: _progress.down
};
if ((ref3 = options.analytics) != null) {
ref3.track('Cron', analyticsData);
}
return _progress;
};
+5
View File
@@ -0,0 +1,5 @@
import dotGet from '../libs/dotGet';
module.exports = function(user, path) {
return dotGet(user, path);
};
+12
View File
@@ -0,0 +1,12 @@
import dotSet from '../libs/dotSet';
/*
This allows you to set object properties by dot-path. Eg, you can run pathSet('stats.hp',50,user) which is the same as
user.stats.hp = 50. This is useful because in our habitrpg-shared functions we're returning changesets as {path:value},
so that different consumers can implement setters their own way. Derby needs model.set(path, value) for example, where
Angular sets object properties directly - in which case, this function will be used.
*/
module.exports = function(user, path, val) {
return dotSet(user, path, val);
};
+11
View File
@@ -0,0 +1,11 @@
import content from '../content/index';
import i18n from '../i18n';
module.exports = function(user, type) {
var item;
item = content.gear.flat[user.items.gear.equipped[type]];
if (!item) {
return content.gear.flat[type + "_base_0"];
}
return item;
};
+24
View File
@@ -0,0 +1,24 @@
import content from '../content/index';
import i18n from '../i18n';
module.exports = function(user, item, type, req) {
var message, currentWeapon, currentShield;
if (type == null) {
type = 'equipped';
}
currentShield = content.gear.flat[user.items.gear[type].shield];
currentWeapon = content.gear.flat[user.items.gear[type].weapon];
if (item.type === "shield" && (currentWeapon ? currentWeapon.twoHanded : false)) {
user.items.gear[type].weapon = 'weapon_base_0';
message = i18n.t('messageTwoHandedUnequip', {
twoHandedText: currentWeapon.text(req.language), offHandedText: item.text(req.language),
}, req.language);
} else if (item.twoHanded && (currentShield && user.items.gear[type].shield != "shield_base_0")) {
user.items.gear[type].shield = "shield_base_0";
message = i18n.t('messageTwoHandedEquip', {
twoHandedText: item.text(req.language), offHandedText: currentShield.text(req.language),
}, req.language);
}
return message;
};
+31
View File
@@ -0,0 +1,31 @@
import getItem from './getItem';
import handleTwoHanded from './handleTwoHanded';
import predictableRandom from './predictableRandom';
import crit from './crit';
import randomVal from './randomVal';
import dotSet from './dotSet';
import dotGet from './dotGet';
import randomDrop from './randomDrop';
import autoAllocate from './autoAllocate';
import updateStats from './updateStats';
import cron from './cron';
import preenUserHistory from './preenUserHistory';
import ultimateGear from './ultimateGear';
import nullify from './nullify';
module.exports = {
getItem,
handleTwoHanded,
predictableRandom,
crit,
randomVal,
dotSet,
dotGet,
randomDrop,
autoAllocate,
updateStats,
cron,
preenUserHistory,
ultimateGear,
nullify,
};
+5
View File
@@ -0,0 +1,5 @@
module.exports = function(user) {
user.ops = null;
user.fns = null;
return user = null;
};
+20
View File
@@ -0,0 +1,20 @@
import _ from 'lodash';
/*
Because the same op needs to be performed on the client and the server (critical hits, item drops, etc),
we need things to be "random", but technically predictable so that they don't go out-of-sync
*/
module.exports = function(user, seed) {
var x;
if (!seed || seed === Math.PI) {
seed = _.reduce(user.stats, (function(m, v) {
if (_.isNumber(v)) {
return m + v;
} else {
return m;
}
}), 0);
}
x = Math.sin(seed++) * 10000;
return x - Math.floor(x);
};
+25
View File
@@ -0,0 +1,25 @@
import _ from 'lodash';
import preenHistory from '../libs/preenHistory';
module.exports = function(user, minHistLen) {
if (minHistLen == null) {
minHistLen = 7;
}
_.each(user.habits.concat(user.dailys), function(task) {
var ref;
if (((ref = task.history) != null ? ref.length : void 0) > minHistLen) {
task.history = preenHistory(task.history);
}
return true;
});
_.defaults(user.history, {
todos: [],
exp: []
});
if (user.history.exp.length > minHistLen) {
user.history.exp = preenHistory(user.history.exp);
}
if (user.history.todos.length > minHistLen) {
return user.history.todos = preenHistory(user.history.todos);
}
};
+82
View File
@@ -0,0 +1,82 @@
import _ from 'lodash';
import content from '../content/index';
import i18n from '../i18n';
import { daysSince } from '../cron';
import { diminishingReturns } from '../statHelpers';
// Clone a drop object maintaining its functions so that we can change it without affecting the original item
function cloneDropItem (drop) {
return _.cloneDeep(drop, function (val) {
return _.isFunction(val) ? val : undefined; // undefined will be handled by lodash
});
}
module.exports = function(user, modifiers, req) {
var acceptableDrops, base, base1, base2, chance, drop, dropK, dropMultiplier, name, name1, name2, quest, rarity, ref, ref1, ref2, ref3, task;
task = modifiers.task;
chance = _.min([Math.abs(task.value - 21.27), 37.5]) / 150 + .02;
chance *= task.priority * (1 + (task.streak / 100 || 0)) * (1 + (user._statsComputed.per / 100)) * (1 + (user.contributor.level / 40 || 0)) * (1 + (user.achievements.rebirths / 20 || 0)) * (1 + (user.achievements.streak / 200 || 0)) * (user._tmp.crit || 1) * (1 + .5 * (_.reduce(task.checklist, (function(m, i) {
return m + (i.completed ? 1 : 0);
}), 0) || 0));
chance = diminishingReturns(chance, 0.75);
quest = content.quests[(ref = user.party.quest) != null ? ref.key : void 0];
if ((quest != null ? quest.collect : void 0) && user.fns.predictableRandom(user.stats.gp) < chance) {
dropK = user.fns.randomVal(quest.collect, {
key: true
});
user.party.quest.progress.collect[dropK]++;
if (typeof user.markModified === "function") {
user.markModified('party.quest.progress');
}
}
dropMultiplier = ((ref1 = user.purchased) != null ? (ref2 = ref1.plan) != null ? ref2.customerId : void 0 : void 0) ? 2 : 1;
if ((daysSince(user.items.lastDrop.date, user.preferences) === 0) && (user.items.lastDrop.count >= dropMultiplier * (5 + Math.floor(user._statsComputed.per / 25) + (user.contributor.level || 0)))) {
return;
}
if (((ref3 = user.flags) != null ? ref3.dropsEnabled : void 0) && user.fns.predictableRandom(user.stats.exp) < chance) {
rarity = user.fns.predictableRandom(user.stats.gp);
if (rarity > .6) {
drop = cloneDropItem(user.fns.randomVal(_.where(content.food, {
canDrop: true
})));
if ((base = user.items.food)[name = drop.key] == null) {
base[name] = 0;
}
user.items.food[drop.key] += 1;
drop.type = 'Food';
drop.dialog = i18n.t('messageDropFood', {
dropArticle: drop.article,
dropText: drop.text(req.language),
dropNotes: drop.notes(req.language)
}, req.language);
} else if (rarity > .3) {
drop = cloneDropItem(user.fns.randomVal(content.dropEggs));
if ((base1 = user.items.eggs)[name1 = drop.key] == null) {
base1[name1] = 0;
}
user.items.eggs[drop.key]++;
drop.type = 'Egg';
drop.dialog = i18n.t('messageDropEgg', {
dropText: drop.text(req.language),
dropNotes: drop.notes(req.language)
}, req.language);
} else {
acceptableDrops = rarity < .02 ? ['Golden'] : rarity < .09 ? ['Zombie', 'CottonCandyPink', 'CottonCandyBlue'] : rarity < .18 ? ['Red', 'Shade', 'Skeleton'] : ['Base', 'White', 'Desert'];
drop = cloneDropItem(user.fns.randomVal(_.pick(content.hatchingPotions, (function(v, k) {
return acceptableDrops.indexOf(k) >= 0;
}))));
if ((base2 = user.items.hatchingPotions)[name2 = drop.key] == null) {
base2[name2] = 0;
}
user.items.hatchingPotions[drop.key]++;
drop.type = 'HatchingPotion';
drop.dialog = i18n.t('messageDropPotion', {
dropText: drop.text(req.language),
dropNotes: drop.notes(req.language)
}, req.language);
}
user._tmp.drop = drop;
user.items.lastDrop.date = +(new Date);
return user.items.lastDrop.count++;
}
};
+14
View File
@@ -0,0 +1,14 @@
import _ from 'lodash';
/*
Get a random property from an object
returns random property (the value)
*/
module.exports = function(user, obj, options) {
var array, rand;
array = (options != null ? options.key : void 0) ? _.keys(obj) : _.values(obj);
rand = user.fns.predictableRandom(options != null ? options.seed : void 0);
array.sort();
return array[Math.floor(rand * array.length)];
};
+33
View File
@@ -0,0 +1,33 @@
import content from '../content/index';
import _ from 'lodash';
module.exports = function(user) {
var base, owned;
owned = typeof window !== "undefined" && window !== null ? user.items.gear.owned : user.items.gear.owned.toObject();
if ((base = user.achievements).ultimateGearSets == null) {
base.ultimateGearSets = {
healer: false,
wizard: false,
rogue: false,
warrior: false
};
}
content.classes.forEach(function(klass) {
if (user.achievements.ultimateGearSets[klass] !== true) {
return user.achievements.ultimateGearSets[klass] = _.reduce(['armor', 'shield', 'head', 'weapon'], function(soFarGood, type) {
var found;
found = _.find(content.gear.tree[type][klass], {
last: true
});
return soFarGood && (!found || owned[found.key] === true);
}, true);
}
});
if (typeof user.markModified === "function") {
user.markModified('achievements.ultimateGearSets');
}
if (_.contains(user.achievements.ultimateGearSets, true) && user.flags.armoireEnabled !== true) {
user.flags.armoireEnabled = true;
return typeof user.markModified === "function" ? user.markModified('flags') : void 0;
}
};
+109
View File
@@ -0,0 +1,109 @@
import _ from 'lodash';
import {
MAX_HEALTH,
MAX_STAT_POINTS
} from '../constants';
import { toNextLevel } from '../statHelpers';
module.exports = function (user, stats, req, analytics) {
let allocatedStatPoints;
let totalStatPoints;
let experienceToNextLevel;
if (stats.hp <= 0) {
user.stats.hp = 0;
return user.stats.hp;
}
user.stats.hp = stats.hp;
user.stats.gp = stats.gp >= 0 ? stats.gp : 0;
experienceToNextLevel = toNextLevel(user.stats.lvl);
if (stats.exp >= experienceToNextLevel) {
user.stats.exp = stats.exp;
while (stats.exp >= experienceToNextLevel) {
stats.exp -= experienceToNextLevel;
user.stats.lvl++;
experienceToNextLevel = toNextLevel(user.stats.lvl);
user.stats.hp = MAX_HEALTH;
allocatedStatPoints = user.stats.str + user.stats.int + user.stats.con + user.stats.per;
totalStatPoints = allocatedStatPoints + user.stats.points;
if (totalStatPoints >= MAX_STAT_POINTS) {
continue; // eslint-disable-line no-continue
}
if (user.preferences.automaticAllocation) {
user.fns.autoAllocate();
} else {
user.stats.points = user.stats.lvl - allocatedStatPoints;
totalStatPoints = user.stats.points + allocatedStatPoints;
if (totalStatPoints > MAX_STAT_POINTS) {
user.stats.points = MAX_STAT_POINTS - allocatedStatPoints;
}
if (user.stats.points < 0) {
user.stats.points = 0;
}
}
}
}
user.stats.exp = stats.exp;
user.flags = user.flags || {};
if (!user.flags.customizationsNotification && (user.stats.exp > 5 || user.stats.lvl > 1)) {
user.flags.customizationsNotification = true;
}
if (!user.flags.itemsEnabled && (user.stats.exp > 10 || user.stats.lvl > 1)) {
user.flags.itemsEnabled = true;
}
if (!user.flags.dropsEnabled && user.stats.lvl >= 3) {
user.flags.dropsEnabled = true;
if (user.items.eggs["Wolf"] > 0) {
user.items.eggs["Wolf"]++;
} else {
user.items.eggs["Wolf"] = 1;
}
}
if (!user.flags.classSelected && user.stats.lvl >= 10) {
user.flags.classSelected;
}
_.each({
vice1: 30,
atom1: 15,
moonstone1: 60,
goldenknight1: 40
}, function(lvl, k) {
var analyticsData, base, base1, ref;
if (!((ref = user.flags.levelDrops) != null ? ref[k] : void 0) && user.stats.lvl >= lvl) {
if ((base = user.items.quests)[k] == null) {
base[k] = 0;
}
user.items.quests[k]++;
((base1 = user.flags).levelDrops != null ? base1.levelDrops : base1.levelDrops = {})[k] = true;
if (typeof user.markModified === "function") {
user.markModified('flags.levelDrops');
}
analyticsData = {
uuid: user._id,
itemKey: k,
acquireMethod: 'Level Drop',
category: 'behavior'
};
if (analytics != null) {
analytics.track('acquire item', analyticsData);
}
if (!user._tmp) user._tmp = {}
return user._tmp.drop = {
type: 'Quest',
key: k
};
}
});
if (!user.flags.rebirthEnabled && (user.stats.lvl >= 50 || user.achievements.beastMaster)) {
return user.flags.rebirthEnabled = true;
}
};
+85 -2590
View File
File diff suppressed because it is too large Load Diff
+19
View File
@@ -0,0 +1,19 @@
import _ from 'lodash';
/*
Are there tags applied?
*/
module.exports = function(userTags, taskTags) {
var arr;
arr = [];
_.each(userTags, function(t) {
if (t == null) {
return;
}
if (taskTags != null ? taskTags[t.id] : void 0) {
return arr.push(t.name);
}
});
return arr.join(', ');
};
+7
View File
@@ -0,0 +1,7 @@
import _ from 'lodash';
module.exports = function(items) {
return _.reduce(items, (function(m, v) {
return m + (v ? 1 : 0);
}), 0);
};
+9
View File
@@ -0,0 +1,9 @@
import _ from 'lodash';
module.exports = function(obj, path) {
return _.reduce(path.split('.'), ((function(_this) {
return function(curr, next) {
return curr != null ? curr[next] : void 0;
};
})(this)), obj);
};
+14
View File
@@ -0,0 +1,14 @@
import _ from 'lodash';
module.exports = function(obj, path, val) {
var arr;
arr = path.split('.');
return _.reduce(arr, (function(_this) {
return function(curr, next, index) {
if ((arr.length - 1) === index) {
curr[next] = val;
}
return curr[next] != null ? curr[next] : curr[next] = {};
};
})(this), obj);
};
+9
View File
@@ -0,0 +1,9 @@
/*
Encode the download link for .ics iCal file
*/
module.exports = function(uid, apiToken) {
var loc, ref;
loc = (typeof window !== "undefined" && window !== null ? window.location.host : void 0) || (typeof process !== "undefined" && process !== null ? (ref = process.env) != null ? ref.BASE_URL : void 0 : void 0) || '';
return encodeURIComponent("http://" + loc + "/v1/users/" + uid + "/calendar.ics?apiToken=" + apiToken);
};
+9
View File
@@ -0,0 +1,9 @@
import moment from 'moment';
/*
Friendly timestamp
*/
module.exports = function(timestamp) {
return moment(timestamp).format('MM/DD h:mm:ss a');
};
+7
View File
@@ -0,0 +1,7 @@
module.exports = function(num) {
if (num) {
return Math.floor(num);
} else {
return "0";
}
};
+46
View File
@@ -0,0 +1,46 @@
import uuid from './uuid';
import taskDefaults from './taskDefaults';
import refPush from './refPush';
import splitWhitespace from './splitWhitespace';
import planGemLimits from './planGemLimits';
import preenTodos from './preenTodos';
import dotSet from './dotSet';
import dotGet from './dotGet';
import preenHistory from './preenHistory';
import countExists from './countExists';
import updateStore from './updateStore';
import appliedTags from './appliedTags';
import encodeiCalLink from './encodeiCalLink';
import friendlyTimestamp from './friendlyTimestamp';
import gold from './gold';
import newChatMessages from './newChatMessages';
import noTags from './noTags';
import percent from './percent';
import removeWhitespace from './removeWhitespace';
import silver from './silver';
import taskClasses from './taskClasses';
module.exports = {
uuid,
taskDefaults,
refPush,
splitWhitespace,
planGemLimits,
preenTodos,
dotSet,
dotGet,
preenHistory,
countExists,
updateStore,
appliedTags,
encodeiCalLink,
friendlyTimestamp,
gold,
newChatMessages,
noTags,
percent,
removeWhitespace,
silver,
taskClasses,
};
+10
View File
@@ -0,0 +1,10 @@
/*
Does user have new chat messages?
*/
module.exports = function(messages, lastMessageSeen) {
if (!((messages != null ? messages.length : void 0) > 0)) {
return false;
}
return (messages != null ? messages[0] : void 0) && (messages[0].id !== lastMessageSeen);
};
+11
View File
@@ -0,0 +1,11 @@
import _ from 'lodash';
/*
are any tags active?
*/
module.exports = function(tags) {
return _.isEmpty(tags) || _.isEmpty(_.filter(tags, function(t) {
return t;
}));
};
+17
View File
@@ -0,0 +1,17 @@
module.exports = function(x, y, dir) {
var roundFn;
switch (dir) {
case "up":
roundFn = Math.ceil;
break;
case "down":
roundFn = Math.floor;
break;
default:
roundFn = Math.round;
}
if (x === 0) {
x = 1;
}
return Math.max(0, roundFn(x / y * 100));
};
+4
View File
@@ -0,0 +1,4 @@
module.exports = {
convRate: 20,
convCap: 25,
};
+43
View File
@@ -0,0 +1,43 @@
import moment from 'moment';
import _ from 'lodash';
/*
Preen history for users with > 7 history entries
This takes an infinite array of single day entries [day day day day day...], and turns it into a condensed array
of averages, condensing more the further back in time we go. Eg, 7 entries each for last 7 days; 1 entry each week
of this month; 1 entry for each month of this year; 1 entry per previous year: [day*7 week*4 month*12 year*infinite]
*/
module.exports = function(history) {
var newHistory, preen, thisMonth;
history = _.filter(history, function(h) {
return !!h;
});
newHistory = [];
preen = function(amount, groupBy) {
var groups;
groups = _.chain(history).groupBy(function(h) {
return moment(h.date).format(groupBy);
}).sortBy(function(h, k) {
return k;
}).value();
groups = groups.slice(-amount);
groups.pop();
return _.each(groups, function(group) {
newHistory.push({
date: moment(group[0].date).toDate(),
value: _.reduce(group, (function(m, obj) {
return m + obj.value;
}), 0) / group.length
});
return true;
});
};
preen(50, "YYYY");
preen(moment().format('MM'), "YYYYMM");
thisMonth = moment().format('YYYYMM');
newHistory = newHistory.concat(_.filter(history, function(h) {
return moment(h.date).format('YYYYMM') === thisMonth;
}));
return newHistory;
};

Some files were not shown because too many files have changed in this diff Show More