diff --git a/dist/habitrpg-shared.css b/dist/habitrpg-shared.css index 8e4d260ba9..1d0fdbc835 100644 --- a/dist/habitrpg-shared.css +++ b/dist/habitrpg-shared.css @@ -1 +1 @@ -.customize-option.beard_{background-image:url(spritesmith.png);background-position:-115px -15px;width:60px;height:60px}.customize-option.hair_beard_1_TRUred{background-image:url(spritesmith.png);background-position:-25px -1005px;width:60px;height:60px}.customize-option.hair_beard_1_black{background-image:url(spritesmith.png);background-position:-25px -105px;width:60px;height:60px}.customize-option.hair_beard_1_blond{background-image:url(spritesmith.png);background-position:-115px -105px;width:60px;height:60px}.customize-option.hair_beard_1_blue{background-image:url(spritesmith.png);background-position:-205px -15px;width:60px;height:60px}.customize-option.hair_beard_1_brown{background-image:url(spritesmith.png);background-position:-205px -105px;width:60px;height:60px}.customize-option.hair_beard_1_candycane{background-image:url(spritesmith.png);background-position:-25px -195px;width:60px;height:60px}.customize-option.hair_beard_1_frost{background-image:url(spritesmith.png);background-position:-115px -195px;width:60px;height:60px}.customize-option.hair_beard_1_green{background-image:url(spritesmith.png);background-position:-205px -195px;width:60px;height:60px}.customize-option.hair_beard_1_holly{background-image:url(spritesmith.png);background-position:-295px -15px;width:60px;height:60px}.customize-option.hair_beard_1_purple{background-image:url(spritesmith.png);background-position:-295px -105px;width:60px;height:60px}.customize-option.hair_beard_1_rainbow{background-image:url(spritesmith.png);background-position:-295px -195px;width:60px;height:60px}.customize-option.hair_beard_1_red{background-image:url(spritesmith.png);background-position:-25px -285px;width:60px;height:60px}.customize-option.hair_beard_1_white{background-image:url(spritesmith.png);background-position:-115px -285px;width:60px;height:60px}.customize-option.hair_beard_1_winternight{background-image:url(spritesmith.png);background-position:-205px -285px;width:60px;height:60px}.customize-option.hair_beard_1_yellow{background-image:url(spritesmith.png);background-position:-295px -285px;width:60px;height:60px}.customize-option.hair_beard_2_TRUred{background-image:url(spritesmith.png);background-position:-385px -15px;width:60px;height:60px}.customize-option.hair_beard_2_black{background-image:url(spritesmith.png);background-position:-385px -105px;width:60px;height:60px}.customize-option.hair_beard_2_blond{background-image:url(spritesmith.png);background-position:-385px -195px;width:60px;height:60px}.customize-option.hair_beard_2_blue{background-image:url(spritesmith.png);background-position:-385px -285px;width:60px;height:60px}.customize-option.hair_beard_2_brown{background-image:url(spritesmith.png);background-position:-25px -375px;width:60px;height:60px}.customize-option.hair_beard_2_candycane{background-image:url(spritesmith.png);background-position:-115px -375px;width:60px;height:60px}.customize-option.hair_beard_2_frost{background-image:url(spritesmith.png);background-position:-205px -375px;width:60px;height:60px}.customize-option.hair_beard_2_green{background-image:url(spritesmith.png);background-position:-295px -375px;width:60px;height:60px}.customize-option.hair_beard_2_holly{background-image:url(spritesmith.png);background-position:-385px -375px;width:60px;height:60px}.customize-option.hair_beard_2_purple{background-image:url(spritesmith.png);background-position:-475px -15px;width:60px;height:60px}.customize-option.hair_beard_2_rainbow{background-image:url(spritesmith.png);background-position:-475px -105px;width:60px;height:60px}.customize-option.hair_beard_2_red{background-image:url(spritesmith.png);background-position:-475px -195px;width:60px;height:60px}.customize-option.hair_beard_2_white{background-image:url(spritesmith.png);background-position:-475px -285px;width:60px;height:60px}.customize-option.hair_beard_2_winternight{background-image:url(spritesmith.png);background-position:-475px -375px;width:60px;height:60px}.customize-option.hair_beard_2_yellow{background-image:url(spritesmith.png);background-position:-25px -465px;width:60px;height:60px}.customize-option.hair_beard_3_TRUred{background-image:url(spritesmith.png);background-position:-115px -465px;width:60px;height:60px}.customize-option.hair_beard_3_black{background-image:url(spritesmith.png);background-position:-205px -465px;width:60px;height:60px}.customize-option.hair_beard_3_blond{background-image:url(spritesmith.png);background-position:-295px -465px;width:60px;height:60px}.customize-option.hair_beard_3_blue{background-image:url(spritesmith.png);background-position:-385px -465px;width:60px;height:60px}.customize-option.hair_beard_3_brown{background-image:url(spritesmith.png);background-position:-475px -465px;width:60px;height:60px}.customize-option.hair_beard_3_candycane{background-image:url(spritesmith.png);background-position:-565px -15px;width:60px;height:60px}.customize-option.hair_beard_3_frost{background-image:url(spritesmith.png);background-position:-565px -105px;width:60px;height:60px}.customize-option.hair_beard_3_green{background-image:url(spritesmith.png);background-position:-565px -195px;width:60px;height:60px}.customize-option.hair_beard_3_holly{background-image:url(spritesmith.png);background-position:-565px -285px;width:60px;height:60px}.customize-option.hair_beard_3_purple{background-image:url(spritesmith.png);background-position:-565px -375px;width:60px;height:60px}.customize-option.hair_beard_3_rainbow{background-image:url(spritesmith.png);background-position:-565px -465px;width:60px;height:60px}.customize-option.hair_beard_3_red{background-image:url(spritesmith.png);background-position:-25px -555px;width:60px;height:60px}.customize-option.hair_beard_3_white{background-image:url(spritesmith.png);background-position:-115px -555px;width:60px;height:60px}.customize-option.hair_beard_3_winternight{background-image:url(spritesmith.png);background-position:-205px -555px;width:60px;height:60px}.customize-option.hair_beard_3_yellow{background-image:url(spritesmith.png);background-position:-295px -555px;width:60px;height:60px}.customize-option.hair_mustache_1_TRUred{background-image:url(spritesmith.png);background-position:-385px -555px;width:60px;height:60px}.customize-option.hair_mustache_1_black{background-image:url(spritesmith.png);background-position:-475px -555px;width:60px;height:60px}.customize-option.hair_mustache_1_blond{background-image:url(spritesmith.png);background-position:-565px -555px;width:60px;height:60px}.customize-option.hair_mustache_1_blue{background-image:url(spritesmith.png);background-position:-655px -15px;width:60px;height:60px}.customize-option.hair_mustache_1_brown{background-image:url(spritesmith.png);background-position:-655px -105px;width:60px;height:60px}.customize-option.hair_mustache_1_candycane{background-image:url(spritesmith.png);background-position:-655px -195px;width:60px;height:60px}.customize-option.hair_mustache_1_frost{background-image:url(spritesmith.png);background-position:-655px -285px;width:60px;height:60px}.customize-option.hair_mustache_1_green{background-image:url(spritesmith.png);background-position:-655px -375px;width:60px;height:60px}.customize-option.hair_mustache_1_holly{background-image:url(spritesmith.png);background-position:-655px -465px;width:60px;height:60px}.customize-option.hair_mustache_1_purple{background-image:url(spritesmith.png);background-position:-655px -555px;width:60px;height:60px}.customize-option.hair_mustache_1_rainbow{background-image:url(spritesmith.png);background-position:-25px -645px;width:60px;height:60px}.customize-option.hair_mustache_1_red{background-image:url(spritesmith.png);background-position:-115px -645px;width:60px;height:60px}.customize-option.hair_mustache_1_white{background-image:url(spritesmith.png);background-position:-205px -645px;width:60px;height:60px}.customize-option.hair_mustache_1_winternight{background-image:url(spritesmith.png);background-position:-295px -645px;width:60px;height:60px}.customize-option.hair_mustache_1_yellow{background-image:url(spritesmith.png);background-position:-385px -645px;width:60px;height:60px}.customize-option.hair_mustache_2_TRUred{background-image:url(spritesmith.png);background-position:-475px -645px;width:60px;height:60px}.customize-option.hair_mustache_2_black{background-image:url(spritesmith.png);background-position:-565px -645px;width:60px;height:60px}.customize-option.hair_mustache_2_blond{background-image:url(spritesmith.png);background-position:-655px -645px;width:60px;height:60px}.customize-option.hair_mustache_2_blue{background-image:url(spritesmith.png);background-position:-745px -15px;width:60px;height:60px}.customize-option.hair_mustache_2_brown{background-image:url(spritesmith.png);background-position:-745px -105px;width:60px;height:60px}.customize-option.hair_mustache_2_candycane{background-image:url(spritesmith.png);background-position:-745px -195px;width:60px;height:60px}.customize-option.hair_mustache_2_frost{background-image:url(spritesmith.png);background-position:-745px -285px;width:60px;height:60px}.customize-option.hair_mustache_2_green{background-image:url(spritesmith.png);background-position:-745px -375px;width:60px;height:60px}.customize-option.hair_mustache_2_holly{background-image:url(spritesmith.png);background-position:-745px -465px;width:60px;height:60px}.customize-option.hair_mustache_2_purple{background-image:url(spritesmith.png);background-position:-745px -555px;width:60px;height:60px}.customize-option.hair_mustache_2_rainbow{background-image:url(spritesmith.png);background-position:-745px -645px;width:60px;height:60px}.customize-option.hair_mustache_2_red{background-image:url(spritesmith.png);background-position:-25px -735px;width:60px;height:60px}.customize-option.hair_mustache_2_white{background-image:url(spritesmith.png);background-position:-115px -735px;width:60px;height:60px}.customize-option.hair_mustache_2_winternight{background-image:url(spritesmith.png);background-position:-205px -735px;width:60px;height:60px}.customize-option.hair_mustache_2_yellow{background-image:url(spritesmith.png);background-position:-295px -735px;width:60px;height:60px}.customize-option.hair_bangs_1_TRUred{background-image:url(spritesmith.png);background-position:-385px -735px;width:60px;height:60px}.customize-option.hair_bangs_1_black{background-image:url(spritesmith.png);background-position:-475px -735px;width:60px;height:60px}.customize-option.hair_bangs_1_blond{background-image:url(spritesmith.png);background-position:-565px -735px;width:60px;height:60px}.customize-option.hair_bangs_1_blue{background-image:url(spritesmith.png);background-position:-655px -735px;width:60px;height:60px}.customize-option.hair_bangs_1_brown{background-image:url(spritesmith.png);background-position:-745px -735px;width:60px;height:60px}.customize-option.hair_bangs_1_candycane{background-image:url(spritesmith.png);background-position:-835px -15px;width:60px;height:60px}.customize-option.hair_bangs_1_frost{background-image:url(spritesmith.png);background-position:-835px -105px;width:60px;height:60px}.customize-option.hair_bangs_1_green{background-image:url(spritesmith.png);background-position:-835px -195px;width:60px;height:60px}.customize-option.hair_bangs_1_holly{background-image:url(spritesmith.png);background-position:-835px -285px;width:60px;height:60px}.customize-option.hair_bangs_1_purple{background-image:url(spritesmith.png);background-position:-835px -375px;width:60px;height:60px}.customize-option.hair_bangs_1_rainbow{background-image:url(spritesmith.png);background-position:-835px -465px;width:60px;height:60px}.customize-option.hair_bangs_1_red{background-image:url(spritesmith.png);background-position:-835px -555px;width:60px;height:60px}.customize-option.hair_bangs_1_white{background-image:url(spritesmith.png);background-position:-835px -645px;width:60px;height:60px}.customize-option.hair_bangs_1_winternight{background-image:url(spritesmith.png);background-position:-835px -735px;width:60px;height:60px}.customize-option.hair_bangs_1_yellow{background-image:url(spritesmith.png);background-position:-25px -825px;width:60px;height:60px}.customize-option.hair_bangs_2_TRUred{background-image:url(spritesmith.png);background-position:-115px -825px;width:60px;height:60px}.customize-option.hair_bangs_2_black{background-image:url(spritesmith.png);background-position:-205px -825px;width:60px;height:60px}.customize-option.hair_bangs_2_blond{background-image:url(spritesmith.png);background-position:-295px -825px;width:60px;height:60px}.customize-option.hair_bangs_2_blue{background-image:url(spritesmith.png);background-position:-385px -825px;width:60px;height:60px}.customize-option.hair_bangs_2_brown{background-image:url(spritesmith.png);background-position:-475px -825px;width:60px;height:60px}.customize-option.hair_bangs_2_candycane{background-image:url(spritesmith.png);background-position:-565px -825px;width:60px;height:60px}.customize-option.hair_bangs_2_frost{background-image:url(spritesmith.png);background-position:-655px -825px;width:60px;height:60px}.customize-option.hair_bangs_2_green{background-image:url(spritesmith.png);background-position:-745px -825px;width:60px;height:60px}.customize-option.hair_bangs_2_holly{background-image:url(spritesmith.png);background-position:-835px -825px;width:60px;height:60px}.customize-option.hair_bangs_2_purple{background-image:url(spritesmith.png);background-position:-925px -15px;width:60px;height:60px}.customize-option.hair_bangs_2_rainbow{background-image:url(spritesmith.png);background-position:-925px -105px;width:60px;height:60px}.customize-option.hair_bangs_2_red{background-image:url(spritesmith.png);background-position:-925px -195px;width:60px;height:60px}.customize-option.hair_bangs_2_white{background-image:url(spritesmith.png);background-position:-925px -285px;width:60px;height:60px}.customize-option.hair_bangs_2_winternight{background-image:url(spritesmith.png);background-position:-925px -375px;width:60px;height:60px}.customize-option.hair_bangs_2_yellow{background-image:url(spritesmith.png);background-position:-925px -465px;width:60px;height:60px}.customize-option.hair_bangs_3_TRUred{background-image:url(spritesmith.png);background-position:-925px -555px;width:60px;height:60px}.customize-option.hair_bangs_3_black{background-image:url(spritesmith.png);background-position:-925px -645px;width:60px;height:60px}.customize-option.hair_bangs_3_blond{background-image:url(spritesmith.png);background-position:-925px -735px;width:60px;height:60px}.customize-option.hair_bangs_3_blue{background-image:url(spritesmith.png);background-position:-925px -825px;width:60px;height:60px}.customize-option.hair_bangs_3_brown{background-image:url(spritesmith.png);background-position:-25px -915px;width:60px;height:60px}.customize-option.hair_bangs_3_candycane{background-image:url(spritesmith.png);background-position:-115px -915px;width:60px;height:60px}.customize-option.hair_bangs_3_frost{background-image:url(spritesmith.png);background-position:-205px -915px;width:60px;height:60px}.customize-option.hair_bangs_3_green{background-image:url(spritesmith.png);background-position:-295px -915px;width:60px;height:60px}.customize-option.hair_bangs_3_holly{background-image:url(spritesmith.png);background-position:-385px -915px;width:60px;height:60px}.customize-option.hair_bangs_3_purple{background-image:url(spritesmith.png);background-position:-475px -915px;width:60px;height:60px}.customize-option.hair_bangs_3_rainbow{background-image:url(spritesmith.png);background-position:-565px -915px;width:60px;height:60px}.customize-option.hair_bangs_3_red{background-image:url(spritesmith.png);background-position:-655px -915px;width:60px;height:60px}.customize-option.hair_bangs_3_white{background-image:url(spritesmith.png);background-position:-745px -915px;width:60px;height:60px}.customize-option.hair_bangs_3_winternight{background-image:url(spritesmith.png);background-position:-835px -915px;width:60px;height:60px}.customize-option.hair_bangs_3_yellow{background-image:url(spritesmith.png);background-position:-925px -915px;width:60px;height:60px}.customize-option.hair_base_1_TRUred{background-image:url(spritesmith.png);background-position:-1015px -15px;width:60px;height:60px}.customize-option.hair_base_1_black{background-image:url(spritesmith.png);background-position:-1015px -105px;width:60px;height:60px}.customize-option.hair_base_1_blond{background-image:url(spritesmith.png);background-position:-1015px -195px;width:60px;height:60px}.customize-option.hair_base_1_blue{background-image:url(spritesmith.png);background-position:-1015px -285px;width:60px;height:60px}.customize-option.hair_base_1_brown{background-image:url(spritesmith.png);background-position:-1015px -375px;width:60px;height:60px}.customize-option.hair_base_1_candycane{background-image:url(spritesmith.png);background-position:-1015px -465px;width:60px;height:60px}.customize-option.hair_base_1_frost{background-image:url(spritesmith.png);background-position:-1015px -555px;width:60px;height:60px}.customize-option.hair_base_1_green{background-image:url(spritesmith.png);background-position:-1015px -645px;width:60px;height:60px}.customize-option.hair_base_1_holly{background-image:url(spritesmith.png);background-position:-1015px -735px;width:60px;height:60px}.customize-option.hair_base_1_purple{background-image:url(spritesmith.png);background-position:-1015px -825px;width:60px;height:60px}.customize-option.hair_base_1_rainbow{background-image:url(spritesmith.png);background-position:-1015px -915px;width:60px;height:60px}.customize-option.hair_base_1_red{background-image:url(spritesmith.png);background-position:-25px -15px;width:60px;height:60px}.customize-option.hair_base_1_white{background-image:url(spritesmith.png);background-position:-115px -1005px;width:60px;height:60px}.customize-option.hair_base_1_winternight{background-image:url(spritesmith.png);background-position:-205px -1005px;width:60px;height:60px}.customize-option.hair_base_1_yellow{background-image:url(spritesmith.png);background-position:-295px -1005px;width:60px;height:60px}.customize-option.hair_base_2_TRUred{background-image:url(spritesmith.png);background-position:-385px -1005px;width:60px;height:60px}.customize-option.hair_base_2_black{background-image:url(spritesmith.png);background-position:-475px -1005px;width:60px;height:60px}.customize-option.hair_base_2_blond{background-image:url(spritesmith.png);background-position:-565px -1005px;width:60px;height:60px}.customize-option.hair_base_2_blue{background-image:url(spritesmith.png);background-position:-655px -1005px;width:60px;height:60px}.customize-option.hair_base_2_brown{background-image:url(spritesmith.png);background-position:-745px -1005px;width:60px;height:60px}.customize-option.hair_base_2_candycane{background-image:url(spritesmith.png);background-position:-835px -1005px;width:60px;height:60px}.customize-option.hair_base_2_frost{background-image:url(spritesmith.png);background-position:-925px -1005px;width:60px;height:60px}.customize-option.hair_base_2_green{background-image:url(spritesmith.png);background-position:-1015px -1005px;width:60px;height:60px}.customize-option.hair_base_2_holly{background-image:url(spritesmith.png);background-position:-1105px -15px;width:60px;height:60px}.customize-option.hair_base_2_purple{background-image:url(spritesmith.png);background-position:-1105px -105px;width:60px;height:60px}.customize-option.hair_base_2_rainbow{background-image:url(spritesmith.png);background-position:-1105px -195px;width:60px;height:60px}.customize-option.hair_base_2_red{background-image:url(spritesmith.png);background-position:-1105px -285px;width:60px;height:60px}.customize-option.hair_base_2_white{background-image:url(spritesmith.png);background-position:-1105px -375px;width:60px;height:60px}.customize-option.hair_base_2_winternight{background-image:url(spritesmith.png);background-position:-1105px -465px;width:60px;height:60px}.customize-option.hair_base_2_yellow{background-image:url(spritesmith.png);background-position:-1105px -555px;width:60px;height:60px}.customize-option.hair_base_3_TRUred{background-image:url(spritesmith.png);background-position:-1105px -645px;width:60px;height:60px}.customize-option.hair_base_3_black{background-image:url(spritesmith.png);background-position:-1105px -735px;width:60px;height:60px}.customize-option.hair_base_3_blond{background-image:url(spritesmith.png);background-position:-1105px -825px;width:60px;height:60px}.customize-option.hair_base_3_blue{background-image:url(spritesmith.png);background-position:-1105px -915px;width:60px;height:60px}.customize-option.hair_base_3_brown{background-image:url(spritesmith.png);background-position:-1105px -1005px;width:60px;height:60px}.customize-option.hair_base_3_candycane{background-image:url(spritesmith.png);background-position:-25px -1095px;width:60px;height:60px}.customize-option.hair_base_3_frost{background-image:url(spritesmith.png);background-position:-115px -1095px;width:60px;height:60px}.customize-option.hair_base_3_green{background-image:url(spritesmith.png);background-position:-205px -1095px;width:60px;height:60px}.customize-option.hair_base_3_holly{background-image:url(spritesmith.png);background-position:-295px -1095px;width:60px;height:60px}.customize-option.hair_base_3_purple{background-image:url(spritesmith.png);background-position:-385px -1095px;width:60px;height:60px}.customize-option.hair_base_3_rainbow{background-image:url(spritesmith.png);background-position:-475px -1095px;width:60px;height:60px}.customize-option.hair_base_3_red{background-image:url(spritesmith.png);background-position:-565px -1095px;width:60px;height:60px}.customize-option.hair_base_3_white{background-image:url(spritesmith.png);background-position:-655px -1095px;width:60px;height:60px}.customize-option.hair_base_3_winternight{background-image:url(spritesmith.png);background-position:-745px -1095px;width:60px;height:60px}.customize-option.hair_base_3_yellow{background-image:url(spritesmith.png);background-position:-835px -1095px;width:60px;height:60px}.customize-option.hair_base_4_TRUred{background-image:url(spritesmith.png);background-position:-925px -1095px;width:60px;height:60px}.customize-option.hair_base_4_black{background-image:url(spritesmith.png);background-position:-1015px -1095px;width:60px;height:60px}.customize-option.hair_base_4_blond{background-image:url(spritesmith.png);background-position:-1105px -1095px;width:60px;height:60px}.customize-option.hair_base_4_blue{background-image:url(spritesmith.png);background-position:-1195px -15px;width:60px;height:60px}.customize-option.hair_base_4_brown{background-image:url(spritesmith.png);background-position:-1195px -105px;width:60px;height:60px}.customize-option.hair_base_4_candycane{background-image:url(spritesmith.png);background-position:-1195px -195px;width:60px;height:60px}.customize-option.hair_base_4_frost{background-image:url(spritesmith.png);background-position:-1195px -285px;width:60px;height:60px}.customize-option.hair_base_4_green{background-image:url(spritesmith.png);background-position:-1195px -375px;width:60px;height:60px}.customize-option.hair_base_4_holly{background-image:url(spritesmith.png);background-position:-1195px -465px;width:60px;height:60px}.customize-option.hair_base_4_purple{background-image:url(spritesmith.png);background-position:-1195px -555px;width:60px;height:60px}.customize-option.hair_base_4_rainbow{background-image:url(spritesmith.png);background-position:-1195px -645px;width:60px;height:60px}.customize-option.hair_base_4_red{background-image:url(spritesmith.png);background-position:-1195px -735px;width:60px;height:60px}.customize-option.hair_base_4_white{background-image:url(spritesmith.png);background-position:-1195px -825px;width:60px;height:60px}.customize-option.hair_base_4_winternight{background-image:url(spritesmith.png);background-position:-1195px -915px;width:60px;height:60px}.customize-option.hair_base_4_yellow{background-image:url(spritesmith.png);background-position:-1195px -1005px;width:60px;height:60px}.customize-option.hair_base_5_TRUred{background-image:url(spritesmith.png);background-position:-1195px -1095px;width:60px;height:60px}.customize-option.hair_base_5_black{background-image:url(spritesmith.png);background-position:-25px -1185px;width:60px;height:60px}.customize-option.hair_base_5_blond{background-image:url(spritesmith.png);background-position:-115px -1185px;width:60px;height:60px}.customize-option.hair_base_5_blue{background-image:url(spritesmith.png);background-position:-205px -1185px;width:60px;height:60px}.customize-option.hair_base_5_brown{background-image:url(spritesmith.png);background-position:-295px -1185px;width:60px;height:60px}.customize-option.hair_base_5_candycane{background-image:url(spritesmith.png);background-position:-385px -1185px;width:60px;height:60px}.customize-option.hair_base_5_frost{background-image:url(spritesmith.png);background-position:-475px -1185px;width:60px;height:60px}.customize-option.hair_base_5_green{background-image:url(spritesmith.png);background-position:-565px -1185px;width:60px;height:60px}.customize-option.hair_base_5_holly{background-image:url(spritesmith.png);background-position:-655px -1185px;width:60px;height:60px}.customize-option.hair_base_5_purple{background-image:url(spritesmith.png);background-position:-745px -1185px;width:60px;height:60px}.customize-option.hair_base_5_rainbow{background-image:url(spritesmith.png);background-position:-835px -1185px;width:60px;height:60px}.customize-option.hair_base_5_red{background-image:url(spritesmith.png);background-position:-925px -1185px;width:60px;height:60px}.customize-option.hair_base_5_white{background-image:url(spritesmith.png);background-position:-1015px -1185px;width:60px;height:60px}.customize-option.hair_base_5_winternight{background-image:url(spritesmith.png);background-position:-1105px -1185px;width:60px;height:60px}.customize-option.hair_base_5_yellow{background-image:url(spritesmith.png);background-position:-1195px -1185px;width:60px;height:60px}.customize-option.hair_base_6_TRUred{background-image:url(spritesmith.png);background-position:-1285px -15px;width:60px;height:60px}.customize-option.hair_base_6_black{background-image:url(spritesmith.png);background-position:-1285px -105px;width:60px;height:60px}.customize-option.hair_base_6_blond{background-image:url(spritesmith.png);background-position:-1285px -195px;width:60px;height:60px}.customize-option.hair_base_6_blue{background-image:url(spritesmith.png);background-position:-1285px -285px;width:60px;height:60px}.customize-option.hair_base_6_brown{background-image:url(spritesmith.png);background-position:-1285px -375px;width:60px;height:60px}.customize-option.hair_base_6_candycane{background-image:url(spritesmith.png);background-position:-1285px -465px;width:60px;height:60px}.customize-option.hair_base_6_frost{background-image:url(spritesmith.png);background-position:-1285px -555px;width:60px;height:60px}.customize-option.hair_base_6_green{background-image:url(spritesmith.png);background-position:-1285px -645px;width:60px;height:60px}.customize-option.hair_base_6_holly{background-image:url(spritesmith.png);background-position:-1285px -735px;width:60px;height:60px}.customize-option.hair_base_6_purple{background-image:url(spritesmith.png);background-position:-1285px -825px;width:60px;height:60px}.customize-option.hair_base_6_rainbow{background-image:url(spritesmith.png);background-position:-1285px -915px;width:60px;height:60px}.customize-option.hair_base_6_red{background-image:url(spritesmith.png);background-position:-1285px -1005px;width:60px;height:60px}.customize-option.hair_base_6_white{background-image:url(spritesmith.png);background-position:-1285px -1095px;width:60px;height:60px}.customize-option.hair_base_6_winternight{background-image:url(spritesmith.png);background-position:-1285px -1185px;width:60px;height:60px}.customize-option.hair_base_6_yellow{background-image:url(spritesmith.png);background-position:-25px -1275px;width:60px;height:60px}.customize-option.hair_base_7_TRUred{background-image:url(spritesmith.png);background-position:-115px -1275px;width:60px;height:60px}.customize-option.hair_base_7_black{background-image:url(spritesmith.png);background-position:-205px -1275px;width:60px;height:60px}.customize-option.hair_base_7_blond{background-image:url(spritesmith.png);background-position:-295px -1275px;width:60px;height:60px}.customize-option.hair_base_7_blue{background-image:url(spritesmith.png);background-position:-385px -1275px;width:60px;height:60px}.customize-option.hair_base_7_brown{background-image:url(spritesmith.png);background-position:-475px -1275px;width:60px;height:60px}.customize-option.hair_base_7_candycane{background-image:url(spritesmith.png);background-position:-565px -1275px;width:60px;height:60px}.customize-option.hair_base_7_frost{background-image:url(spritesmith.png);background-position:-655px -1275px;width:60px;height:60px}.customize-option.hair_base_7_green{background-image:url(spritesmith.png);background-position:-745px -1275px;width:60px;height:60px}.customize-option.hair_base_7_holly{background-image:url(spritesmith.png);background-position:-835px -1275px;width:60px;height:60px}.customize-option.hair_base_7_purple{background-image:url(spritesmith.png);background-position:-925px -1275px;width:60px;height:60px}.customize-option.hair_base_7_rainbow{background-image:url(spritesmith.png);background-position:-1015px -1275px;width:60px;height:60px}.customize-option.hair_base_7_red{background-image:url(spritesmith.png);background-position:-1105px -1275px;width:60px;height:60px}.customize-option.hair_base_7_white{background-image:url(spritesmith.png);background-position:-1195px -1275px;width:60px;height:60px}.customize-option.hair_base_7_winternight{background-image:url(spritesmith.png);background-position:-1285px -1275px;width:60px;height:60px}.customize-option.hair_base_7_yellow{background-image:url(spritesmith.png);background-position:-1375px -15px;width:60px;height:60px}.customize-option.hair_base_8_TRUred{background-image:url(spritesmith.png);background-position:-1375px -105px;width:60px;height:60px}.customize-option.hair_base_8_black{background-image:url(spritesmith.png);background-position:-1375px -195px;width:60px;height:60px}.customize-option.hair_base_8_blond{background-image:url(spritesmith.png);background-position:-1375px -285px;width:60px;height:60px}.customize-option.hair_base_8_blue{background-image:url(spritesmith.png);background-position:-1375px -375px;width:60px;height:60px}.customize-option.hair_base_8_brown{background-image:url(spritesmith.png);background-position:-1375px -465px;width:60px;height:60px}.customize-option.hair_base_8_candycane{background-image:url(spritesmith.png);background-position:-1375px -555px;width:60px;height:60px}.customize-option.hair_base_8_frost{background-image:url(spritesmith.png);background-position:-1375px -645px;width:60px;height:60px}.customize-option.hair_base_8_green{background-image:url(spritesmith.png);background-position:-1375px -735px;width:60px;height:60px}.customize-option.hair_base_8_holly{background-image:url(spritesmith.png);background-position:-1375px -825px;width:60px;height:60px}.customize-option.hair_base_8_purple{background-image:url(spritesmith.png);background-position:-1375px -915px;width:60px;height:60px}.customize-option.hair_base_8_rainbow{background-image:url(spritesmith.png);background-position:-1375px -1005px;width:60px;height:60px}.customize-option.hair_base_8_red{background-image:url(spritesmith.png);background-position:-1375px -1095px;width:60px;height:60px}.customize-option.hair_base_8_white{background-image:url(spritesmith.png);background-position:-1375px -1185px;width:60px;height:60px}.customize-option.hair_base_8_winternight{background-image:url(spritesmith.png);background-position:-1375px -1275px;width:60px;height:60px}.customize-option.hair_base_8_yellow{background-image:url(spritesmith.png);background-position:-25px -1365px;width:60px;height:60px}.customize-option.head_0{background-image:url(spritesmith.png);background-position:-1465px -645px;width:60px;height:60px}.customize-option.skin_0ff591{background-image:url(spritesmith.png);background-position:-115px -1365px;width:60px;height:60px}.customize-option.skin_2b43f6{background-image:url(spritesmith.png);background-position:-205px -1365px;width:60px;height:60px}.customize-option.skin_6bd049{background-image:url(spritesmith.png);background-position:-295px -1365px;width:60px;height:60px}.customize-option.skin_800ed0{background-image:url(spritesmith.png);background-position:-385px -1365px;width:60px;height:60px}.customize-option.skin_915533{background-image:url(spritesmith.png);background-position:-475px -1365px;width:60px;height:60px}.customize-option.skin_98461a{background-image:url(spritesmith.png);background-position:-565px -1365px;width:60px;height:60px}.customize-option.skin_c06534{background-image:url(spritesmith.png);background-position:-655px -1365px;width:60px;height:60px}.customize-option.skin_c3e1dc{background-image:url(spritesmith.png);background-position:-745px -1365px;width:60px;height:60px}.customize-option.skin_d7a9f7{background-image:url(spritesmith.png);background-position:-835px -1365px;width:60px;height:60px}.customize-option.skin_ddc994{background-image:url(spritesmith.png);background-position:-925px -1365px;width:60px;height:60px}.customize-option.skin_ea8349{background-image:url(spritesmith.png);background-position:-1015px -1365px;width:60px;height:60px}.customize-option.skin_eb052b{background-image:url(spritesmith.png);background-position:-1105px -1365px;width:60px;height:60px}.customize-option.skin_f5a76e{background-image:url(spritesmith.png);background-position:-1195px -1365px;width:60px;height:60px}.customize-option.skin_f5d70f{background-image:url(spritesmith.png);background-position:-1285px -1365px;width:60px;height:60px}.customize-option.skin_f69922{background-image:url(spritesmith.png);background-position:-1375px -1365px;width:60px;height:60px}.customize-option.skin_ghost{background-image:url(spritesmith.png);background-position:-1465px -15px;width:60px;height:60px}.customize-option.skin_monster{background-image:url(spritesmith.png);background-position:-1465px -105px;width:60px;height:60px}.customize-option.skin_pumpkin{background-image:url(spritesmith.png);background-position:-1465px -195px;width:60px;height:60px}.customize-option.skin_rainbow{background-image:url(spritesmith.png);background-position:-1465px -285px;width:60px;height:60px}.customize-option.skin_shadow{background-image:url(spritesmith.png);background-position:-1465px -375px;width:60px;height:60px}.customize-option.skin_skeleton{background-image:url(spritesmith.png);background-position:-1465px -465px;width:60px;height:60px}.customize-option.skin_zombie{background-image:url(spritesmith.png);background-position:-1465px -555px;width:60px;height:60px}.achievement-alien{background-image:url(spritesmith.png);background-position:-2688px -2610px;width:24px;height:26px}.achievement-armor{background-image:url(spritesmith.png);background-position:-2745px -1448px;width:24px;height:26px}.achievement-boot{background-image:url(spritesmith.png);background-position:-2748px -1376px;width:24px;height:26px}.achievement-bow{background-image:url(spritesmith.png);background-position:-2745px -1422px;width:24px;height:26px}.achievement-cactus{background-image:url(spritesmith.png);background-position:-2739px -1590px;width:24px;height:26px}.achievement-cake{background-image:url(spritesmith.png);background-position:-2556px -2430px;width:24px;height:26px}.achievement-cave{background-image:url(spritesmith.png);background-position:-2148px -2070px;width:24px;height:26px}.achievement-coffin{background-image:url(spritesmith.png);background-position:-2286px -2160px;width:24px;height:26px}.achievement-comment{background-image:url(spritesmith.png);background-position:-2262px -2160px;width:24px;height:26px}.achievement-firefox{background-image:url(spritesmith.png);background-position:-2238px -2160px;width:24px;height:26px}.achievement-habitBirthday{background-image:url(spritesmith.png);background-position:-2376px -2250px;width:24px;height:26px}.achievement-heart{background-image:url(spritesmith.png);background-position:-2352px -2250px;width:24px;height:26px}.achievement-helm{background-image:url(spritesmith.png);background-position:-2328px -2250px;width:24px;height:26px}.achievement-karaoke{background-image:url(spritesmith.png);background-position:-2466px -2340px;width:24px;height:26px}.achievement-ninja{background-image:url(spritesmith.png);background-position:-2442px -2340px;width:24px;height:26px}.achievement-perfect{background-image:url(spritesmith.png);background-position:-2418px -2340px;width:24px;height:26px}.achievement-rat{background-image:url(spritesmith.png);background-position:-2748px -1350px;width:24px;height:26px}.achievement-shield{background-image:url(spritesmith.png);background-position:-2532px -2430px;width:24px;height:26px}.achievement-snowball{background-image:url(spritesmith.png);background-position:-2508px -2430px;width:24px;height:26px}.achievement-sun{background-image:url(spritesmith.png);background-position:-2646px -2520px;width:24px;height:26px}.achievement-sword{background-image:url(spritesmith.png);background-position:-2622px -2520px;width:24px;height:26px}.achievement-thermometer{background-image:url(spritesmith.png);background-position:-2598px -2520px;width:24px;height:26px}.achievement-tree{background-image:url(spritesmith.png);background-position:-2736px -2610px;width:24px;height:26px}.achievement-valentine{background-image:url(spritesmith.png);background-position:-2712px -2610px;width:24px;height:26px}.broad_armor_healer_1{background-image:url(spritesmith.png);background-position:-2148px 0;width:90px;height:90px}.broad_armor_healer_2{background-image:url(spritesmith.png);background-position:-2148px -90px;width:90px;height:90px}.broad_armor_healer_3{background-image:url(spritesmith.png);background-position:-2148px -180px;width:90px;height:90px}.broad_armor_healer_4{background-image:url(spritesmith.png);background-position:-2148px -270px;width:90px;height:90px}.broad_armor_healer_5{background-image:url(spritesmith.png);background-position:-2148px -360px;width:90px;height:90px}.broad_armor_rogue_1{background-image:url(spritesmith.png);background-position:-2148px -450px;width:90px;height:90px}.broad_armor_rogue_2{background-image:url(spritesmith.png);background-position:-2148px -540px;width:90px;height:90px}.broad_armor_rogue_3{background-image:url(spritesmith.png);background-position:-2148px -630px;width:90px;height:90px}.broad_armor_rogue_4{background-image:url(spritesmith.png);background-position:-2148px -720px;width:90px;height:90px}.broad_armor_rogue_5{background-image:url(spritesmith.png);background-position:-2148px -810px;width:90px;height:90px}.broad_armor_special_2{background-image:url(spritesmith.png);background-position:-2148px -900px;width:90px;height:90px}.broad_armor_special_birthday{background-image:url(spritesmith.png);background-position:-2148px -990px;width:90px;height:90px}.broad_armor_special_candycane{background-image:url(spritesmith.png);background-position:-2148px -1080px;width:90px;height:90px}.broad_armor_special_ski{background-image:url(spritesmith.png);background-position:-2148px -1170px;width:90px;height:90px}.broad_armor_special_snowflake{background-image:url(spritesmith.png);background-position:-2148px -1260px;width:90px;height:90px}.broad_armor_special_tarutaru{background-image:url(spritesmith.png);background-position:-2148px -1350px;width:90px;height:90px}.broad_armor_special_yeti{background-image:url(spritesmith.png);background-position:-2148px -1440px;width:90px;height:90px}.broad_armor_warrior_1{background-image:url(spritesmith.png);background-position:-2148px -1530px;width:90px;height:90px}.broad_armor_warrior_2{background-image:url(spritesmith.png);background-position:-2148px -1620px;width:90px;height:90px}.broad_armor_warrior_3{background-image:url(spritesmith.png);background-position:-2148px -1710px;width:90px;height:90px}.broad_armor_warrior_4{background-image:url(spritesmith.png);background-position:-2148px -1800px;width:90px;height:90px}.broad_armor_warrior_5{background-image:url(spritesmith.png);background-position:-2148px -1890px;width:90px;height:90px}.broad_armor_wizard_1{background-image:url(spritesmith.png);background-position:-2148px -1980px;width:90px;height:90px}.broad_armor_wizard_2{background-image:url(spritesmith.png);background-position:0 -2100px;width:90px;height:90px}.broad_armor_wizard_3{background-image:url(spritesmith.png);background-position:-90px -2100px;width:90px;height:90px}.broad_armor_wizard_4{background-image:url(spritesmith.png);background-position:-180px -2100px;width:90px;height:90px}.broad_armor_wizard_5{background-image:url(spritesmith.png);background-position:-270px -2100px;width:90px;height:90px}.slim_armor_healer_1{background-image:url(spritesmith.png);background-position:-360px -2100px;width:90px;height:90px}.slim_armor_healer_2{background-image:url(spritesmith.png);background-position:-450px -2100px;width:90px;height:90px}.slim_armor_healer_3{background-image:url(spritesmith.png);background-position:-540px -2100px;width:90px;height:90px}.slim_armor_healer_4{background-image:url(spritesmith.png);background-position:-630px -2100px;width:90px;height:90px}.slim_armor_healer_5{background-image:url(spritesmith.png);background-position:-720px -2100px;width:90px;height:90px}.slim_armor_rogue_1{background-image:url(spritesmith.png);background-position:-810px -2100px;width:90px;height:90px}.slim_armor_rogue_2{background-image:url(spritesmith.png);background-position:-900px -2100px;width:90px;height:90px}.slim_armor_rogue_3{background-image:url(spritesmith.png);background-position:-990px -2100px;width:90px;height:90px}.slim_armor_rogue_4{background-image:url(spritesmith.png);background-position:-1080px -2100px;width:90px;height:90px}.slim_armor_rogue_5{background-image:url(spritesmith.png);background-position:-1170px -2100px;width:90px;height:90px}.slim_armor_special_2{background-image:url(spritesmith.png);background-position:-1260px -2100px;width:90px;height:90px}.slim_armor_special_birthday{background-image:url(spritesmith.png);background-position:-1350px -2100px;width:90px;height:90px}.slim_armor_special_candycane{background-image:url(spritesmith.png);background-position:-1440px -2100px;width:90px;height:90px}.slim_armor_special_ski{background-image:url(spritesmith.png);background-position:-1530px -2100px;width:90px;height:90px}.slim_armor_special_snowflake{background-image:url(spritesmith.png);background-position:-1620px -2100px;width:90px;height:90px}.slim_armor_special_yeti{background-image:url(spritesmith.png);background-position:-1710px -2100px;width:90px;height:90px}.slim_armor_warrior_1{background-image:url(spritesmith.png);background-position:-1800px -2100px;width:90px;height:90px}.slim_armor_warrior_2{background-image:url(spritesmith.png);background-position:-1890px -2100px;width:90px;height:90px}.slim_armor_warrior_3{background-image:url(spritesmith.png);background-position:-1980px -2100px;width:90px;height:90px}.slim_armor_warrior_4{background-image:url(spritesmith.png);background-position:-2070px -2100px;width:90px;height:90px}.slim_armor_warrior_5{background-image:url(spritesmith.png);background-position:-2238px 0;width:90px;height:90px}.slim_armor_wizard_1{background-image:url(spritesmith.png);background-position:-2238px -90px;width:90px;height:90px}.slim_armor_wizard_2{background-image:url(spritesmith.png);background-position:-2238px -180px;width:90px;height:90px}.slim_armor_wizard_3{background-image:url(spritesmith.png);background-position:-2238px -270px;width:90px;height:90px}.slim_armor_wizard_4{background-image:url(spritesmith.png);background-position:-2238px -360px;width:90px;height:90px}.slim_armor_wizard_5{background-image:url(spritesmith.png);background-position:-2238px -450px;width:90px;height:90px}.beard_{background-image:url(spritesmith.png);background-position:-2238px -540px;width:90px;height:90px}.hair_beard_1_TRUred{background-image:url(spritesmith.png);background-position:-2238px -630px;width:90px;height:90px}.hair_beard_1_black{background-image:url(spritesmith.png);background-position:-2238px -720px;width:90px;height:90px}.hair_beard_1_blond{background-image:url(spritesmith.png);background-position:-2238px -900px;width:90px;height:90px}.hair_beard_1_blue{background-image:url(spritesmith.png);background-position:-2238px -990px;width:90px;height:90px}.hair_beard_1_brown{background-image:url(spritesmith.png);background-position:-2238px -1080px;width:90px;height:90px}.hair_beard_1_candycane{background-image:url(spritesmith.png);background-position:-2238px -1170px;width:90px;height:90px}.hair_beard_1_frost{background-image:url(spritesmith.png);background-position:-2238px -1260px;width:90px;height:90px}.hair_beard_1_green{background-image:url(spritesmith.png);background-position:-2238px -1350px;width:90px;height:90px}.hair_beard_1_holly{background-image:url(spritesmith.png);background-position:-2238px -1440px;width:90px;height:90px}.hair_beard_1_purple{background-image:url(spritesmith.png);background-position:-2238px -1530px;width:90px;height:90px}.hair_beard_1_rainbow{background-image:url(spritesmith.png);background-position:-2238px -1620px;width:90px;height:90px}.hair_beard_1_red{background-image:url(spritesmith.png);background-position:-2238px -1710px;width:90px;height:90px}.hair_beard_1_white{background-image:url(spritesmith.png);background-position:-2238px -1800px;width:90px;height:90px}.hair_beard_1_winternight{background-image:url(spritesmith.png);background-position:-2238px -1890px;width:90px;height:90px}.hair_beard_1_yellow{background-image:url(spritesmith.png);background-position:-2238px -1980px;width:90px;height:90px}.hair_beard_2_TRUred{background-image:url(spritesmith.png);background-position:-2238px -2070px;width:90px;height:90px}.hair_beard_2_black{background-image:url(spritesmith.png);background-position:0 -2190px;width:90px;height:90px}.hair_beard_2_blond{background-image:url(spritesmith.png);background-position:-90px -2190px;width:90px;height:90px}.hair_beard_2_blue{background-image:url(spritesmith.png);background-position:-180px -2190px;width:90px;height:90px}.hair_beard_2_brown{background-image:url(spritesmith.png);background-position:-270px -2190px;width:90px;height:90px}.hair_beard_2_candycane{background-image:url(spritesmith.png);background-position:-360px -2190px;width:90px;height:90px}.hair_beard_2_frost{background-image:url(spritesmith.png);background-position:-450px -2190px;width:90px;height:90px}.hair_beard_2_green{background-image:url(spritesmith.png);background-position:-540px -2190px;width:90px;height:90px}.hair_beard_2_holly{background-image:url(spritesmith.png);background-position:-630px -2190px;width:90px;height:90px}.hair_beard_2_purple{background-image:url(spritesmith.png);background-position:-720px -2190px;width:90px;height:90px}.hair_beard_2_rainbow{background-image:url(spritesmith.png);background-position:-810px -2190px;width:90px;height:90px}.hair_beard_2_red{background-image:url(spritesmith.png);background-position:-900px -2190px;width:90px;height:90px}.hair_beard_2_white{background-image:url(spritesmith.png);background-position:-990px -2190px;width:90px;height:90px}.hair_beard_2_winternight{background-image:url(spritesmith.png);background-position:-1080px -2190px;width:90px;height:90px}.hair_beard_2_yellow{background-image:url(spritesmith.png);background-position:-1170px -2190px;width:90px;height:90px}.hair_beard_3_TRUred{background-image:url(spritesmith.png);background-position:-1260px -2190px;width:90px;height:90px}.hair_beard_3_black{background-image:url(spritesmith.png);background-position:-1350px -2190px;width:90px;height:90px}.hair_beard_3_blond{background-image:url(spritesmith.png);background-position:-1440px -2190px;width:90px;height:90px}.hair_beard_3_blue{background-image:url(spritesmith.png);background-position:-1530px -2190px;width:90px;height:90px}.hair_beard_3_brown{background-image:url(spritesmith.png);background-position:-1620px -2190px;width:90px;height:90px}.hair_beard_3_candycane{background-image:url(spritesmith.png);background-position:-1710px -2190px;width:90px;height:90px}.hair_beard_3_frost{background-image:url(spritesmith.png);background-position:-1800px -2190px;width:90px;height:90px}.hair_beard_3_green{background-image:url(spritesmith.png);background-position:-1890px -2190px;width:90px;height:90px}.hair_beard_3_holly{background-image:url(spritesmith.png);background-position:-1980px -2190px;width:90px;height:90px}.hair_beard_3_purple{background-image:url(spritesmith.png);background-position:-2070px -2190px;width:90px;height:90px}.hair_beard_3_rainbow{background-image:url(spritesmith.png);background-position:-2160px -2190px;width:90px;height:90px}.hair_beard_3_red{background-image:url(spritesmith.png);background-position:-2328px 0;width:90px;height:90px}.hair_beard_3_white{background-image:url(spritesmith.png);background-position:-2328px -90px;width:90px;height:90px}.hair_beard_3_winternight{background-image:url(spritesmith.png);background-position:-2328px -180px;width:90px;height:90px}.hair_beard_3_yellow{background-image:url(spritesmith.png);background-position:-2328px -270px;width:90px;height:90px}.hair_mustache_1_TRUred{background-image:url(spritesmith.png);background-position:-2328px -360px;width:90px;height:90px}.hair_mustache_1_black{background-image:url(spritesmith.png);background-position:-2328px -450px;width:90px;height:90px}.hair_mustache_1_blond{background-image:url(spritesmith.png);background-position:-2328px -540px;width:90px;height:90px}.hair_mustache_1_blue{background-image:url(spritesmith.png);background-position:-2328px -630px;width:90px;height:90px}.hair_mustache_1_brown{background-image:url(spritesmith.png);background-position:-2328px -720px;width:90px;height:90px}.hair_mustache_1_candycane{background-image:url(spritesmith.png);background-position:-2328px -810px;width:90px;height:90px}.hair_mustache_1_frost{background-image:url(spritesmith.png);background-position:-2328px -900px;width:90px;height:90px}.hair_mustache_1_green{background-image:url(spritesmith.png);background-position:-2328px -990px;width:90px;height:90px}.hair_mustache_1_holly{background-image:url(spritesmith.png);background-position:-2328px -1080px;width:90px;height:90px}.hair_mustache_1_purple{background-image:url(spritesmith.png);background-position:-2328px -1170px;width:90px;height:90px}.hair_mustache_1_rainbow{background-image:url(spritesmith.png);background-position:-2328px -1260px;width:90px;height:90px}.hair_mustache_1_red{background-image:url(spritesmith.png);background-position:-2328px -1350px;width:90px;height:90px}.hair_mustache_1_white{background-image:url(spritesmith.png);background-position:-2328px -1440px;width:90px;height:90px}.hair_mustache_1_winternight{background-image:url(spritesmith.png);background-position:-2328px -1530px;width:90px;height:90px}.hair_mustache_1_yellow{background-image:url(spritesmith.png);background-position:-2328px -1620px;width:90px;height:90px}.hair_mustache_2_TRUred{background-image:url(spritesmith.png);background-position:-2328px -1710px;width:90px;height:90px}.hair_mustache_2_black{background-image:url(spritesmith.png);background-position:-2328px -1800px;width:90px;height:90px}.hair_mustache_2_blond{background-image:url(spritesmith.png);background-position:-2328px -1890px;width:90px;height:90px}.hair_mustache_2_blue{background-image:url(spritesmith.png);background-position:-2328px -1980px;width:90px;height:90px}.hair_mustache_2_brown{background-image:url(spritesmith.png);background-position:-2328px -2070px;width:90px;height:90px}.hair_mustache_2_candycane{background-image:url(spritesmith.png);background-position:-2328px -2160px;width:90px;height:90px}.hair_mustache_2_frost{background-image:url(spritesmith.png);background-position:0 -2280px;width:90px;height:90px}.hair_mustache_2_green{background-image:url(spritesmith.png);background-position:-90px -2280px;width:90px;height:90px}.hair_mustache_2_holly{background-image:url(spritesmith.png);background-position:-180px -2280px;width:90px;height:90px}.hair_mustache_2_purple{background-image:url(spritesmith.png);background-position:-270px -2280px;width:90px;height:90px}.hair_mustache_2_rainbow{background-image:url(spritesmith.png);background-position:-360px -2280px;width:90px;height:90px}.hair_mustache_2_red{background-image:url(spritesmith.png);background-position:-450px -2280px;width:90px;height:90px}.hair_mustache_2_white{background-image:url(spritesmith.png);background-position:-540px -2280px;width:90px;height:90px}.hair_mustache_2_winternight{background-image:url(spritesmith.png);background-position:-630px -2280px;width:90px;height:90px}.hair_mustache_2_yellow{background-image:url(spritesmith.png);background-position:-720px -2280px;width:90px;height:90px}.hair_bangs_1_TRUred{background-image:url(spritesmith.png);background-position:-810px -2280px;width:90px;height:90px}.hair_bangs_1_black{background-image:url(spritesmith.png);background-position:-900px -2280px;width:90px;height:90px}.hair_bangs_1_blond{background-image:url(spritesmith.png);background-position:-990px -2280px;width:90px;height:90px}.hair_bangs_1_blue{background-image:url(spritesmith.png);background-position:-1080px -2280px;width:90px;height:90px}.hair_bangs_1_brown{background-image:url(spritesmith.png);background-position:-1170px -2280px;width:90px;height:90px}.hair_bangs_1_candycane{background-image:url(spritesmith.png);background-position:-1260px -2280px;width:90px;height:90px}.hair_bangs_1_frost{background-image:url(spritesmith.png);background-position:-1350px -2280px;width:90px;height:90px}.hair_bangs_1_green{background-image:url(spritesmith.png);background-position:-1440px -2280px;width:90px;height:90px}.hair_bangs_1_holly{background-image:url(spritesmith.png);background-position:-1530px -2280px;width:90px;height:90px}.hair_bangs_1_purple{background-image:url(spritesmith.png);background-position:-1620px -2280px;width:90px;height:90px}.hair_bangs_1_rainbow{background-image:url(spritesmith.png);background-position:-1710px -2280px;width:90px;height:90px}.hair_bangs_1_red{background-image:url(spritesmith.png);background-position:-1800px -2280px;width:90px;height:90px}.hair_bangs_1_white{background-image:url(spritesmith.png);background-position:-1890px -2280px;width:90px;height:90px}.hair_bangs_1_winternight{background-image:url(spritesmith.png);background-position:-1980px -2280px;width:90px;height:90px}.hair_bangs_1_yellow{background-image:url(spritesmith.png);background-position:-2070px -2280px;width:90px;height:90px}.hair_bangs_2_TRUred{background-image:url(spritesmith.png);background-position:-2160px -2280px;width:90px;height:90px}.hair_bangs_2_black{background-image:url(spritesmith.png);background-position:-2250px -2280px;width:90px;height:90px}.hair_bangs_2_blond{background-image:url(spritesmith.png);background-position:-2418px 0;width:90px;height:90px}.hair_bangs_2_blue{background-image:url(spritesmith.png);background-position:-2418px -90px;width:90px;height:90px}.hair_bangs_2_brown{background-image:url(spritesmith.png);background-position:-2418px -180px;width:90px;height:90px}.hair_bangs_2_candycane{background-image:url(spritesmith.png);background-position:-2418px -270px;width:90px;height:90px}.hair_bangs_2_frost{background-image:url(spritesmith.png);background-position:-2418px -360px;width:90px;height:90px}.hair_bangs_2_green{background-image:url(spritesmith.png);background-position:-2418px -450px;width:90px;height:90px}.hair_bangs_2_holly{background-image:url(spritesmith.png);background-position:-2418px -540px;width:90px;height:90px}.hair_bangs_2_purple{background-image:url(spritesmith.png);background-position:-2418px -630px;width:90px;height:90px}.hair_bangs_2_rainbow{background-image:url(spritesmith.png);background-position:-2418px -720px;width:90px;height:90px}.hair_bangs_2_red{background-image:url(spritesmith.png);background-position:-2418px -810px;width:90px;height:90px}.hair_bangs_2_white{background-image:url(spritesmith.png);background-position:-2418px -900px;width:90px;height:90px}.hair_bangs_2_winternight{background-image:url(spritesmith.png);background-position:-2418px -990px;width:90px;height:90px}.hair_bangs_2_yellow{background-image:url(spritesmith.png);background-position:-2418px -1080px;width:90px;height:90px}.hair_bangs_3_TRUred{background-image:url(spritesmith.png);background-position:-2418px -1170px;width:90px;height:90px}.hair_bangs_3_black{background-image:url(spritesmith.png);background-position:-2418px -1260px;width:90px;height:90px}.hair_bangs_3_blond{background-image:url(spritesmith.png);background-position:-2418px -1350px;width:90px;height:90px}.hair_bangs_3_blue{background-image:url(spritesmith.png);background-position:-2418px -1440px;width:90px;height:90px}.hair_bangs_3_brown{background-image:url(spritesmith.png);background-position:-2418px -1530px;width:90px;height:90px}.hair_bangs_3_candycane{background-image:url(spritesmith.png);background-position:-2418px -1620px;width:90px;height:90px}.hair_bangs_3_frost{background-image:url(spritesmith.png);background-position:-2418px -1710px;width:90px;height:90px}.hair_bangs_3_green{background-image:url(spritesmith.png);background-position:-2418px -1800px;width:90px;height:90px}.hair_bangs_3_holly{background-image:url(spritesmith.png);background-position:-2418px -1890px;width:90px;height:90px}.hair_bangs_3_purple{background-image:url(spritesmith.png);background-position:-2418px -1980px;width:90px;height:90px}.hair_bangs_3_rainbow{background-image:url(spritesmith.png);background-position:-2418px -2070px;width:90px;height:90px}.hair_bangs_3_red{background-image:url(spritesmith.png);background-position:-2418px -2160px;width:90px;height:90px}.hair_bangs_3_white{background-image:url(spritesmith.png);background-position:-2418px -2250px;width:90px;height:90px}.hair_bangs_3_winternight{background-image:url(spritesmith.png);background-position:0 -2370px;width:90px;height:90px}.hair_bangs_3_yellow{background-image:url(spritesmith.png);background-position:-90px -2370px;width:90px;height:90px}.hair_base_1_TRUred{background-image:url(spritesmith.png);background-position:-180px -2370px;width:90px;height:90px}.hair_base_1_black{background-image:url(spritesmith.png);background-position:-270px -2370px;width:90px;height:90px}.hair_base_1_blond{background-image:url(spritesmith.png);background-position:-360px -2370px;width:90px;height:90px}.hair_base_1_blue{background-image:url(spritesmith.png);background-position:-450px -2370px;width:90px;height:90px}.hair_base_1_brown{background-image:url(spritesmith.png);background-position:-540px -2370px;width:90px;height:90px}.hair_base_1_candycane{background-image:url(spritesmith.png);background-position:-630px -2370px;width:90px;height:90px}.hair_base_1_frost{background-image:url(spritesmith.png);background-position:-720px -2370px;width:90px;height:90px}.hair_base_1_green{background-image:url(spritesmith.png);background-position:-900px -2370px;width:90px;height:90px}.hair_base_1_holly{background-image:url(spritesmith.png);background-position:-990px -2370px;width:90px;height:90px}.hair_base_1_purple{background-image:url(spritesmith.png);background-position:-1080px -2370px;width:90px;height:90px}.hair_base_1_rainbow{background-image:url(spritesmith.png);background-position:-1260px -2370px;width:90px;height:90px}.hair_base_1_red{background-image:url(spritesmith.png);background-position:-1350px -2370px;width:90px;height:90px}.hair_base_1_white{background-image:url(spritesmith.png);background-position:-1440px -2370px;width:90px;height:90px}.hair_base_1_winternight{background-image:url(spritesmith.png);background-position:-1530px -2370px;width:90px;height:90px}.hair_base_1_yellow{background-image:url(spritesmith.png);background-position:-1620px -2370px;width:90px;height:90px}.hair_base_2_TRUred{background-image:url(spritesmith.png);background-position:-1710px -2370px;width:90px;height:90px}.hair_base_2_black{background-image:url(spritesmith.png);background-position:-1800px -2370px;width:90px;height:90px}.hair_base_2_blond{background-image:url(spritesmith.png);background-position:-1890px -2370px;width:90px;height:90px}.hair_base_2_blue{background-image:url(spritesmith.png);background-position:-1980px -2370px;width:90px;height:90px}.hair_base_2_brown{background-image:url(spritesmith.png);background-position:-2070px -2370px;width:90px;height:90px}.hair_base_2_candycane{background-image:url(spritesmith.png);background-position:-2160px -2370px;width:90px;height:90px}.hair_base_2_frost{background-image:url(spritesmith.png);background-position:-2250px -2370px;width:90px;height:90px}.hair_base_2_green{background-image:url(spritesmith.png);background-position:-2340px -2370px;width:90px;height:90px}.hair_base_2_holly{background-image:url(spritesmith.png);background-position:-2508px 0;width:90px;height:90px}.hair_base_2_purple{background-image:url(spritesmith.png);background-position:-2508px -90px;width:90px;height:90px}.hair_base_2_rainbow{background-image:url(spritesmith.png);background-position:-2508px -180px;width:90px;height:90px}.hair_base_2_red{background-image:url(spritesmith.png);background-position:-2508px -270px;width:90px;height:90px}.hair_base_2_white{background-image:url(spritesmith.png);background-position:-2508px -360px;width:90px;height:90px}.hair_base_2_winternight{background-image:url(spritesmith.png);background-position:-2508px -450px;width:90px;height:90px}.hair_base_2_yellow{background-image:url(spritesmith.png);background-position:-2508px -540px;width:90px;height:90px}.hair_base_3_TRUred{background-image:url(spritesmith.png);background-position:-2508px -630px;width:90px;height:90px}.hair_base_3_black{background-image:url(spritesmith.png);background-position:-2508px -720px;width:90px;height:90px}.hair_base_3_blond{background-image:url(spritesmith.png);background-position:-2508px -810px;width:90px;height:90px}.hair_base_3_blue{background-image:url(spritesmith.png);background-position:-2508px -900px;width:90px;height:90px}.hair_base_3_brown{background-image:url(spritesmith.png);background-position:-2508px -990px;width:90px;height:90px}.hair_base_3_candycane{background-image:url(spritesmith.png);background-position:-2508px -1080px;width:90px;height:90px}.hair_base_3_frost{background-image:url(spritesmith.png);background-position:-2508px -1260px;width:90px;height:90px}.hair_base_3_green{background-image:url(spritesmith.png);background-position:-2508px -1350px;width:90px;height:90px}.hair_base_3_holly{background-image:url(spritesmith.png);background-position:-2508px -1440px;width:90px;height:90px}.hair_base_3_purple{background-image:url(spritesmith.png);background-position:-2508px -1530px;width:90px;height:90px}.hair_base_3_rainbow{background-image:url(spritesmith.png);background-position:-2508px -1620px;width:90px;height:90px}.hair_base_3_red{background-image:url(spritesmith.png);background-position:-2508px -1710px;width:90px;height:90px}.hair_base_3_white{background-image:url(spritesmith.png);background-position:-2508px -1800px;width:90px;height:90px}.hair_base_3_winternight{background-image:url(spritesmith.png);background-position:-2508px -1890px;width:90px;height:90px}.hair_base_3_yellow{background-image:url(spritesmith.png);background-position:-2508px -1980px;width:90px;height:90px}.hair_base_4_TRUred{background-image:url(spritesmith.png);background-position:-2508px -2070px;width:90px;height:90px}.hair_base_4_black{background-image:url(spritesmith.png);background-position:-2508px -2160px;width:90px;height:90px}.hair_base_4_blond{background-image:url(spritesmith.png);background-position:-2508px -2250px;width:90px;height:90px}.hair_base_4_blue{background-image:url(spritesmith.png);background-position:-2508px -2340px;width:90px;height:90px}.hair_base_4_brown{background-image:url(spritesmith.png);background-position:0 -2460px;width:90px;height:90px}.hair_base_4_candycane{background-image:url(spritesmith.png);background-position:-90px -2460px;width:90px;height:90px}.hair_base_4_frost{background-image:url(spritesmith.png);background-position:-180px -2460px;width:90px;height:90px}.hair_base_4_green{background-image:url(spritesmith.png);background-position:-270px -2460px;width:90px;height:90px}.hair_base_4_holly{background-image:url(spritesmith.png);background-position:-360px -2460px;width:90px;height:90px}.hair_base_4_purple{background-image:url(spritesmith.png);background-position:-450px -2460px;width:90px;height:90px}.hair_base_4_rainbow{background-image:url(spritesmith.png);background-position:-540px -2460px;width:90px;height:90px}.hair_base_4_red{background-image:url(spritesmith.png);background-position:-630px -2460px;width:90px;height:90px}.hair_base_4_white{background-image:url(spritesmith.png);background-position:-720px -2460px;width:90px;height:90px}.hair_base_4_winternight{background-image:url(spritesmith.png);background-position:-810px -2460px;width:90px;height:90px}.hair_base_4_yellow{background-image:url(spritesmith.png);background-position:-900px -2460px;width:90px;height:90px}.hair_base_5_TRUred{background-image:url(spritesmith.png);background-position:-990px -2460px;width:90px;height:90px}.hair_base_5_black{background-image:url(spritesmith.png);background-position:-1080px -2460px;width:90px;height:90px}.hair_base_5_blond{background-image:url(spritesmith.png);background-position:-1170px -2460px;width:90px;height:90px}.hair_base_5_blue{background-image:url(spritesmith.png);background-position:-1260px -2460px;width:90px;height:90px}.hair_base_5_brown{background-image:url(spritesmith.png);background-position:-1350px -2460px;width:90px;height:90px}.hair_base_5_candycane{background-image:url(spritesmith.png);background-position:-1440px -2460px;width:90px;height:90px}.hair_base_5_frost{background-image:url(spritesmith.png);background-position:-1530px -2460px;width:90px;height:90px}.hair_base_5_green{background-image:url(spritesmith.png);background-position:-1620px -2460px;width:90px;height:90px}.hair_base_5_holly{background-image:url(spritesmith.png);background-position:-1710px -2460px;width:90px;height:90px}.hair_base_5_purple{background-image:url(spritesmith.png);background-position:-1800px -2460px;width:90px;height:90px}.hair_base_5_rainbow{background-image:url(spritesmith.png);background-position:-1890px -2460px;width:90px;height:90px}.hair_base_5_red{background-image:url(spritesmith.png);background-position:-1980px -2460px;width:90px;height:90px}.hair_base_5_white{background-image:url(spritesmith.png);background-position:-2070px -2460px;width:90px;height:90px}.hair_base_5_winternight{background-image:url(spritesmith.png);background-position:-2160px -2460px;width:90px;height:90px}.hair_base_5_yellow{background-image:url(spritesmith.png);background-position:-2250px -2460px;width:90px;height:90px}.hair_base_6_TRUred{background-image:url(spritesmith.png);background-position:-2340px -2460px;width:90px;height:90px}.hair_base_6_black{background-image:url(spritesmith.png);background-position:-2430px -2460px;width:90px;height:90px}.hair_base_6_blond{background-image:url(spritesmith.png);background-position:-2598px 0;width:90px;height:90px}.hair_base_6_blue{background-image:url(spritesmith.png);background-position:-2598px -90px;width:90px;height:90px}.hair_base_6_brown{background-image:url(spritesmith.png);background-position:-2598px -180px;width:90px;height:90px}.hair_base_6_candycane{background-image:url(spritesmith.png);background-position:-2598px -270px;width:90px;height:90px}.hair_base_6_frost{background-image:url(spritesmith.png);background-position:-2598px -360px;width:90px;height:90px}.hair_base_6_green{background-image:url(spritesmith.png);background-position:-2598px -450px;width:90px;height:90px}.hair_base_6_holly{background-image:url(spritesmith.png);background-position:-2598px -540px;width:90px;height:90px}.hair_base_6_purple{background-image:url(spritesmith.png);background-position:-2598px -630px;width:90px;height:90px}.hair_base_6_rainbow{background-image:url(spritesmith.png);background-position:-2598px -720px;width:90px;height:90px}.hair_base_6_red{background-image:url(spritesmith.png);background-position:-2598px -810px;width:90px;height:90px}.hair_base_6_white{background-image:url(spritesmith.png);background-position:-2598px -900px;width:90px;height:90px}.hair_base_6_winternight{background-image:url(spritesmith.png);background-position:-2598px -990px;width:90px;height:90px}.hair_base_6_yellow{background-image:url(spritesmith.png);background-position:-2598px -1080px;width:90px;height:90px}.hair_base_7_TRUred{background-image:url(spritesmith.png);background-position:-2598px -1170px;width:90px;height:90px}.hair_base_7_black{background-image:url(spritesmith.png);background-position:-2598px -1260px;width:90px;height:90px}.hair_base_7_blond{background-image:url(spritesmith.png);background-position:-2598px -1350px;width:90px;height:90px}.hair_base_7_blue{background-image:url(spritesmith.png);background-position:-2598px -1440px;width:90px;height:90px}.hair_base_7_brown{background-image:url(spritesmith.png);background-position:-2598px -1530px;width:90px;height:90px}.hair_base_7_candycane{background-image:url(spritesmith.png);background-position:-2598px -1620px;width:90px;height:90px}.hair_base_7_frost{background-image:url(spritesmith.png);background-position:-2598px -1710px;width:90px;height:90px}.hair_base_7_green{background-image:url(spritesmith.png);background-position:-2598px -1800px;width:90px;height:90px}.hair_base_7_holly{background-image:url(spritesmith.png);background-position:-2598px -1890px;width:90px;height:90px}.hair_base_7_purple{background-image:url(spritesmith.png);background-position:-2598px -1980px;width:90px;height:90px}.hair_base_7_rainbow{background-image:url(spritesmith.png);background-position:-2598px -2070px;width:90px;height:90px}.hair_base_7_red{background-image:url(spritesmith.png);background-position:-2598px -2160px;width:90px;height:90px}.hair_base_7_white{background-image:url(spritesmith.png);background-position:-2598px -2250px;width:90px;height:90px}.hair_base_7_winternight{background-image:url(spritesmith.png);background-position:-2598px -2340px;width:90px;height:90px}.hair_base_7_yellow{background-image:url(spritesmith.png);background-position:-2598px -2430px;width:90px;height:90px}.hair_base_8_TRUred{background-image:url(spritesmith.png);background-position:0 -2550px;width:90px;height:90px}.hair_base_8_black{background-image:url(spritesmith.png);background-position:-90px -2550px;width:90px;height:90px}.hair_base_8_blond{background-image:url(spritesmith.png);background-position:-180px -2550px;width:90px;height:90px}.hair_base_8_blue{background-image:url(spritesmith.png);background-position:-270px -2550px;width:90px;height:90px}.hair_base_8_brown{background-image:url(spritesmith.png);background-position:-360px -2550px;width:90px;height:90px}.hair_base_8_candycane{background-image:url(spritesmith.png);background-position:-450px -2550px;width:90px;height:90px}.hair_base_8_frost{background-image:url(spritesmith.png);background-position:-540px -2550px;width:90px;height:90px}.hair_base_8_green{background-image:url(spritesmith.png);background-position:-630px -2550px;width:90px;height:90px}.hair_base_8_holly{background-image:url(spritesmith.png);background-position:-720px -2550px;width:90px;height:90px}.hair_base_8_purple{background-image:url(spritesmith.png);background-position:-810px -2550px;width:90px;height:90px}.hair_base_8_rainbow{background-image:url(spritesmith.png);background-position:-900px -2550px;width:90px;height:90px}.hair_base_8_red{background-image:url(spritesmith.png);background-position:-1080px -2550px;width:90px;height:90px}.hair_base_8_white{background-image:url(spritesmith.png);background-position:0 -1830px;width:90px;height:90px}.hair_base_8_winternight{background-image:url(spritesmith.png);background-position:-90px -1830px;width:90px;height:90px}.hair_base_8_yellow{background-image:url(spritesmith.png);background-position:-180px -1830px;width:90px;height:90px}.head_0{background-image:url(spritesmith.png);background-position:-270px -1830px;width:90px;height:90px}.head_healer_1{background-image:url(spritesmith.png);background-position:-360px -1830px;width:90px;height:90px}.head_healer_2{background-image:url(spritesmith.png);background-position:-450px -1830px;width:90px;height:90px}.head_healer_3{background-image:url(spritesmith.png);background-position:-540px -1830px;width:90px;height:90px}.head_healer_4{background-image:url(spritesmith.png);background-position:-630px -1830px;width:90px;height:90px}.head_healer_5{background-image:url(spritesmith.png);background-position:-720px -1830px;width:90px;height:90px}.head_rogue_1{background-image:url(spritesmith.png);background-position:-810px -1830px;width:90px;height:90px}.head_rogue_2{background-image:url(spritesmith.png);background-position:-900px -1830px;width:90px;height:90px}.head_rogue_3{background-image:url(spritesmith.png);background-position:-990px -1830px;width:90px;height:90px}.head_rogue_4{background-image:url(spritesmith.png);background-position:-1080px -1830px;width:90px;height:90px}.head_rogue_5{background-image:url(spritesmith.png);background-position:-1170px -1830px;width:90px;height:90px}.head_special_2{background-image:url(spritesmith.png);background-position:-1260px -1830px;width:90px;height:90px}.head_special_candycane{background-image:url(spritesmith.png);background-position:-1350px -1830px;width:90px;height:90px}.head_special_nye{background-image:url(spritesmith.png);background-position:-1440px -1830px;width:90px;height:90px}.head_special_ski{background-image:url(spritesmith.png);background-position:-1530px -1830px;width:90px;height:90px}.head_special_snowflake{background-image:url(spritesmith.png);background-position:-1620px -1830px;width:90px;height:90px}.head_special_yeti{background-image:url(spritesmith.png);background-position:-1710px -1830px;width:90px;height:90px}.head_warrior_1{background-image:url(spritesmith.png);background-position:-1800px -1830px;width:90px;height:90px}.head_warrior_2{background-image:url(spritesmith.png);background-position:-1968px 0;width:90px;height:90px}.head_warrior_3{background-image:url(spritesmith.png);background-position:-1968px -90px;width:90px;height:90px}.head_warrior_4{background-image:url(spritesmith.png);background-position:-1968px -180px;width:90px;height:90px}.head_warrior_5{background-image:url(spritesmith.png);background-position:-1968px -270px;width:90px;height:90px}.head_wizard_1{background-image:url(spritesmith.png);background-position:-1968px -360px;width:90px;height:90px}.head_wizard_2{background-image:url(spritesmith.png);background-position:-1968px -450px;width:90px;height:90px}.head_wizard_3{background-image:url(spritesmith.png);background-position:-1968px -540px;width:90px;height:90px}.head_wizard_4{background-image:url(spritesmith.png);background-position:-1968px -630px;width:90px;height:90px}.head_wizard_5{background-image:url(spritesmith.png);background-position:-1968px -720px;width:90px;height:90px}.Pet_Currency_Gem{background-image:url(spritesmith.png);background-position:-1040px -2640px;width:45px;height:39px}.Pet_Currency_Gem1x{background-image:url(spritesmith.png);background-position:-2748px -1402px;width:15px;height:13px}.Pet_Currency_Gem2x{background-image:url(spritesmith.png);background-position:-2739px -1539px;width:30px;height:26px}.Pet_Egg_BearCub{background-image:url(spritesmith.png);background-position:-1887px -297px;width:48px;height:51px}.Pet_Egg_Cactus{background-image:url(spritesmith.png);background-position:-2688px -2508px;width:48px;height:51px}.Pet_Egg_Dragon{background-image:url(spritesmith.png);background-position:-2688px -2559px;width:48px;height:51px}.Pet_Egg_FlyingPig{background-image:url(spritesmith.png);background-position:-1887px -348px;width:48px;height:51px}.Pet_Egg_Fox{background-image:url(spritesmith.png);background-position:-2688px -1488px;width:48px;height:51px}.Pet_Egg_Gryphon{background-image:url(spritesmith.png);background-position:-2688px -1641px;width:48px;height:51px}.Pet_Egg_LionCub{background-image:url(spritesmith.png);background-position:-1887px -960px;width:48px;height:51px}.Pet_Egg_PandaCub{background-image:url(spritesmith.png);background-position:-1887px -1011px;width:48px;height:51px}.Pet_Egg_PolarBear{background-image:url(spritesmith.png);background-position:-1887px -1062px;width:48px;height:51px}.Pet_Egg_TigerCub{background-image:url(spritesmith.png);background-position:-1887px -1113px;width:48px;height:51px}.Pet_Egg_Wolf{background-image:url(spritesmith.png);background-position:-1887px -1164px;width:48px;height:51px}.Pet_Food_Cake_Base{background-image:url(spritesmith.png);background-position:-1887px -1480px;width:43px;height:43px}.Pet_Food_Cake_CottonCandyBlue{background-image:url(spritesmith.png);background-position:-2736px -1641px;width:42px;height:44px}.Pet_Food_Cake_CottonCandyPink{background-image:url(spritesmith.png);background-position:-1887px -1215px;width:43px;height:45px}.Pet_Food_Cake_Desert{background-image:url(spritesmith.png);background-position:-1887px -1304px;width:43px;height:44px}.Pet_Food_Cake_Golden{background-image:url(spritesmith.png);background-position:-1887px -1523px;width:43px;height:42px}.Pet_Food_Cake_Red{background-image:url(spritesmith.png);background-position:-1887px -1260px;width:43px;height:44px}.Pet_Food_Cake_Shade{background-image:url(spritesmith.png);background-position:-1887px -1348px;width:43px;height:44px}.Pet_Food_Cake_Skeleton{background-image:url(spritesmith.png);background-position:-2736px -1488px;width:42px;height:47px}.Pet_Food_Cake_White{background-image:url(spritesmith.png);background-position:-1887px -1392px;width:44px;height:44px}.Pet_Food_Cake_Zombie{background-image:url(spritesmith.png);background-position:-1887px -1436px;width:45px;height:44px}.Pet_Food_Chocolate{background-image:url(spritesmith.png);background-position:-1887px -909px;width:48px;height:51px}.Pet_Food_CottonCandyBlue{background-image:url(spritesmith.png);background-position:-1887px -858px;width:48px;height:51px}.Pet_Food_CottonCandyPink{background-image:url(spritesmith.png);background-position:-1887px -807px;width:48px;height:51px}.Pet_Food_Fish{background-image:url(spritesmith.png);background-position:-1887px -756px;width:48px;height:51px}.Pet_Food_Honey{background-image:url(spritesmith.png);background-position:-1887px -705px;width:48px;height:51px}.Pet_Food_Meat{background-image:url(spritesmith.png);background-position:-1887px -654px;width:48px;height:51px}.Pet_Food_Milk{background-image:url(spritesmith.png);background-position:-1887px -603px;width:48px;height:51px}.Pet_Food_Potatoe{background-image:url(spritesmith.png);background-position:-1887px -552px;width:48px;height:51px}.Pet_Food_RottenMeat{background-image:url(spritesmith.png);background-position:-1887px -501px;width:48px;height:51px}.Pet_Food_Saddle{background-image:url(spritesmith.png);background-position:-1887px -450px;width:48px;height:51px}.Pet_Food_Strawberry{background-image:url(spritesmith.png);background-position:-2688px -2457px;width:48px;height:51px}.Pet_HatchingPotion_Base{background-image:url(spritesmith.png);background-position:-2688px -2406px;width:48px;height:51px}.Pet_HatchingPotion_CottonCandyBlue{background-image:url(spritesmith.png);background-position:-2688px -2355px;width:48px;height:51px}.Pet_HatchingPotion_CottonCandyPink{background-image:url(spritesmith.png);background-position:-2688px -2304px;width:48px;height:51px}.Pet_HatchingPotion_Desert{background-image:url(spritesmith.png);background-position:-2688px -2253px;width:48px;height:51px}.Pet_HatchingPotion_Golden{background-image:url(spritesmith.png);background-position:-2688px -2202px;width:48px;height:51px}.Pet_HatchingPotion_Red{background-image:url(spritesmith.png);background-position:-2688px -2151px;width:48px;height:51px}.Pet_HatchingPotion_Shade{background-image:url(spritesmith.png);background-position:-2688px -2100px;width:48px;height:51px}.Pet_HatchingPotion_Skeleton{background-image:url(spritesmith.png);background-position:-2688px -2049px;width:48px;height:51px}.Pet_HatchingPotion_White{background-image:url(spritesmith.png);background-position:-2688px -1998px;width:48px;height:51px}.Pet_HatchingPotion_Zombie{background-image:url(spritesmith.png);background-position:-2688px -1947px;width:48px;height:51px}.inventory_present{background-image:url(spritesmith.png);background-position:-2688px -1896px;width:48px;height:51px}.inventory_quest_scroll{background-image:url(spritesmith.png);background-position:-2688px -1845px;width:48px;height:51px}.inventory_special_fortify{background-image:url(spritesmith.png);background-position:-2688px -1794px;width:48px;height:51px}.inventory_special_snowball{background-image:url(spritesmith.png);background-position:-2688px -1743px;width:48px;height:51px}.inventory_special_valentine{background-image:url(spritesmith.png);background-position:-2736px -1743px;width:40px;height:40px}.rebirth_orb{background-image:url(spritesmith.png);background-position:-2688px -1692px;width:48px;height:51px}.GrimReaper{background-image:url(spritesmith.png);background-position:-2688px -1422px;width:57px;height:66px}.PixelPaw-Gold{background-image:url(spritesmith.png);background-position:-2688px -1590px;width:51px;height:51px}.PixelPaw{background-image:url(spritesmith.png);background-position:-2688px -1539px;width:51px;height:51px}.PixelPaw002{background-image:url(spritesmith.png);background-position:-1887px -399px;width:51px;height:51px}.snowman{background-image:url(spritesmith.png);background-position:-2058px -1890px;width:90px;height:90px}.Mount_Body_BearCub-Base{background-image:url(spritesmith.png);background-position:-1050px -1317px;width:105px;height:105px}.Mount_Body_BearCub-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-420px -1527px;width:105px;height:105px}.Mount_Body_BearCub-CottonCandyPink{background-image:url(spritesmith.png);background-position:-525px -1527px;width:105px;height:105px}.Mount_Body_BearCub-Desert{background-image:url(spritesmith.png);background-position:-630px -1527px;width:105px;height:105px}.Mount_Body_BearCub-Golden{background-image:url(spritesmith.png);background-position:-735px -1527px;width:105px;height:105px}.Mount_Body_BearCub-Polar{background-image:url(spritesmith.png);background-position:-840px -1527px;width:105px;height:105px}.Mount_Body_BearCub-Red{background-image:url(spritesmith.png);background-position:-945px -1527px;width:105px;height:105px}.Mount_Body_BearCub-Shade{background-image:url(spritesmith.png);background-position:-219px -354px;width:105px;height:105px}.Mount_Body_BearCub-Skeleton{background-image:url(spritesmith.png);background-position:-324px -354px;width:105px;height:105px}.Mount_Body_BearCub-White{background-image:url(spritesmith.png);background-position:-429px -354px;width:105px;height:105px}.Mount_Body_BearCub-Zombie{background-image:url(spritesmith.png);background-position:0 -477px;width:105px;height:105px}.Mount_Body_Cactus-Base{background-image:url(spritesmith.png);background-position:-105px -477px;width:105px;height:105px}.Mount_Body_Cactus-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-210px -477px;width:105px;height:105px}.Mount_Body_Cactus-CottonCandyPink{background-image:url(spritesmith.png);background-position:-315px -477px;width:105px;height:105px}.Mount_Body_Cactus-Desert{background-image:url(spritesmith.png);background-position:-420px -477px;width:105px;height:105px}.Mount_Body_Cactus-Golden{background-image:url(spritesmith.png);background-position:-594px 0;width:105px;height:105px}.Mount_Body_Cactus-Red{background-image:url(spritesmith.png);background-position:-594px -105px;width:105px;height:105px}.Mount_Body_Cactus-Shade{background-image:url(spritesmith.png);background-position:-594px -210px;width:105px;height:105px}.Mount_Body_Cactus-Skeleton{background-image:url(spritesmith.png);background-position:-594px -315px;width:105px;height:105px}.Mount_Body_Cactus-White{background-image:url(spritesmith.png);background-position:-594px -420px;width:105px;height:105px}.Mount_Body_Cactus-Zombie{background-image:url(spritesmith.png);background-position:0 -582px;width:105px;height:105px}.Mount_Body_Dragon-Base{background-image:url(spritesmith.png);background-position:-105px -582px;width:105px;height:105px}.Mount_Body_Dragon-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-210px -582px;width:105px;height:105px}.Mount_Body_Dragon-CottonCandyPink{background-image:url(spritesmith.png);background-position:-315px -582px;width:105px;height:105px}.Mount_Body_Dragon-Desert{background-image:url(spritesmith.png);background-position:-420px -582px;width:105px;height:105px}.Mount_Body_Dragon-Golden{background-image:url(spritesmith.png);background-position:-525px -582px;width:105px;height:105px}.Mount_Body_Dragon-Red{background-image:url(spritesmith.png);background-position:-699px 0;width:105px;height:105px}.Mount_Body_Dragon-Shade{background-image:url(spritesmith.png);background-position:-699px -105px;width:105px;height:105px}.Mount_Body_Dragon-Skeleton{background-image:url(spritesmith.png);background-position:-699px -210px;width:105px;height:105px}.Mount_Body_Dragon-White{background-image:url(spritesmith.png);background-position:-699px -315px;width:105px;height:105px}.Mount_Body_Dragon-Zombie{background-image:url(spritesmith.png);background-position:-699px -420px;width:105px;height:105px}.Mount_Body_FlyingPig-Base{background-image:url(spritesmith.png);background-position:-699px -525px;width:105px;height:105px}.Mount_Body_FlyingPig-CottonCandyBlue{background-image:url(spritesmith.png);background-position:0 -687px;width:105px;height:105px}.Mount_Body_FlyingPig-CottonCandyPink{background-image:url(spritesmith.png);background-position:-105px -687px;width:105px;height:105px}.Mount_Body_FlyingPig-Desert{background-image:url(spritesmith.png);background-position:-210px -687px;width:105px;height:105px}.Mount_Body_FlyingPig-Golden{background-image:url(spritesmith.png);background-position:-315px -687px;width:105px;height:105px}.Mount_Body_FlyingPig-Red{background-image:url(spritesmith.png);background-position:-420px -687px;width:105px;height:105px}.Mount_Body_FlyingPig-Shade{background-image:url(spritesmith.png);background-position:-525px -687px;width:105px;height:105px}.Mount_Body_FlyingPig-Skeleton{background-image:url(spritesmith.png);background-position:-630px -687px;width:105px;height:105px}.Mount_Body_FlyingPig-White{background-image:url(spritesmith.png);background-position:-804px 0;width:105px;height:105px}.Mount_Body_FlyingPig-Zombie{background-image:url(spritesmith.png);background-position:-804px -105px;width:105px;height:105px}.Mount_Body_Fox-Base{background-image:url(spritesmith.png);background-position:-804px -210px;width:105px;height:105px}.Mount_Body_Fox-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-804px -315px;width:105px;height:105px}.Mount_Body_Fox-CottonCandyPink{background-image:url(spritesmith.png);background-position:-804px -420px;width:105px;height:105px}.Mount_Body_Fox-Desert{background-image:url(spritesmith.png);background-position:-804px -525px;width:105px;height:105px}.Mount_Body_Fox-Golden{background-image:url(spritesmith.png);background-position:-804px -630px;width:105px;height:105px}.Mount_Body_Fox-Red{background-image:url(spritesmith.png);background-position:0 -792px;width:105px;height:105px}.Mount_Body_Fox-Shade{background-image:url(spritesmith.png);background-position:-105px -792px;width:105px;height:105px}.Mount_Body_Fox-Skeleton{background-image:url(spritesmith.png);background-position:-210px -792px;width:105px;height:105px}.Mount_Body_Fox-White{background-image:url(spritesmith.png);background-position:-315px -792px;width:105px;height:105px}.Mount_Body_Fox-Zombie{background-image:url(spritesmith.png);background-position:-420px -792px;width:105px;height:105px}.Mount_Body_Gryphon-Base{background-image:url(spritesmith.png);background-position:-525px -792px;width:105px;height:105px}.Mount_Body_Gryphon-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-630px -792px;width:105px;height:105px}.Mount_Body_Gryphon-CottonCandyPink{background-image:url(spritesmith.png);background-position:-735px -792px;width:105px;height:105px}.Mount_Body_Gryphon-Desert{background-image:url(spritesmith.png);background-position:-909px 0;width:105px;height:105px}.Mount_Body_Gryphon-Golden{background-image:url(spritesmith.png);background-position:-909px -105px;width:105px;height:105px}.Mount_Body_Gryphon-Red{background-image:url(spritesmith.png);background-position:-909px -210px;width:105px;height:105px}.Mount_Body_Gryphon-Shade{background-image:url(spritesmith.png);background-position:-909px -315px;width:105px;height:105px}.Mount_Body_Gryphon-Skeleton{background-image:url(spritesmith.png);background-position:-909px -420px;width:105px;height:105px}.Mount_Body_Gryphon-White{background-image:url(spritesmith.png);background-position:-909px -525px;width:105px;height:105px}.Mount_Body_Gryphon-Zombie{background-image:url(spritesmith.png);background-position:-909px -630px;width:105px;height:105px}.Mount_Body_LionCub-Base{background-image:url(spritesmith.png);background-position:-909px -735px;width:105px;height:105px}.Mount_Body_LionCub-CottonCandyBlue{background-image:url(spritesmith.png);background-position:0 -897px;width:105px;height:105px}.Mount_Body_LionCub-CottonCandyPink{background-image:url(spritesmith.png);background-position:-105px -897px;width:105px;height:105px}.Mount_Body_LionCub-Desert{background-image:url(spritesmith.png);background-position:-210px -897px;width:105px;height:105px}.Mount_Body_LionCub-Ethereal{background-image:url(spritesmith.png);background-position:-315px -897px;width:105px;height:105px}.Mount_Body_LionCub-Golden{background-image:url(spritesmith.png);background-position:-420px -897px;width:105px;height:105px}.Mount_Body_LionCub-Red{background-image:url(spritesmith.png);background-position:-525px -897px;width:105px;height:105px}.Mount_Body_LionCub-Shade{background-image:url(spritesmith.png);background-position:-630px -897px;width:105px;height:105px}.Mount_Body_LionCub-Skeleton{background-image:url(spritesmith.png);background-position:-735px -897px;width:105px;height:105px}.Mount_Body_LionCub-White{background-image:url(spritesmith.png);background-position:-840px -897px;width:105px;height:105px}.Mount_Body_LionCub-Zombie{background-image:url(spritesmith.png);background-position:-1014px 0;width:105px;height:105px}.Mount_Body_PandaCub-Base{background-image:url(spritesmith.png);background-position:-1014px -105px;width:105px;height:105px}.Mount_Body_PandaCub-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-1014px -210px;width:105px;height:105px}.Mount_Body_PandaCub-CottonCandyPink{background-image:url(spritesmith.png);background-position:-1014px -315px;width:105px;height:105px}.Mount_Body_PandaCub-Desert{background-image:url(spritesmith.png);background-position:-1014px -420px;width:105px;height:105px}.Mount_Body_PandaCub-Golden{background-image:url(spritesmith.png);background-position:-1014px -525px;width:105px;height:105px}.Mount_Body_PandaCub-Red{background-image:url(spritesmith.png);background-position:-1014px -630px;width:105px;height:105px}.Mount_Body_PandaCub-Shade{background-image:url(spritesmith.png);background-position:-1014px -735px;width:105px;height:105px}.Mount_Body_PandaCub-Skeleton{background-image:url(spritesmith.png);background-position:-315px -1527px;width:105px;height:105px}.Mount_Body_PandaCub-White{background-image:url(spritesmith.png);background-position:-1014px -840px;width:105px;height:105px}.Mount_Body_PandaCub-Zombie{background-image:url(spritesmith.png);background-position:0 -1002px;width:105px;height:105px}.Mount_Body_TigerCub-Base{background-image:url(spritesmith.png);background-position:-105px -1002px;width:105px;height:105px}.Mount_Body_TigerCub-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-210px -1002px;width:105px;height:105px}.Mount_Body_TigerCub-CottonCandyPink{background-image:url(spritesmith.png);background-position:-315px -1002px;width:105px;height:105px}.Mount_Body_TigerCub-Desert{background-image:url(spritesmith.png);background-position:-420px -1002px;width:105px;height:105px}.Mount_Body_TigerCub-Golden{background-image:url(spritesmith.png);background-position:-525px -1002px;width:105px;height:105px}.Mount_Body_TigerCub-Red{background-image:url(spritesmith.png);background-position:-630px -1002px;width:105px;height:105px}.Mount_Body_TigerCub-Shade{background-image:url(spritesmith.png);background-position:-735px -1002px;width:105px;height:105px}.Mount_Body_TigerCub-Skeleton{background-image:url(spritesmith.png);background-position:-840px -1002px;width:105px;height:105px}.Mount_Body_TigerCub-White{background-image:url(spritesmith.png);background-position:-945px -1002px;width:105px;height:105px}.Mount_Body_TigerCub-Zombie{background-image:url(spritesmith.png);background-position:-1119px 0;width:105px;height:105px}.Mount_Body_Wolf-Base{background-image:url(spritesmith.png);background-position:-1119px -105px;width:105px;height:105px}.Mount_Body_Wolf-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-1119px -210px;width:105px;height:105px}.Mount_Body_Wolf-CottonCandyPink{background-image:url(spritesmith.png);background-position:-1119px -315px;width:105px;height:105px}.Mount_Body_Wolf-Desert{background-image:url(spritesmith.png);background-position:-1119px -420px;width:105px;height:105px}.Mount_Body_Wolf-Golden{background-image:url(spritesmith.png);background-position:-1119px -525px;width:105px;height:105px}.Mount_Body_Wolf-Red{background-image:url(spritesmith.png);background-position:-1119px -630px;width:105px;height:105px}.Mount_Body_Wolf-Shade{background-image:url(spritesmith.png);background-position:-1119px -735px;width:105px;height:105px}.Mount_Body_Wolf-Skeleton{background-image:url(spritesmith.png);background-position:-1119px -840px;width:105px;height:105px}.Mount_Body_Wolf-White{background-image:url(spritesmith.png);background-position:-1119px -945px;width:105px;height:105px}.Mount_Body_Wolf-Zombie{background-image:url(spritesmith.png);background-position:0 -1107px;width:105px;height:105px}.Mount_Head_BearCub-Base{background-image:url(spritesmith.png);background-position:-105px -1107px;width:105px;height:105px}.Mount_Head_BearCub-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-210px -1107px;width:105px;height:105px}.Mount_Head_BearCub-CottonCandyPink{background-image:url(spritesmith.png);background-position:-315px -1107px;width:105px;height:105px}.Mount_Head_BearCub-Desert{background-image:url(spritesmith.png);background-position:-420px -1107px;width:105px;height:105px}.Mount_Head_BearCub-Golden{background-image:url(spritesmith.png);background-position:-525px -1107px;width:105px;height:105px}.Mount_Head_BearCub-Polar{background-image:url(spritesmith.png);background-position:-630px -1107px;width:105px;height:105px}.Mount_Head_BearCub-Red{background-image:url(spritesmith.png);background-position:-735px -1107px;width:105px;height:105px}.Mount_Head_BearCub-Shade{background-image:url(spritesmith.png);background-position:-840px -1107px;width:105px;height:105px}.Mount_Head_BearCub-Skeleton{background-image:url(spritesmith.png);background-position:-945px -1107px;width:105px;height:105px}.Mount_Head_BearCub-White{background-image:url(spritesmith.png);background-position:-1050px -1107px;width:105px;height:105px}.Mount_Head_BearCub-Zombie{background-image:url(spritesmith.png);background-position:-1224px 0;width:105px;height:105px}.Mount_Head_Cactus-Base{background-image:url(spritesmith.png);background-position:-1224px -105px;width:105px;height:105px}.Mount_Head_Cactus-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-1224px -210px;width:105px;height:105px}.Mount_Head_Cactus-CottonCandyPink{background-image:url(spritesmith.png);background-position:-1224px -315px;width:105px;height:105px}.Mount_Head_Cactus-Desert{background-image:url(spritesmith.png);background-position:-1224px -420px;width:105px;height:105px}.Mount_Head_Cactus-Golden{background-image:url(spritesmith.png);background-position:-1224px -525px;width:105px;height:105px}.Mount_Head_Cactus-Red{background-image:url(spritesmith.png);background-position:-1224px -630px;width:105px;height:105px}.Mount_Head_Cactus-Shade{background-image:url(spritesmith.png);background-position:-1224px -735px;width:105px;height:105px}.Mount_Head_Cactus-Skeleton{background-image:url(spritesmith.png);background-position:-1224px -840px;width:105px;height:105px}.Mount_Head_Cactus-White{background-image:url(spritesmith.png);background-position:-1224px -945px;width:105px;height:105px}.Mount_Head_Cactus-Zombie{background-image:url(spritesmith.png);background-position:-1224px -1050px;width:105px;height:105px}.Mount_Head_Dragon-Base{background-image:url(spritesmith.png);background-position:0 -1212px;width:105px;height:105px}.Mount_Head_Dragon-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-105px -1212px;width:105px;height:105px}.Mount_Head_Dragon-CottonCandyPink{background-image:url(spritesmith.png);background-position:-210px -1212px;width:105px;height:105px}.Mount_Head_Dragon-Desert{background-image:url(spritesmith.png);background-position:-315px -1212px;width:105px;height:105px}.Mount_Head_Dragon-Golden{background-image:url(spritesmith.png);background-position:-420px -1212px;width:105px;height:105px}.Mount_Head_Dragon-Red{background-image:url(spritesmith.png);background-position:-525px -1212px;width:105px;height:105px}.Mount_Head_Dragon-Shade{background-image:url(spritesmith.png);background-position:-630px -1212px;width:105px;height:105px}.Mount_Head_Dragon-Skeleton{background-image:url(spritesmith.png);background-position:-735px -1212px;width:105px;height:105px}.Mount_Head_Dragon-White{background-image:url(spritesmith.png);background-position:-840px -1212px;width:105px;height:105px}.Mount_Head_Dragon-Zombie{background-image:url(spritesmith.png);background-position:-945px -1212px;width:105px;height:105px}.Mount_Head_FlyingPig-Base{background-image:url(spritesmith.png);background-position:-1050px -1212px;width:105px;height:105px}.Mount_Head_FlyingPig-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-1155px -1212px;width:105px;height:105px}.Mount_Head_FlyingPig-CottonCandyPink{background-image:url(spritesmith.png);background-position:-1329px 0;width:105px;height:105px}.Mount_Head_FlyingPig-Desert{background-image:url(spritesmith.png);background-position:-1329px -105px;width:105px;height:105px}.Mount_Head_FlyingPig-Golden{background-image:url(spritesmith.png);background-position:-1329px -210px;width:105px;height:105px}.Mount_Head_FlyingPig-Red{background-image:url(spritesmith.png);background-position:-1329px -315px;width:105px;height:105px}.Mount_Head_FlyingPig-Shade{background-image:url(spritesmith.png);background-position:-1329px -420px;width:105px;height:105px}.Mount_Head_FlyingPig-Skeleton{background-image:url(spritesmith.png);background-position:-1329px -525px;width:105px;height:105px}.Mount_Head_FlyingPig-White{background-image:url(spritesmith.png);background-position:-1329px -630px;width:105px;height:105px}.Mount_Head_FlyingPig-Zombie{background-image:url(spritesmith.png);background-position:-1329px -735px;width:105px;height:105px}.Mount_Head_Fox-Base{background-image:url(spritesmith.png);background-position:-1329px -840px;width:105px;height:105px}.Mount_Head_Fox-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-1329px -945px;width:105px;height:105px}.Mount_Head_Fox-CottonCandyPink{background-image:url(spritesmith.png);background-position:-1329px -1050px;width:105px;height:105px}.Mount_Head_Fox-Desert{background-image:url(spritesmith.png);background-position:-1329px -1155px;width:105px;height:105px}.Mount_Head_Fox-Golden{background-image:url(spritesmith.png);background-position:0 -1317px;width:105px;height:105px}.Mount_Head_Fox-Red{background-image:url(spritesmith.png);background-position:-105px -1317px;width:105px;height:105px}.Mount_Head_Fox-Shade{background-image:url(spritesmith.png);background-position:-210px -1317px;width:105px;height:105px}.Mount_Head_Fox-Skeleton{background-image:url(spritesmith.png);background-position:-315px -1317px;width:105px;height:105px}.Mount_Head_Fox-White{background-image:url(spritesmith.png);background-position:-420px -1317px;width:105px;height:105px}.Mount_Head_Fox-Zombie{background-image:url(spritesmith.png);background-position:-525px -1317px;width:105px;height:105px}.Mount_Head_Gryphon-Base{background-image:url(spritesmith.png);background-position:-630px -1317px;width:105px;height:105px}.Mount_Head_Gryphon-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-735px -1317px;width:105px;height:105px}.Mount_Head_Gryphon-CottonCandyPink{background-image:url(spritesmith.png);background-position:-840px -1317px;width:105px;height:105px}.Mount_Head_Gryphon-Desert{background-image:url(spritesmith.png);background-position:-945px -1317px;width:105px;height:105px}.Mount_Head_Gryphon-Golden{background-image:url(spritesmith.png);background-position:-1050px -1527px;width:105px;height:105px}.Mount_Head_Gryphon-Red{background-image:url(spritesmith.png);background-position:-1155px -1317px;width:105px;height:105px}.Mount_Head_Gryphon-Shade{background-image:url(spritesmith.png);background-position:-1260px -1317px;width:105px;height:105px}.Mount_Head_Gryphon-Skeleton{background-image:url(spritesmith.png);background-position:-1434px 0;width:105px;height:105px}.Mount_Head_Gryphon-White{background-image:url(spritesmith.png);background-position:-1434px -105px;width:105px;height:105px}.Mount_Head_Gryphon-Zombie{background-image:url(spritesmith.png);background-position:-1434px -210px;width:105px;height:105px}.Mount_Head_LionCub-Base{background-image:url(spritesmith.png);background-position:-1434px -315px;width:105px;height:105px}.Mount_Head_LionCub-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-1434px -420px;width:105px;height:105px}.Mount_Head_LionCub-CottonCandyPink{background-image:url(spritesmith.png);background-position:-1434px -525px;width:105px;height:105px}.Mount_Head_LionCub-Desert{background-image:url(spritesmith.png);background-position:-1434px -630px;width:105px;height:105px}.Mount_Head_LionCub-Ethereal{background-image:url(spritesmith.png);background-position:-1434px -735px;width:105px;height:105px}.Mount_Head_LionCub-Golden{background-image:url(spritesmith.png);background-position:-1434px -840px;width:105px;height:105px}.Mount_Head_LionCub-Red{background-image:url(spritesmith.png);background-position:-1434px -945px;width:105px;height:105px}.Mount_Head_LionCub-Shade{background-image:url(spritesmith.png);background-position:-1434px -1050px;width:105px;height:105px}.Mount_Head_LionCub-Skeleton{background-image:url(spritesmith.png);background-position:-1434px -1155px;width:105px;height:105px}.Mount_Head_LionCub-White{background-image:url(spritesmith.png);background-position:-1434px -1260px;width:105px;height:105px}.Mount_Head_LionCub-Zombie{background-image:url(spritesmith.png);background-position:0 -1422px;width:105px;height:105px}.Mount_Head_PandaCub-Base{background-image:url(spritesmith.png);background-position:-105px -1422px;width:105px;height:105px}.Mount_Head_PandaCub-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-210px -1422px;width:105px;height:105px}.Mount_Head_PandaCub-CottonCandyPink{background-image:url(spritesmith.png);background-position:-315px -1422px;width:105px;height:105px}.Mount_Head_PandaCub-Desert{background-image:url(spritesmith.png);background-position:-420px -1422px;width:105px;height:105px}.Mount_Head_PandaCub-Golden{background-image:url(spritesmith.png);background-position:-525px -1422px;width:105px;height:105px}.Mount_Head_PandaCub-Red{background-image:url(spritesmith.png);background-position:-630px -1422px;width:105px;height:105px}.Mount_Head_PandaCub-Shade{background-image:url(spritesmith.png);background-position:-735px -1422px;width:105px;height:105px}.Mount_Head_PandaCub-Skeleton{background-image:url(spritesmith.png);background-position:-840px -1422px;width:105px;height:105px}.Mount_Head_PandaCub-White{background-image:url(spritesmith.png);background-position:-945px -1422px;width:105px;height:105px}.Mount_Head_PandaCub-Zombie{background-image:url(spritesmith.png);background-position:-1050px -1422px;width:105px;height:105px}.Mount_Head_TigerCub-Base{background-image:url(spritesmith.png);background-position:-1155px -1422px;width:105px;height:105px}.Mount_Head_TigerCub-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-1260px -1422px;width:105px;height:105px}.Mount_Head_TigerCub-CottonCandyPink{background-image:url(spritesmith.png);background-position:-1365px -1422px;width:105px;height:105px}.Mount_Head_TigerCub-Desert{background-image:url(spritesmith.png);background-position:-1539px 0;width:105px;height:105px}.Mount_Head_TigerCub-Golden{background-image:url(spritesmith.png);background-position:-1539px -105px;width:105px;height:105px}.Mount_Head_TigerCub-Red{background-image:url(spritesmith.png);background-position:-1539px -210px;width:105px;height:105px}.Mount_Head_TigerCub-Shade{background-image:url(spritesmith.png);background-position:-1539px -315px;width:105px;height:105px}.Mount_Head_TigerCub-Skeleton{background-image:url(spritesmith.png);background-position:-1539px -420px;width:105px;height:105px}.Mount_Head_TigerCub-White{background-image:url(spritesmith.png);background-position:-1539px -525px;width:105px;height:105px}.Mount_Head_TigerCub-Zombie{background-image:url(spritesmith.png);background-position:-1539px -630px;width:105px;height:105px}.Mount_Head_Wolf-Base{background-image:url(spritesmith.png);background-position:-1539px -735px;width:105px;height:105px}.Mount_Head_Wolf-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-1539px -840px;width:105px;height:105px}.Mount_Head_Wolf-CottonCandyPink{background-image:url(spritesmith.png);background-position:-1539px -945px;width:105px;height:105px}.Mount_Head_Wolf-Desert{background-image:url(spritesmith.png);background-position:-1539px -1050px;width:105px;height:105px}.Mount_Head_Wolf-Golden{background-image:url(spritesmith.png);background-position:-1539px -1155px;width:105px;height:105px}.Mount_Head_Wolf-Red{background-image:url(spritesmith.png);background-position:-1539px -1260px;width:105px;height:105px}.Mount_Head_Wolf-Shade{background-image:url(spritesmith.png);background-position:-1539px -1365px;width:105px;height:105px}.Mount_Head_Wolf-Skeleton{background-image:url(spritesmith.png);background-position:0 -1527px;width:105px;height:105px}.Mount_Head_Wolf-White{background-image:url(spritesmith.png);background-position:-105px -1527px;width:105px;height:105px}.Mount_Head_Wolf-Zombie{background-image:url(spritesmith.png);background-position:-210px -1527px;width:105px;height:105px}.npc_alex{background-image:url(spritesmith.png);background-position:-432px 0;width:162px;height:138px}.npc_bailey{background-image:url(spritesmith.png);background-position:-2688px -1350px;width:60px;height:72px}.npc_daniel{background-image:url(spritesmith.png);background-position:0 -354px;width:135px;height:123px}.npc_justin{background-image:url(spritesmith.png);background-position:-135px -354px;width:84px;height:120px}.npc_matt{background-image:url(spritesmith.png);background-position:-216px -177px;width:198px;height:144px}.npc_tyler{background-image:url(spritesmith.png);background-position:-1170px -2370px;width:90px;height:90px}.Pet-BearCub-Base{background-image:url(spritesmith.png);background-position:-1887px -99px;width:81px;height:99px}.Pet-BearCub-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-1887px 0;width:81px;height:99px}.Pet-BearCub-CottonCandyPink{background-image:url(spritesmith.png);background-position:-1782px -1731px;width:81px;height:99px}.Pet-BearCub-Desert{background-image:url(spritesmith.png);background-position:-1155px -1527px;width:81px;height:99px}.Pet-BearCub-Golden{background-image:url(spritesmith.png);background-position:-1053px -1632px;width:81px;height:99px}.Pet-BearCub-Polar{background-image:url(spritesmith.png);background-position:-1236px -1527px;width:81px;height:99px}.Pet-BearCub-Red{background-image:url(spritesmith.png);background-position:-1317px -1527px;width:81px;height:99px}.Pet-BearCub-Shade{background-image:url(spritesmith.png);background-position:-1398px -1527px;width:81px;height:99px}.Pet-BearCub-Skeleton{background-image:url(spritesmith.png);background-position:-1479px -1527px;width:81px;height:99px}.Pet-BearCub-White{background-image:url(spritesmith.png);background-position:-1560px -1527px;width:81px;height:99px}.Pet-BearCub-Zombie{background-image:url(spritesmith.png);background-position:-1644px 0;width:81px;height:99px}.Pet-Cactus-Base{background-image:url(spritesmith.png);background-position:-1644px -99px;width:81px;height:99px}.Pet-Cactus-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-1644px -198px;width:81px;height:99px}.Pet-Cactus-CottonCandyPink{background-image:url(spritesmith.png);background-position:-1644px -297px;width:81px;height:99px}.Pet-Cactus-Desert{background-image:url(spritesmith.png);background-position:-1644px -396px;width:81px;height:99px}.Pet-Cactus-Golden{background-image:url(spritesmith.png);background-position:-1644px -495px;width:81px;height:99px}.Pet-Cactus-Red{background-image:url(spritesmith.png);background-position:-1644px -594px;width:81px;height:99px}.Pet-Cactus-Shade{background-image:url(spritesmith.png);background-position:-1644px -693px;width:81px;height:99px}.Pet-Cactus-Skeleton{background-image:url(spritesmith.png);background-position:-1644px -792px;width:81px;height:99px}.Pet-Cactus-White{background-image:url(spritesmith.png);background-position:-1644px -891px;width:81px;height:99px}.Pet-Cactus-Zombie{background-image:url(spritesmith.png);background-position:-1644px -990px;width:81px;height:99px}.Pet-Dragon-Base{background-image:url(spritesmith.png);background-position:-1644px -1089px;width:81px;height:99px}.Pet-Dragon-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-1644px -1188px;width:81px;height:99px}.Pet-Dragon-CottonCandyPink{background-image:url(spritesmith.png);background-position:-1644px -1287px;width:81px;height:99px}.Pet-Dragon-Desert{background-image:url(spritesmith.png);background-position:-1644px -1386px;width:81px;height:99px}.Pet-Dragon-Golden{background-image:url(spritesmith.png);background-position:-1644px -1485px;width:81px;height:99px}.Pet-Dragon-Hydra{background-image:url(spritesmith.png);background-position:-432px -269px;width:114px;height:84px}.Pet-Dragon-Red{background-image:url(spritesmith.png);background-position:-1725px 0;width:81px;height:99px}.Pet-Dragon-Shade{background-image:url(spritesmith.png);background-position:-1725px -99px;width:81px;height:99px}.Pet-Dragon-Skeleton{background-image:url(spritesmith.png);background-position:-1725px -198px;width:81px;height:99px}.Pet-Dragon-White{background-image:url(spritesmith.png);background-position:-1725px -297px;width:81px;height:99px}.Pet-Dragon-Zombie{background-image:url(spritesmith.png);background-position:-1725px -396px;width:81px;height:99px}.Pet-FlyingPig-Base{background-image:url(spritesmith.png);background-position:-1725px -495px;width:81px;height:99px}.Pet-FlyingPig-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-1725px -594px;width:81px;height:99px}.Pet-FlyingPig-CottonCandyPink{background-image:url(spritesmith.png);background-position:-1725px -693px;width:81px;height:99px}.Pet-FlyingPig-Desert{background-image:url(spritesmith.png);background-position:-1725px -792px;width:81px;height:99px}.Pet-FlyingPig-Golden{background-image:url(spritesmith.png);background-position:-1725px -891px;width:81px;height:99px}.Pet-FlyingPig-Red{background-image:url(spritesmith.png);background-position:-1725px -990px;width:81px;height:99px}.Pet-FlyingPig-Shade{background-image:url(spritesmith.png);background-position:-1725px -1089px;width:81px;height:99px}.Pet-FlyingPig-Skeleton{background-image:url(spritesmith.png);background-position:-1725px -1188px;width:81px;height:99px}.Pet-FlyingPig-White{background-image:url(spritesmith.png);background-position:-1725px -1287px;width:81px;height:99px}.Pet-FlyingPig-Zombie{background-image:url(spritesmith.png);background-position:-1725px -1386px;width:81px;height:99px}.Pet-Fox-Base{background-image:url(spritesmith.png);background-position:-1725px -1485px;width:81px;height:99px}.Pet-Fox-CottonCandyBlue{background-image:url(spritesmith.png);background-position:0 -1632px;width:81px;height:99px}.Pet-Fox-CottonCandyPink{background-image:url(spritesmith.png);background-position:-81px -1632px;width:81px;height:99px}.Pet-Fox-Desert{background-image:url(spritesmith.png);background-position:-162px -1632px;width:81px;height:99px}.Pet-Fox-Golden{background-image:url(spritesmith.png);background-position:-243px -1632px;width:81px;height:99px}.Pet-Fox-Red{background-image:url(spritesmith.png);background-position:-324px -1632px;width:81px;height:99px}.Pet-Fox-Shade{background-image:url(spritesmith.png);background-position:-405px -1632px;width:81px;height:99px}.Pet-Fox-Skeleton{background-image:url(spritesmith.png);background-position:-486px -1632px;width:81px;height:99px}.Pet-Fox-White{background-image:url(spritesmith.png);background-position:-567px -1632px;width:81px;height:99px}.Pet-Fox-Zombie{background-image:url(spritesmith.png);background-position:-648px -1632px;width:81px;height:99px}.Pet-Gryphon-Base{background-image:url(spritesmith.png);background-position:-729px -1632px;width:81px;height:99px}.Pet-Gryphon-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-810px -1632px;width:81px;height:99px}.Pet-Gryphon-CottonCandyPink{background-image:url(spritesmith.png);background-position:-891px -1632px;width:81px;height:99px}.Pet-Gryphon-Desert{background-image:url(spritesmith.png);background-position:-972px -1632px;width:81px;height:99px}.Pet-Gryphon-Golden{background-image:url(spritesmith.png);background-position:-1887px -198px;width:81px;height:99px}.Pet-Gryphon-Red{background-image:url(spritesmith.png);background-position:-1134px -1632px;width:81px;height:99px}.Pet-Gryphon-Shade{background-image:url(spritesmith.png);background-position:-1215px -1632px;width:81px;height:99px}.Pet-Gryphon-Skeleton{background-image:url(spritesmith.png);background-position:-1296px -1632px;width:81px;height:99px}.Pet-Gryphon-White{background-image:url(spritesmith.png);background-position:-1377px -1632px;width:81px;height:99px}.Pet-Gryphon-Zombie{background-image:url(spritesmith.png);background-position:-1458px -1632px;width:81px;height:99px}.Pet-LionCub-Base{background-image:url(spritesmith.png);background-position:-1539px -1632px;width:81px;height:99px}.Pet-LionCub-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-1620px -1632px;width:81px;height:99px}.Pet-LionCub-CottonCandyPink{background-image:url(spritesmith.png);background-position:-1701px -1632px;width:81px;height:99px}.Pet-LionCub-Desert{background-image:url(spritesmith.png);background-position:-1806px 0;width:81px;height:99px}.Pet-LionCub-Golden{background-image:url(spritesmith.png);background-position:-1806px -99px;width:81px;height:99px}.Pet-LionCub-Red{background-image:url(spritesmith.png);background-position:-1806px -198px;width:81px;height:99px}.Pet-LionCub-Shade{background-image:url(spritesmith.png);background-position:-1806px -297px;width:81px;height:99px}.Pet-LionCub-Skeleton{background-image:url(spritesmith.png);background-position:-1806px -396px;width:81px;height:99px}.Pet-LionCub-White{background-image:url(spritesmith.png);background-position:-1806px -495px;width:81px;height:99px}.Pet-LionCub-Zombie{background-image:url(spritesmith.png);background-position:-1806px -594px;width:81px;height:99px}.Pet-PandaCub-Base{background-image:url(spritesmith.png);background-position:-1806px -693px;width:81px;height:99px}.Pet-PandaCub-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-1806px -792px;width:81px;height:99px}.Pet-PandaCub-CottonCandyPink{background-image:url(spritesmith.png);background-position:-1806px -891px;width:81px;height:99px}.Pet-PandaCub-Desert{background-image:url(spritesmith.png);background-position:-1806px -990px;width:81px;height:99px}.Pet-PandaCub-Golden{background-image:url(spritesmith.png);background-position:-1806px -1089px;width:81px;height:99px}.Pet-PandaCub-Red{background-image:url(spritesmith.png);background-position:-1806px -1188px;width:81px;height:99px}.Pet-PandaCub-Shade{background-image:url(spritesmith.png);background-position:-1806px -1287px;width:81px;height:99px}.Pet-PandaCub-Skeleton{background-image:url(spritesmith.png);background-position:-1806px -1386px;width:81px;height:99px}.Pet-PandaCub-White{background-image:url(spritesmith.png);background-position:-1806px -1485px;width:81px;height:99px}.Pet-PandaCub-Zombie{background-image:url(spritesmith.png);background-position:-1806px -1584px;width:81px;height:99px}.Pet-TigerCub-Base{background-image:url(spritesmith.png);background-position:0 -1731px;width:81px;height:99px}.Pet-TigerCub-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-81px -1731px;width:81px;height:99px}.Pet-TigerCub-CottonCandyPink{background-image:url(spritesmith.png);background-position:-162px -1731px;width:81px;height:99px}.Pet-TigerCub-Desert{background-image:url(spritesmith.png);background-position:-243px -1731px;width:81px;height:99px}.Pet-TigerCub-Golden{background-image:url(spritesmith.png);background-position:-324px -1731px;width:81px;height:99px}.Pet-TigerCub-Red{background-image:url(spritesmith.png);background-position:-405px -1731px;width:81px;height:99px}.Pet-TigerCub-Shade{background-image:url(spritesmith.png);background-position:-486px -1731px;width:81px;height:99px}.Pet-TigerCub-Skeleton{background-image:url(spritesmith.png);background-position:-567px -1731px;width:81px;height:99px}.Pet-TigerCub-White{background-image:url(spritesmith.png);background-position:-648px -1731px;width:81px;height:99px}.Pet-TigerCub-Zombie{background-image:url(spritesmith.png);background-position:-729px -1731px;width:81px;height:99px}.Pet-Turkey-Base{background-image:url(spritesmith.png);background-position:-810px -1731px;width:81px;height:99px}.Pet-Wolf-Base{background-image:url(spritesmith.png);background-position:-891px -1731px;width:81px;height:99px}.Pet-Wolf-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-972px -1731px;width:81px;height:99px}.Pet-Wolf-CottonCandyPink{background-image:url(spritesmith.png);background-position:-1053px -1731px;width:81px;height:99px}.Pet-Wolf-Desert{background-image:url(spritesmith.png);background-position:-1134px -1731px;width:81px;height:99px}.Pet-Wolf-Golden{background-image:url(spritesmith.png);background-position:-1215px -1731px;width:81px;height:99px}.Pet-Wolf-Red{background-image:url(spritesmith.png);background-position:-1296px -1731px;width:81px;height:99px}.Pet-Wolf-Shade{background-image:url(spritesmith.png);background-position:-1377px -1731px;width:81px;height:99px}.Pet-Wolf-Skeleton{background-image:url(spritesmith.png);background-position:-1458px -1731px;width:81px;height:99px}.Pet-Wolf-Veteran{background-image:url(spritesmith.png);background-position:-1539px -1731px;width:81px;height:99px}.Pet-Wolf-White{background-image:url(spritesmith.png);background-position:-1620px -1731px;width:81px;height:99px}.Pet-Wolf-Zombie{background-image:url(spritesmith.png);background-position:-1701px -1731px;width:81px;height:99px}.quest_evilsanta{background-image:url(spritesmith.png);background-position:-432px -138px;width:118px;height:131px}.quest_gryphon{background-image:url(spritesmith.png);background-position:0 -177px;width:216px;height:177px}.quest_vice1{background-image:url(spritesmith.png);background-position:-216px 0;width:216px;height:177px}.quest_vice2_lightCrystal{background-image:url(spritesmith.png);background-position:-2736px -1845px;width:40px;height:40px}.quest_vice3{background-image:url(spritesmith.png);background-position:0 0;width:216px;height:177px}.shield_healer_1{background-image:url(spritesmith.png);background-position:-1170px -2550px;width:90px;height:90px}.shield_healer_2{background-image:url(spritesmith.png);background-position:-1260px -2550px;width:90px;height:90px}.shield_healer_3{background-image:url(spritesmith.png);background-position:-1350px -2550px;width:90px;height:90px}.shield_healer_4{background-image:url(spritesmith.png);background-position:-1440px -2550px;width:90px;height:90px}.shield_healer_5{background-image:url(spritesmith.png);background-position:-1530px -2550px;width:90px;height:90px}.shield_rogue_0{background-image:url(spritesmith.png);background-position:-1620px -2550px;width:90px;height:90px}.shield_rogue_1{background-image:url(spritesmith.png);background-position:-1710px -2550px;width:103px;height:90px}.shield_rogue_2{background-image:url(spritesmith.png);background-position:-1813px -2550px;width:103px;height:90px}.shield_rogue_3{background-image:url(spritesmith.png);background-position:-1916px -2550px;width:114px;height:90px}.shield_rogue_4{background-image:url(spritesmith.png);background-position:-2030px -2550px;width:100px;height:90px}.shield_rogue_5{background-image:url(spritesmith.png);background-position:-2130px -2550px;width:114px;height:90px}.shield_rogue_6{background-image:url(spritesmith.png);background-position:-2244px -2550px;width:114px;height:90px}.shield_special_1{background-image:url(spritesmith.png);background-position:-2358px -2550px;width:90px;height:90px}.shield_special_ski{background-image:url(spritesmith.png);background-position:-2448px -2550px;width:104px;height:90px}.shield_special_snowflake{background-image:url(spritesmith.png);background-position:-2552px -2550px;width:90px;height:90px}.shield_special_yeti{background-image:url(spritesmith.png);background-position:-2688px 0;width:90px;height:90px}.shield_warrior_1{background-image:url(spritesmith.png);background-position:-2688px -90px;width:90px;height:90px}.shield_warrior_2{background-image:url(spritesmith.png);background-position:-2688px -180px;width:90px;height:90px}.shield_warrior_3{background-image:url(spritesmith.png);background-position:-2688px -270px;width:90px;height:90px}.shield_warrior_4{background-image:url(spritesmith.png);background-position:-2688px -360px;width:90px;height:90px}.shield_warrior_5{background-image:url(spritesmith.png);background-position:-2688px -450px;width:90px;height:90px}.broad_shirt_black{background-image:url(spritesmith.png);background-position:-2688px -540px;width:90px;height:90px}.broad_shirt_blue{background-image:url(spritesmith.png);background-position:-2688px -630px;width:90px;height:90px}.broad_shirt_convict{background-image:url(spritesmith.png);background-position:-2688px -720px;width:90px;height:90px}.broad_shirt_cross{background-image:url(spritesmith.png);background-position:-2688px -810px;width:90px;height:90px}.broad_shirt_fire{background-image:url(spritesmith.png);background-position:-2688px -900px;width:90px;height:90px}.broad_shirt_green{background-image:url(spritesmith.png);background-position:-2688px -990px;width:90px;height:90px}.broad_shirt_horizon{background-image:url(spritesmith.png);background-position:-2688px -1080px;width:90px;height:90px}.broad_shirt_ocean{background-image:url(spritesmith.png);background-position:-2688px -1170px;width:90px;height:90px}.broad_shirt_pink{background-image:url(spritesmith.png);background-position:-2688px -1260px;width:90px;height:90px}.broad_shirt_purple{background-image:url(spritesmith.png);background-position:-990px -2550px;width:90px;height:90px}.broad_shirt_rainbow{background-image:url(spritesmith.png);background-position:-2508px -1170px;width:90px;height:90px}.broad_shirt_redblue{background-image:url(spritesmith.png);background-position:-810px -2370px;width:90px;height:90px}.broad_shirt_thunder{background-image:url(spritesmith.png);background-position:-2238px -810px;width:90px;height:90px}.broad_shirt_tropical{background-image:url(spritesmith.png);background-position:-2058px -1800px;width:90px;height:90px}.broad_shirt_white{background-image:url(spritesmith.png);background-position:-2058px -1710px;width:90px;height:90px}.broad_shirt_yellow{background-image:url(spritesmith.png);background-position:-2058px -1620px;width:90px;height:90px}.broad_shirt_zombie{background-image:url(spritesmith.png);background-position:-2058px -1530px;width:90px;height:90px}.slim_shirt_black{background-image:url(spritesmith.png);background-position:-2058px -1440px;width:90px;height:90px}.slim_shirt_blue{background-image:url(spritesmith.png);background-position:-2058px -1350px;width:90px;height:90px}.slim_shirt_convict{background-image:url(spritesmith.png);background-position:-2058px -1260px;width:90px;height:90px}.slim_shirt_cross{background-image:url(spritesmith.png);background-position:-2058px -1170px;width:90px;height:90px}.slim_shirt_fire{background-image:url(spritesmith.png);background-position:-2058px -1080px;width:90px;height:90px}.slim_shirt_green{background-image:url(spritesmith.png);background-position:-2058px -990px;width:90px;height:90px}.slim_shirt_horizon{background-image:url(spritesmith.png);background-position:-2058px -900px;width:90px;height:90px}.slim_shirt_ocean{background-image:url(spritesmith.png);background-position:-2058px -810px;width:90px;height:90px}.slim_shirt_pink{background-image:url(spritesmith.png);background-position:-2058px -720px;width:90px;height:90px}.slim_shirt_purple{background-image:url(spritesmith.png);background-position:-2058px -630px;width:90px;height:90px}.slim_shirt_rainbow{background-image:url(spritesmith.png);background-position:-2058px -540px;width:90px;height:90px}.slim_shirt_redblue{background-image:url(spritesmith.png);background-position:-2058px -450px;width:90px;height:90px}.slim_shirt_thunder{background-image:url(spritesmith.png);background-position:-2058px -360px;width:90px;height:90px}.slim_shirt_tropical{background-image:url(spritesmith.png);background-position:-2058px -270px;width:90px;height:90px}.slim_shirt_white{background-image:url(spritesmith.png);background-position:-2058px -180px;width:90px;height:90px}.slim_shirt_yellow{background-image:url(spritesmith.png);background-position:-2058px -90px;width:90px;height:90px}.slim_shirt_zombie{background-image:url(spritesmith.png);background-position:-2058px 0;width:90px;height:90px}.shop_armor_base_0{background-image:url(spritesmith.png);background-position:-699px -630px;width:40px;height:40px}.shop_armor_healer_1{background-image:url(spritesmith.png);background-position:-546px -269px;width:40px;height:40px}.shop_armor_healer_2{background-image:url(spritesmith.png);background-position:-546px -309px;width:40px;height:40px}.shop_armor_healer_3{background-image:url(spritesmith.png);background-position:0 -2640px;width:40px;height:40px}.shop_armor_healer_4{background-image:url(spritesmith.png);background-position:-40px -2640px;width:40px;height:40px}.shop_armor_healer_5{background-image:url(spritesmith.png);background-position:-80px -2640px;width:40px;height:40px}.shop_armor_rogue_1{background-image:url(spritesmith.png);background-position:-120px -2640px;width:40px;height:40px}.shop_armor_rogue_2{background-image:url(spritesmith.png);background-position:-160px -2640px;width:40px;height:40px}.shop_armor_rogue_3{background-image:url(spritesmith.png);background-position:-200px -2640px;width:40px;height:40px}.shop_armor_rogue_4{background-image:url(spritesmith.png);background-position:-240px -2640px;width:40px;height:40px}.shop_armor_rogue_5{background-image:url(spritesmith.png);background-position:-280px -2640px;width:40px;height:40px}.shop_armor_special_0{background-image:url(spritesmith.png);background-position:-320px -2640px;width:40px;height:40px}.shop_armor_special_1{background-image:url(spritesmith.png);background-position:-360px -2640px;width:40px;height:40px}.shop_armor_special_2{background-image:url(spritesmith.png);background-position:-400px -2640px;width:40px;height:40px}.shop_armor_special_birthday{background-image:url(spritesmith.png);background-position:-440px -2640px;width:40px;height:40px}.shop_armor_special_candycane{background-image:url(spritesmith.png);background-position:-480px -2640px;width:40px;height:40px}.shop_armor_special_ski{background-image:url(spritesmith.png);background-position:-520px -2640px;width:40px;height:40px}.shop_armor_special_snowflake{background-image:url(spritesmith.png);background-position:-560px -2640px;width:40px;height:40px}.shop_armor_special_yeti{background-image:url(spritesmith.png);background-position:-600px -2640px;width:40px;height:40px}.shop_armor_warrior_1{background-image:url(spritesmith.png);background-position:-640px -2640px;width:40px;height:40px}.shop_armor_warrior_2{background-image:url(spritesmith.png);background-position:-680px -2640px;width:40px;height:40px}.shop_armor_warrior_3{background-image:url(spritesmith.png);background-position:-720px -2640px;width:40px;height:40px}.shop_armor_warrior_4{background-image:url(spritesmith.png);background-position:-760px -2640px;width:40px;height:40px}.shop_armor_warrior_5{background-image:url(spritesmith.png);background-position:-800px -2640px;width:40px;height:40px}.shop_armor_wizard_1{background-image:url(spritesmith.png);background-position:-840px -2640px;width:40px;height:40px}.shop_armor_wizard_2{background-image:url(spritesmith.png);background-position:-880px -2640px;width:40px;height:40px}.shop_armor_wizard_3{background-image:url(spritesmith.png);background-position:-920px -2640px;width:40px;height:40px}.shop_armor_wizard_4{background-image:url(spritesmith.png);background-position:-960px -2640px;width:40px;height:40px}.shop_armor_wizard_5{background-image:url(spritesmith.png);background-position:-1000px -2640px;width:40px;height:40px}.shop_copper{background-image:url(spritesmith.png);background-position:-2739px -1616px;width:32px;height:22px}.shop_eyes{background-image:url(spritesmith.png);background-position:-2736px -1794px;width:40px;height:40px}.shop_gold{background-image:url(spritesmith.png);background-position:-2172px -2070px;width:32px;height:22px}.shop_head_base_0{background-image:url(spritesmith.png);background-position:-2736px -1896px;width:40px;height:40px}.shop_head_healer_{background-image:url(spritesmith.png);background-position:-2736px -1947px;width:40px;height:40px}.shop_head_healer_1{background-image:url(spritesmith.png);background-position:-2736px -1998px;width:40px;height:40px}.shop_head_healer_2{background-image:url(spritesmith.png);background-position:-2736px -2049px;width:40px;height:40px}.shop_head_healer_3{background-image:url(spritesmith.png);background-position:-2736px -2100px;width:40px;height:40px}.shop_head_healer_4{background-image:url(spritesmith.png);background-position:-2736px -2151px;width:40px;height:40px}.shop_head_healer_5{background-image:url(spritesmith.png);background-position:-2736px -2202px;width:40px;height:40px}.shop_head_rogue_1{background-image:url(spritesmith.png);background-position:-2736px -2253px;width:40px;height:40px}.shop_head_rogue_2{background-image:url(spritesmith.png);background-position:-2736px -2304px;width:40px;height:40px}.shop_head_rogue_3{background-image:url(spritesmith.png);background-position:-2736px -2355px;width:40px;height:40px}.shop_head_rogue_4{background-image:url(spritesmith.png);background-position:-2736px -2406px;width:40px;height:40px}.shop_head_rogue_5{background-image:url(spritesmith.png);background-position:-2736px -2457px;width:40px;height:40px}.shop_head_special_0{background-image:url(spritesmith.png);background-position:-2736px -2508px;width:40px;height:40px}.shop_head_special_1{background-image:url(spritesmith.png);background-position:-2736px -2559px;width:40px;height:40px}.shop_head_special_2{background-image:url(spritesmith.png);background-position:-1887px -1565px;width:40px;height:40px}.shop_head_special_candycane{background-image:url(spritesmith.png);background-position:-1927px -1565px;width:40px;height:40px}.shop_head_special_nye{background-image:url(spritesmith.png);background-position:-1887px -1605px;width:40px;height:40px}.shop_head_special_ski{background-image:url(spritesmith.png);background-position:-1927px -1605px;width:40px;height:40px}.shop_head_special_snowflake{background-image:url(spritesmith.png);background-position:-1887px -1645px;width:40px;height:40px}.shop_head_special_yeti{background-image:url(spritesmith.png);background-position:-1927px -1645px;width:40px;height:40px}.shop_head_warrior_1{background-image:url(spritesmith.png);background-position:-1887px -1685px;width:40px;height:40px}.shop_head_warrior_2{background-image:url(spritesmith.png);background-position:-1927px -1685px;width:40px;height:40px}.shop_head_warrior_3{background-image:url(spritesmith.png);background-position:-1887px -1725px;width:40px;height:40px}.shop_head_warrior_4{background-image:url(spritesmith.png);background-position:-1927px -1725px;width:40px;height:40px}.shop_head_warrior_5{background-image:url(spritesmith.png);background-position:-1887px -1765px;width:40px;height:40px}.shop_head_wizard_1{background-image:url(spritesmith.png);background-position:-1927px -1765px;width:40px;height:40px}.shop_head_wizard_2{background-image:url(spritesmith.png);background-position:-1806px -1683px;width:40px;height:40px}.shop_head_wizard_3{background-image:url(spritesmith.png);background-position:-1846px -1683px;width:40px;height:40px}.shop_head_wizard_4{background-image:url(spritesmith.png);background-position:-1725px -1584px;width:40px;height:40px}.shop_head_wizard_5{background-image:url(spritesmith.png);background-position:-1765px -1584px;width:40px;height:40px}.shop_potion{background-image:url(spritesmith.png);background-position:-1644px -1584px;width:40px;height:40px}.shop_reroll{background-image:url(spritesmith.png);background-position:-1684px -1584px;width:40px;height:40px}.shop_shield_base_0{background-image:url(spritesmith.png);background-position:-1539px -1470px;width:40px;height:40px}.shop_shield_healer_1{background-image:url(spritesmith.png);background-position:-1579px -1470px;width:40px;height:40px}.shop_shield_healer_2{background-image:url(spritesmith.png);background-position:-1434px -1365px;width:40px;height:40px}.shop_shield_healer_3{background-image:url(spritesmith.png);background-position:-1474px -1365px;width:40px;height:40px}.shop_shield_healer_4{background-image:url(spritesmith.png);background-position:-1329px -1260px;width:40px;height:40px}.shop_shield_healer_5{background-image:url(spritesmith.png);background-position:-1369px -1260px;width:40px;height:40px}.shop_shield_rogue_0{background-image:url(spritesmith.png);background-position:-1224px -1155px;width:40px;height:40px}.shop_shield_rogue_1{background-image:url(spritesmith.png);background-position:-1264px -1155px;width:40px;height:40px}.shop_shield_rogue_2{background-image:url(spritesmith.png);background-position:-1119px -1050px;width:40px;height:40px}.shop_shield_rogue_3{background-image:url(spritesmith.png);background-position:-1159px -1050px;width:40px;height:40px}.shop_shield_rogue_4{background-image:url(spritesmith.png);background-position:-1014px -945px;width:40px;height:40px}.shop_shield_rogue_5{background-image:url(spritesmith.png);background-position:-1054px -945px;width:40px;height:40px}.shop_shield_rogue_6{background-image:url(spritesmith.png);background-position:-909px -840px;width:40px;height:40px}.shop_shield_special_0{background-image:url(spritesmith.png);background-position:-949px -840px;width:40px;height:40px}.shop_shield_special_1{background-image:url(spritesmith.png);background-position:-804px -735px;width:40px;height:40px}.shop_shield_special_ski{background-image:url(spritesmith.png);background-position:-844px -735px;width:40px;height:40px}.shop_shield_special_snowflake{background-image:url(spritesmith.png);background-position:-2736px -1692px;width:40px;height:40px}.shop_shield_special_yeti{background-image:url(spritesmith.png);background-position:-739px -630px;width:40px;height:40px}.shop_shield_warrior_1{background-image:url(spritesmith.png);background-position:-594px -525px;width:40px;height:40px}.shop_shield_warrior_2{background-image:url(spritesmith.png);background-position:-634px -525px;width:40px;height:40px}.shop_shield_warrior_3{background-image:url(spritesmith.png);background-position:-550px -138px;width:40px;height:40px}.shop_shield_warrior_4{background-image:url(spritesmith.png);background-position:-550px -178px;width:40px;height:40px}.shop_shield_warrior_5{background-image:url(spritesmith.png);background-position:-550px -218px;width:40px;height:40px}.shop_silver{background-image:url(spritesmith.png);background-position:-2739px -1565px;width:32px;height:22px}.shop_snowball{background-image:url(spritesmith.png);background-position:-2204px -2070px;width:32px;height:22px}.shop_weapon_base_0{background-image:url(spritesmith.png);background-position:-534px -354px;width:40px;height:40px}.shop_weapon_healer_0{background-image:url(spritesmith.png);background-position:-534px -394px;width:40px;height:40px}.shop_weapon_healer_1{background-image:url(spritesmith.png);background-position:-525px -477px;width:40px;height:40px}.shop_weapon_healer_2{background-image:url(spritesmith.png);background-position:-525px -517px;width:40px;height:40px}.shop_weapon_healer_3{background-image:url(spritesmith.png);background-position:-630px -582px;width:40px;height:40px}.shop_weapon_healer_4{background-image:url(spritesmith.png);background-position:-630px -622px;width:40px;height:40px}.shop_weapon_healer_5{background-image:url(spritesmith.png);background-position:-735px -687px;width:40px;height:40px}.shop_weapon_healer_6{background-image:url(spritesmith.png);background-position:-735px -727px;width:40px;height:40px}.shop_weapon_rogue_0{background-image:url(spritesmith.png);background-position:-840px -792px;width:40px;height:40px}.shop_weapon_rogue_1{background-image:url(spritesmith.png);background-position:-840px -832px;width:40px;height:40px}.shop_weapon_rogue_2{background-image:url(spritesmith.png);background-position:-945px -897px;width:40px;height:40px}.shop_weapon_rogue_3{background-image:url(spritesmith.png);background-position:-945px -937px;width:40px;height:40px}.shop_weapon_rogue_4{background-image:url(spritesmith.png);background-position:-1050px -1002px;width:40px;height:40px}.shop_weapon_rogue_5{background-image:url(spritesmith.png);background-position:-1050px -1042px;width:40px;height:40px}.shop_weapon_rogue_6{background-image:url(spritesmith.png);background-position:-1155px -1107px;width:40px;height:40px}.shop_weapon_special_0{background-image:url(spritesmith.png);background-position:-1155px -1147px;width:40px;height:40px}.shop_weapon_special_1{background-image:url(spritesmith.png);background-position:-1260px -1212px;width:40px;height:40px}.shop_weapon_special_2{background-image:url(spritesmith.png);background-position:-1260px -1252px;width:40px;height:40px}.shop_weapon_special_3{background-image:url(spritesmith.png);background-position:-1365px -1317px;width:40px;height:40px}.shop_weapon_special_candycane{background-image:url(spritesmith.png);background-position:-1365px -1357px;width:40px;height:40px}.shop_weapon_special_critical{background-image:url(spritesmith.png);background-position:-1470px -1422px;width:40px;height:40px}.shop_weapon_special_ski{background-image:url(spritesmith.png);background-position:-1470px -1462px;width:40px;height:40px}.shop_weapon_special_snowflake{background-image:url(spritesmith.png);background-position:-1890px -1830px;width:40px;height:40px}.shop_weapon_special_yeti{background-image:url(spritesmith.png);background-position:-1890px -1870px;width:40px;height:40px}.shop_weapon_warrior_0{background-image:url(spritesmith.png);background-position:-1980px -1920px;width:40px;height:40px}.shop_weapon_warrior_1{background-image:url(spritesmith.png);background-position:-1980px -1960px;width:40px;height:40px}.shop_weapon_warrior_2{background-image:url(spritesmith.png);background-position:-2085px -2010px;width:40px;height:40px}.shop_weapon_warrior_3{background-image:url(spritesmith.png);background-position:-2085px -2050px;width:40px;height:40px}.shop_weapon_warrior_4{background-image:url(spritesmith.png);background-position:-2160px -2100px;width:40px;height:40px}.shop_weapon_warrior_5{background-image:url(spritesmith.png);background-position:-2160px -2140px;width:40px;height:40px}.shop_weapon_warrior_6{background-image:url(spritesmith.png);background-position:-2250px -2190px;width:40px;height:40px}.shop_weapon_wizard_0{background-image:url(spritesmith.png);background-position:-2250px -2230px;width:40px;height:40px}.shop_weapon_wizard_1{background-image:url(spritesmith.png);background-position:-2340px -2280px;width:40px;height:40px}.shop_weapon_wizard_2{background-image:url(spritesmith.png);background-position:-2340px -2320px;width:40px;height:40px}.shop_weapon_wizard_3{background-image:url(spritesmith.png);background-position:-2430px -2370px;width:40px;height:40px}.shop_weapon_wizard_4{background-image:url(spritesmith.png);background-position:-2430px -2410px;width:40px;height:40px}.shop_weapon_wizard_5{background-image:url(spritesmith.png);background-position:-2520px -2460px;width:40px;height:40px}.shop_weapon_wizard_6{background-image:url(spritesmith.png);background-position:-2520px -2500px;width:40px;height:40px}.zzz{background-image:url(spritesmith.png);background-position:-2642px -2550px;width:40px;height:40px}.zzz_light{background-image:url(spritesmith.png);background-position:-2642px -2590px;width:40px;height:40px}.skin_0ff591{background-image:url(spritesmith.png);background-position:-1890px -1920px;width:90px;height:90px}.skin_2b43f6{background-image:url(spritesmith.png);background-position:-1800px -1920px;width:90px;height:90px}.skin_6bd049{background-image:url(spritesmith.png);background-position:-1710px -1920px;width:90px;height:90px}.skin_800ed0{background-image:url(spritesmith.png);background-position:-1620px -1920px;width:90px;height:90px}.skin_915533{background-image:url(spritesmith.png);background-position:-1530px -1920px;width:90px;height:90px}.skin_98461a{background-image:url(spritesmith.png);background-position:-1440px -1920px;width:90px;height:90px}.skin_c06534{background-image:url(spritesmith.png);background-position:-1350px -1920px;width:90px;height:90px}.skin_c3e1dc{background-image:url(spritesmith.png);background-position:-1260px -1920px;width:90px;height:90px}.skin_d7a9f7{background-image:url(spritesmith.png);background-position:-1170px -1920px;width:90px;height:90px}.skin_ddc994{background-image:url(spritesmith.png);background-position:-1080px -1920px;width:90px;height:90px}.skin_ea8349{background-image:url(spritesmith.png);background-position:-990px -1920px;width:90px;height:90px}.skin_eb052b{background-image:url(spritesmith.png);background-position:-900px -1920px;width:90px;height:90px}.skin_f5a76e{background-image:url(spritesmith.png);background-position:-810px -1920px;width:90px;height:90px}.skin_f5d70f{background-image:url(spritesmith.png);background-position:-720px -1920px;width:90px;height:90px}.skin_f69922{background-image:url(spritesmith.png);background-position:-630px -1920px;width:90px;height:90px}.skin_ghost{background-image:url(spritesmith.png);background-position:-540px -1920px;width:90px;height:90px}.skin_monster{background-image:url(spritesmith.png);background-position:-450px -1920px;width:90px;height:90px}.skin_pumpkin{background-image:url(spritesmith.png);background-position:-360px -1920px;width:90px;height:90px}.skin_rainbow{background-image:url(spritesmith.png);background-position:-270px -1920px;width:90px;height:90px}.skin_shadow{background-image:url(spritesmith.png);background-position:-180px -1920px;width:90px;height:90px}.skin_skeleton{background-image:url(spritesmith.png);background-position:-90px -1920px;width:90px;height:90px}.skin_zombie{background-image:url(spritesmith.png);background-position:0 -1920px;width:90px;height:90px}.weapon_healer_0{background-image:url(spritesmith.png);background-position:-1968px -1800px;width:90px;height:90px}.weapon_healer_1{background-image:url(spritesmith.png);background-position:-1968px -1710px;width:90px;height:90px}.weapon_healer_2{background-image:url(spritesmith.png);background-position:-1968px -1620px;width:90px;height:90px}.weapon_healer_3{background-image:url(spritesmith.png);background-position:-1968px -1530px;width:90px;height:90px}.weapon_healer_4{background-image:url(spritesmith.png);background-position:-1968px -1440px;width:90px;height:90px}.weapon_healer_5{background-image:url(spritesmith.png);background-position:-1968px -1350px;width:90px;height:90px}.weapon_healer_6{background-image:url(spritesmith.png);background-position:-1968px -1260px;width:90px;height:90px}.weapon_rogue_0{background-image:url(spritesmith.png);background-position:-1968px -1170px;width:90px;height:90px}.weapon_rogue_1{background-image:url(spritesmith.png);background-position:-1968px -1080px;width:90px;height:90px}.weapon_rogue_2{background-image:url(spritesmith.png);background-position:-1968px -990px;width:90px;height:90px}.weapon_rogue_3{background-image:url(spritesmith.png);background-position:-1968px -900px;width:90px;height:90px}.weapon_rogue_4{background-image:url(spritesmith.png);background-position:-1968px -810px;width:90px;height:90px}.weapon_rogue_5{background-image:url(spritesmith.png);background-position:-1995px -2010px;width:90px;height:90px}.weapon_rogue_6{background-image:url(spritesmith.png);background-position:-1905px -2010px;width:90px;height:90px}.weapon_special_1{background-image:url(spritesmith.png);background-position:-1800px -2010px;width:105px;height:90px}.weapon_special_2{background-image:url(spritesmith.png);background-position:-1710px -2010px;width:90px;height:90px}.weapon_special_3{background-image:url(spritesmith.png);background-position:-1620px -2010px;width:90px;height:90px}.weapon_special_candycane{background-image:url(spritesmith.png);background-position:-1530px -2010px;width:90px;height:90px}.weapon_special_ski{background-image:url(spritesmith.png);background-position:-1440px -2010px;width:90px;height:90px}.weapon_special_snowflake{background-image:url(spritesmith.png);background-position:-1350px -2010px;width:90px;height:90px}.weapon_special_yeti{background-image:url(spritesmith.png);background-position:-1260px -2010px;width:90px;height:90px}.weapon_warrior_0{background-image:url(spritesmith.png);background-position:-1170px -2010px;width:90px;height:90px}.weapon_warrior_1{background-image:url(spritesmith.png);background-position:-1080px -2010px;width:90px;height:90px}.weapon_warrior_2{background-image:url(spritesmith.png);background-position:-990px -2010px;width:90px;height:90px}.weapon_warrior_3{background-image:url(spritesmith.png);background-position:-900px -2010px;width:90px;height:90px}.weapon_warrior_4{background-image:url(spritesmith.png);background-position:-810px -2010px;width:90px;height:90px}.weapon_warrior_5{background-image:url(spritesmith.png);background-position:-720px -2010px;width:90px;height:90px}.weapon_warrior_6{background-image:url(spritesmith.png);background-position:-630px -2010px;width:90px;height:90px}.weapon_wizard_0{background-image:url(spritesmith.png);background-position:-540px -2010px;width:90px;height:90px}.weapon_wizard_1{background-image:url(spritesmith.png);background-position:-450px -2010px;width:90px;height:90px}.weapon_wizard_2{background-image:url(spritesmith.png);background-position:-360px -2010px;width:90px;height:90px}.weapon_wizard_3{background-image:url(spritesmith.png);background-position:-270px -2010px;width:90px;height:90px}.weapon_wizard_4{background-image:url(spritesmith.png);background-position:-180px -2010px;width:90px;height:90px}.weapon_wizard_5{background-image:url(spritesmith.png);background-position:-90px -2010px;width:90px;height:90px}.weapon_wizard_6{background-image:url(spritesmith.png);background-position:0 -2010px;width:90px;height:90px}.weapon_special_0,.head_special_0{width:105px;height:105px;margin-left:-3px;margin-top:-18px}.slim_armor_special_0,.broad_armor_special_0,.shield_special_0{width:90px;height:90px}.weapon_special_critical{background:url(../img/sprites/backer-only/weapon_special_critical.gif) no-repeat;width:90px;height:90px;margin-left:-12px;margin-top:12px}.weapon_special_1{height:105px;margin-left:-11px;margin-top:6px}.broad_armor_special_1,.slim_armor_special_1,.head_special_1{width:90px;height:90px}.head_special_0{background:url(../img/sprites/backer-only/BackerOnly-Equip-ShadeHelmet.gif) no-repeat}.head_special_1{background:url(../img/sprites/backer-only/ContributorOnly-Equip-CrystalHelmet.gif) no-repeat;margin-top:3px}.broad_armor_special_0,.slim_armor_special_0{background:url(../img/sprites/backer-only/BackerOnly-Equip-ShadeArmor.gif) no-repeat}.broad_armor_special_1,.slim_armor_special_1{background:url(../img/sprites/backer-only/ContributorOnly-Equip-CrystalArmor.gif) no-repeat}.shield_special_0{background:url(../img/sprites/backer-only/BackerOnly-Shield-TormentedSkull.gif) no-repeat}.weapon_special_0{background:url(../img/sprites/backer-only/BackerOnly-Weapon-DarkSoulsBlade.gif) no-repeat}.Pet-Wolf-Cerberus{width:105px;height:72px;background:url(../img/sprites/backer-only/BackerOnly-Pet-CerberusPup.gif) no-repeat}.npc_ian{background:url(../img/sprites/npc_ian.gif) no-repeat;width:78px;height:135px}.Gems{display:inline-block;margin-right:5px;border-style:none;margin-left:0;margin-top:2px}.inline-gems{vertical-align:middle;margin-left:0;display:inline-block}.customize-menu .locked{background-color:#727272}.achievement{float:left;clear:right;margin-right:10px}[class*=Mount_Head_],[class*=Mount_Body_]{margin-top:18px} \ No newline at end of file +.customize-option.beard_{background-image:url(spritesmith.png);background-position:-115px -15px;width:60px;height:60px}.customize-option.hair_beard_1_TRUred{background-image:url(spritesmith.png);background-position:-25px -1005px;width:60px;height:60px}.customize-option.hair_beard_1_black{background-image:url(spritesmith.png);background-position:-25px -105px;width:60px;height:60px}.customize-option.hair_beard_1_blond{background-image:url(spritesmith.png);background-position:-115px -105px;width:60px;height:60px}.customize-option.hair_beard_1_blue{background-image:url(spritesmith.png);background-position:-205px -15px;width:60px;height:60px}.customize-option.hair_beard_1_brown{background-image:url(spritesmith.png);background-position:-205px -105px;width:60px;height:60px}.customize-option.hair_beard_1_candycane{background-image:url(spritesmith.png);background-position:-25px -195px;width:60px;height:60px}.customize-option.hair_beard_1_frost{background-image:url(spritesmith.png);background-position:-115px -195px;width:60px;height:60px}.customize-option.hair_beard_1_green{background-image:url(spritesmith.png);background-position:-205px -195px;width:60px;height:60px}.customize-option.hair_beard_1_holly{background-image:url(spritesmith.png);background-position:-295px -15px;width:60px;height:60px}.customize-option.hair_beard_1_purple{background-image:url(spritesmith.png);background-position:-295px -105px;width:60px;height:60px}.customize-option.hair_beard_1_rainbow{background-image:url(spritesmith.png);background-position:-295px -195px;width:60px;height:60px}.customize-option.hair_beard_1_red{background-image:url(spritesmith.png);background-position:-25px -285px;width:60px;height:60px}.customize-option.hair_beard_1_white{background-image:url(spritesmith.png);background-position:-115px -285px;width:60px;height:60px}.customize-option.hair_beard_1_winternight{background-image:url(spritesmith.png);background-position:-205px -285px;width:60px;height:60px}.customize-option.hair_beard_1_yellow{background-image:url(spritesmith.png);background-position:-295px -285px;width:60px;height:60px}.customize-option.hair_beard_2_TRUred{background-image:url(spritesmith.png);background-position:-385px -15px;width:60px;height:60px}.customize-option.hair_beard_2_black{background-image:url(spritesmith.png);background-position:-385px -105px;width:60px;height:60px}.customize-option.hair_beard_2_blond{background-image:url(spritesmith.png);background-position:-385px -195px;width:60px;height:60px}.customize-option.hair_beard_2_blue{background-image:url(spritesmith.png);background-position:-385px -285px;width:60px;height:60px}.customize-option.hair_beard_2_brown{background-image:url(spritesmith.png);background-position:-25px -375px;width:60px;height:60px}.customize-option.hair_beard_2_candycane{background-image:url(spritesmith.png);background-position:-115px -375px;width:60px;height:60px}.customize-option.hair_beard_2_frost{background-image:url(spritesmith.png);background-position:-205px -375px;width:60px;height:60px}.customize-option.hair_beard_2_green{background-image:url(spritesmith.png);background-position:-295px -375px;width:60px;height:60px}.customize-option.hair_beard_2_holly{background-image:url(spritesmith.png);background-position:-385px -375px;width:60px;height:60px}.customize-option.hair_beard_2_purple{background-image:url(spritesmith.png);background-position:-475px -15px;width:60px;height:60px}.customize-option.hair_beard_2_rainbow{background-image:url(spritesmith.png);background-position:-475px -105px;width:60px;height:60px}.customize-option.hair_beard_2_red{background-image:url(spritesmith.png);background-position:-475px -195px;width:60px;height:60px}.customize-option.hair_beard_2_white{background-image:url(spritesmith.png);background-position:-475px -285px;width:60px;height:60px}.customize-option.hair_beard_2_winternight{background-image:url(spritesmith.png);background-position:-475px -375px;width:60px;height:60px}.customize-option.hair_beard_2_yellow{background-image:url(spritesmith.png);background-position:-25px -465px;width:60px;height:60px}.customize-option.hair_beard_3_TRUred{background-image:url(spritesmith.png);background-position:-115px -465px;width:60px;height:60px}.customize-option.hair_beard_3_black{background-image:url(spritesmith.png);background-position:-205px -465px;width:60px;height:60px}.customize-option.hair_beard_3_blond{background-image:url(spritesmith.png);background-position:-295px -465px;width:60px;height:60px}.customize-option.hair_beard_3_blue{background-image:url(spritesmith.png);background-position:-385px -465px;width:60px;height:60px}.customize-option.hair_beard_3_brown{background-image:url(spritesmith.png);background-position:-475px -465px;width:60px;height:60px}.customize-option.hair_beard_3_candycane{background-image:url(spritesmith.png);background-position:-565px -15px;width:60px;height:60px}.customize-option.hair_beard_3_frost{background-image:url(spritesmith.png);background-position:-565px -105px;width:60px;height:60px}.customize-option.hair_beard_3_green{background-image:url(spritesmith.png);background-position:-565px -195px;width:60px;height:60px}.customize-option.hair_beard_3_holly{background-image:url(spritesmith.png);background-position:-565px -285px;width:60px;height:60px}.customize-option.hair_beard_3_purple{background-image:url(spritesmith.png);background-position:-565px -375px;width:60px;height:60px}.customize-option.hair_beard_3_rainbow{background-image:url(spritesmith.png);background-position:-565px -465px;width:60px;height:60px}.customize-option.hair_beard_3_red{background-image:url(spritesmith.png);background-position:-25px -555px;width:60px;height:60px}.customize-option.hair_beard_3_white{background-image:url(spritesmith.png);background-position:-115px -555px;width:60px;height:60px}.customize-option.hair_beard_3_winternight{background-image:url(spritesmith.png);background-position:-205px -555px;width:60px;height:60px}.customize-option.hair_beard_3_yellow{background-image:url(spritesmith.png);background-position:-295px -555px;width:60px;height:60px}.customize-option.hair_mustache_1_TRUred{background-image:url(spritesmith.png);background-position:-385px -555px;width:60px;height:60px}.customize-option.hair_mustache_1_black{background-image:url(spritesmith.png);background-position:-475px -555px;width:60px;height:60px}.customize-option.hair_mustache_1_blond{background-image:url(spritesmith.png);background-position:-565px -555px;width:60px;height:60px}.customize-option.hair_mustache_1_blue{background-image:url(spritesmith.png);background-position:-655px -15px;width:60px;height:60px}.customize-option.hair_mustache_1_brown{background-image:url(spritesmith.png);background-position:-655px -105px;width:60px;height:60px}.customize-option.hair_mustache_1_candycane{background-image:url(spritesmith.png);background-position:-655px -195px;width:60px;height:60px}.customize-option.hair_mustache_1_frost{background-image:url(spritesmith.png);background-position:-655px -285px;width:60px;height:60px}.customize-option.hair_mustache_1_green{background-image:url(spritesmith.png);background-position:-655px -375px;width:60px;height:60px}.customize-option.hair_mustache_1_holly{background-image:url(spritesmith.png);background-position:-655px -465px;width:60px;height:60px}.customize-option.hair_mustache_1_purple{background-image:url(spritesmith.png);background-position:-655px -555px;width:60px;height:60px}.customize-option.hair_mustache_1_rainbow{background-image:url(spritesmith.png);background-position:-25px -645px;width:60px;height:60px}.customize-option.hair_mustache_1_red{background-image:url(spritesmith.png);background-position:-115px -645px;width:60px;height:60px}.customize-option.hair_mustache_1_white{background-image:url(spritesmith.png);background-position:-205px -645px;width:60px;height:60px}.customize-option.hair_mustache_1_winternight{background-image:url(spritesmith.png);background-position:-295px -645px;width:60px;height:60px}.customize-option.hair_mustache_1_yellow{background-image:url(spritesmith.png);background-position:-385px -645px;width:60px;height:60px}.customize-option.hair_mustache_2_TRUred{background-image:url(spritesmith.png);background-position:-475px -645px;width:60px;height:60px}.customize-option.hair_mustache_2_black{background-image:url(spritesmith.png);background-position:-565px -645px;width:60px;height:60px}.customize-option.hair_mustache_2_blond{background-image:url(spritesmith.png);background-position:-655px -645px;width:60px;height:60px}.customize-option.hair_mustache_2_blue{background-image:url(spritesmith.png);background-position:-745px -15px;width:60px;height:60px}.customize-option.hair_mustache_2_brown{background-image:url(spritesmith.png);background-position:-745px -105px;width:60px;height:60px}.customize-option.hair_mustache_2_candycane{background-image:url(spritesmith.png);background-position:-745px -195px;width:60px;height:60px}.customize-option.hair_mustache_2_frost{background-image:url(spritesmith.png);background-position:-745px -285px;width:60px;height:60px}.customize-option.hair_mustache_2_green{background-image:url(spritesmith.png);background-position:-745px -375px;width:60px;height:60px}.customize-option.hair_mustache_2_holly{background-image:url(spritesmith.png);background-position:-745px -465px;width:60px;height:60px}.customize-option.hair_mustache_2_purple{background-image:url(spritesmith.png);background-position:-745px -555px;width:60px;height:60px}.customize-option.hair_mustache_2_rainbow{background-image:url(spritesmith.png);background-position:-745px -645px;width:60px;height:60px}.customize-option.hair_mustache_2_red{background-image:url(spritesmith.png);background-position:-25px -735px;width:60px;height:60px}.customize-option.hair_mustache_2_white{background-image:url(spritesmith.png);background-position:-115px -735px;width:60px;height:60px}.customize-option.hair_mustache_2_winternight{background-image:url(spritesmith.png);background-position:-205px -735px;width:60px;height:60px}.customize-option.hair_mustache_2_yellow{background-image:url(spritesmith.png);background-position:-295px -735px;width:60px;height:60px}.customize-option.hair_bangs_1_TRUred{background-image:url(spritesmith.png);background-position:-385px -735px;width:60px;height:60px}.customize-option.hair_bangs_1_black{background-image:url(spritesmith.png);background-position:-475px -735px;width:60px;height:60px}.customize-option.hair_bangs_1_blond{background-image:url(spritesmith.png);background-position:-565px -735px;width:60px;height:60px}.customize-option.hair_bangs_1_blue{background-image:url(spritesmith.png);background-position:-655px -735px;width:60px;height:60px}.customize-option.hair_bangs_1_brown{background-image:url(spritesmith.png);background-position:-745px -735px;width:60px;height:60px}.customize-option.hair_bangs_1_candycane{background-image:url(spritesmith.png);background-position:-835px -15px;width:60px;height:60px}.customize-option.hair_bangs_1_frost{background-image:url(spritesmith.png);background-position:-835px -105px;width:60px;height:60px}.customize-option.hair_bangs_1_green{background-image:url(spritesmith.png);background-position:-835px -195px;width:60px;height:60px}.customize-option.hair_bangs_1_holly{background-image:url(spritesmith.png);background-position:-835px -285px;width:60px;height:60px}.customize-option.hair_bangs_1_purple{background-image:url(spritesmith.png);background-position:-835px -375px;width:60px;height:60px}.customize-option.hair_bangs_1_rainbow{background-image:url(spritesmith.png);background-position:-835px -465px;width:60px;height:60px}.customize-option.hair_bangs_1_red{background-image:url(spritesmith.png);background-position:-835px -555px;width:60px;height:60px}.customize-option.hair_bangs_1_white{background-image:url(spritesmith.png);background-position:-835px -645px;width:60px;height:60px}.customize-option.hair_bangs_1_winternight{background-image:url(spritesmith.png);background-position:-835px -735px;width:60px;height:60px}.customize-option.hair_bangs_1_yellow{background-image:url(spritesmith.png);background-position:-25px -825px;width:60px;height:60px}.customize-option.hair_bangs_2_TRUred{background-image:url(spritesmith.png);background-position:-115px -825px;width:60px;height:60px}.customize-option.hair_bangs_2_black{background-image:url(spritesmith.png);background-position:-205px -825px;width:60px;height:60px}.customize-option.hair_bangs_2_blond{background-image:url(spritesmith.png);background-position:-295px -825px;width:60px;height:60px}.customize-option.hair_bangs_2_blue{background-image:url(spritesmith.png);background-position:-385px -825px;width:60px;height:60px}.customize-option.hair_bangs_2_brown{background-image:url(spritesmith.png);background-position:-475px -825px;width:60px;height:60px}.customize-option.hair_bangs_2_candycane{background-image:url(spritesmith.png);background-position:-565px -825px;width:60px;height:60px}.customize-option.hair_bangs_2_frost{background-image:url(spritesmith.png);background-position:-655px -825px;width:60px;height:60px}.customize-option.hair_bangs_2_green{background-image:url(spritesmith.png);background-position:-745px -825px;width:60px;height:60px}.customize-option.hair_bangs_2_holly{background-image:url(spritesmith.png);background-position:-835px -825px;width:60px;height:60px}.customize-option.hair_bangs_2_purple{background-image:url(spritesmith.png);background-position:-925px -15px;width:60px;height:60px}.customize-option.hair_bangs_2_rainbow{background-image:url(spritesmith.png);background-position:-925px -105px;width:60px;height:60px}.customize-option.hair_bangs_2_red{background-image:url(spritesmith.png);background-position:-925px -195px;width:60px;height:60px}.customize-option.hair_bangs_2_white{background-image:url(spritesmith.png);background-position:-925px -285px;width:60px;height:60px}.customize-option.hair_bangs_2_winternight{background-image:url(spritesmith.png);background-position:-925px -375px;width:60px;height:60px}.customize-option.hair_bangs_2_yellow{background-image:url(spritesmith.png);background-position:-925px -465px;width:60px;height:60px}.customize-option.hair_bangs_3_TRUred{background-image:url(spritesmith.png);background-position:-925px -555px;width:60px;height:60px}.customize-option.hair_bangs_3_black{background-image:url(spritesmith.png);background-position:-925px -645px;width:60px;height:60px}.customize-option.hair_bangs_3_blond{background-image:url(spritesmith.png);background-position:-925px -735px;width:60px;height:60px}.customize-option.hair_bangs_3_blue{background-image:url(spritesmith.png);background-position:-925px -825px;width:60px;height:60px}.customize-option.hair_bangs_3_brown{background-image:url(spritesmith.png);background-position:-25px -915px;width:60px;height:60px}.customize-option.hair_bangs_3_candycane{background-image:url(spritesmith.png);background-position:-115px -915px;width:60px;height:60px}.customize-option.hair_bangs_3_frost{background-image:url(spritesmith.png);background-position:-205px -915px;width:60px;height:60px}.customize-option.hair_bangs_3_green{background-image:url(spritesmith.png);background-position:-295px -915px;width:60px;height:60px}.customize-option.hair_bangs_3_holly{background-image:url(spritesmith.png);background-position:-385px -915px;width:60px;height:60px}.customize-option.hair_bangs_3_purple{background-image:url(spritesmith.png);background-position:-475px -915px;width:60px;height:60px}.customize-option.hair_bangs_3_rainbow{background-image:url(spritesmith.png);background-position:-565px -915px;width:60px;height:60px}.customize-option.hair_bangs_3_red{background-image:url(spritesmith.png);background-position:-655px -915px;width:60px;height:60px}.customize-option.hair_bangs_3_white{background-image:url(spritesmith.png);background-position:-745px -915px;width:60px;height:60px}.customize-option.hair_bangs_3_winternight{background-image:url(spritesmith.png);background-position:-835px -915px;width:60px;height:60px}.customize-option.hair_bangs_3_yellow{background-image:url(spritesmith.png);background-position:-925px -915px;width:60px;height:60px}.customize-option.hair_base_1_TRUred{background-image:url(spritesmith.png);background-position:-1015px -15px;width:60px;height:60px}.customize-option.hair_base_1_black{background-image:url(spritesmith.png);background-position:-1015px -105px;width:60px;height:60px}.customize-option.hair_base_1_blond{background-image:url(spritesmith.png);background-position:-1015px -195px;width:60px;height:60px}.customize-option.hair_base_1_blue{background-image:url(spritesmith.png);background-position:-1015px -285px;width:60px;height:60px}.customize-option.hair_base_1_brown{background-image:url(spritesmith.png);background-position:-1015px -375px;width:60px;height:60px}.customize-option.hair_base_1_candycane{background-image:url(spritesmith.png);background-position:-1015px -465px;width:60px;height:60px}.customize-option.hair_base_1_frost{background-image:url(spritesmith.png);background-position:-1015px -555px;width:60px;height:60px}.customize-option.hair_base_1_green{background-image:url(spritesmith.png);background-position:-1015px -645px;width:60px;height:60px}.customize-option.hair_base_1_holly{background-image:url(spritesmith.png);background-position:-1015px -735px;width:60px;height:60px}.customize-option.hair_base_1_purple{background-image:url(spritesmith.png);background-position:-1015px -825px;width:60px;height:60px}.customize-option.hair_base_1_rainbow{background-image:url(spritesmith.png);background-position:-1015px -915px;width:60px;height:60px}.customize-option.hair_base_1_red{background-image:url(spritesmith.png);background-position:-25px -15px;width:60px;height:60px}.customize-option.hair_base_1_white{background-image:url(spritesmith.png);background-position:-115px -1005px;width:60px;height:60px}.customize-option.hair_base_1_winternight{background-image:url(spritesmith.png);background-position:-205px -1005px;width:60px;height:60px}.customize-option.hair_base_1_yellow{background-image:url(spritesmith.png);background-position:-295px -1005px;width:60px;height:60px}.customize-option.hair_base_2_TRUred{background-image:url(spritesmith.png);background-position:-385px -1005px;width:60px;height:60px}.customize-option.hair_base_2_black{background-image:url(spritesmith.png);background-position:-475px -1005px;width:60px;height:60px}.customize-option.hair_base_2_blond{background-image:url(spritesmith.png);background-position:-565px -1005px;width:60px;height:60px}.customize-option.hair_base_2_blue{background-image:url(spritesmith.png);background-position:-655px -1005px;width:60px;height:60px}.customize-option.hair_base_2_brown{background-image:url(spritesmith.png);background-position:-745px -1005px;width:60px;height:60px}.customize-option.hair_base_2_candycane{background-image:url(spritesmith.png);background-position:-835px -1005px;width:60px;height:60px}.customize-option.hair_base_2_frost{background-image:url(spritesmith.png);background-position:-925px -1005px;width:60px;height:60px}.customize-option.hair_base_2_green{background-image:url(spritesmith.png);background-position:-1015px -1005px;width:60px;height:60px}.customize-option.hair_base_2_holly{background-image:url(spritesmith.png);background-position:-1105px -15px;width:60px;height:60px}.customize-option.hair_base_2_purple{background-image:url(spritesmith.png);background-position:-1105px -105px;width:60px;height:60px}.customize-option.hair_base_2_rainbow{background-image:url(spritesmith.png);background-position:-1105px -195px;width:60px;height:60px}.customize-option.hair_base_2_red{background-image:url(spritesmith.png);background-position:-1105px -285px;width:60px;height:60px}.customize-option.hair_base_2_white{background-image:url(spritesmith.png);background-position:-1105px -375px;width:60px;height:60px}.customize-option.hair_base_2_winternight{background-image:url(spritesmith.png);background-position:-1105px -465px;width:60px;height:60px}.customize-option.hair_base_2_yellow{background-image:url(spritesmith.png);background-position:-1105px -555px;width:60px;height:60px}.customize-option.hair_base_3_TRUred{background-image:url(spritesmith.png);background-position:-1105px -645px;width:60px;height:60px}.customize-option.hair_base_3_black{background-image:url(spritesmith.png);background-position:-1105px -735px;width:60px;height:60px}.customize-option.hair_base_3_blond{background-image:url(spritesmith.png);background-position:-1105px -825px;width:60px;height:60px}.customize-option.hair_base_3_blue{background-image:url(spritesmith.png);background-position:-1105px -915px;width:60px;height:60px}.customize-option.hair_base_3_brown{background-image:url(spritesmith.png);background-position:-1105px -1005px;width:60px;height:60px}.customize-option.hair_base_3_candycane{background-image:url(spritesmith.png);background-position:-25px -1095px;width:60px;height:60px}.customize-option.hair_base_3_frost{background-image:url(spritesmith.png);background-position:-115px -1095px;width:60px;height:60px}.customize-option.hair_base_3_green{background-image:url(spritesmith.png);background-position:-205px -1095px;width:60px;height:60px}.customize-option.hair_base_3_holly{background-image:url(spritesmith.png);background-position:-295px -1095px;width:60px;height:60px}.customize-option.hair_base_3_purple{background-image:url(spritesmith.png);background-position:-385px -1095px;width:60px;height:60px}.customize-option.hair_base_3_rainbow{background-image:url(spritesmith.png);background-position:-475px -1095px;width:60px;height:60px}.customize-option.hair_base_3_red{background-image:url(spritesmith.png);background-position:-565px -1095px;width:60px;height:60px}.customize-option.hair_base_3_white{background-image:url(spritesmith.png);background-position:-655px -1095px;width:60px;height:60px}.customize-option.hair_base_3_winternight{background-image:url(spritesmith.png);background-position:-745px -1095px;width:60px;height:60px}.customize-option.hair_base_3_yellow{background-image:url(spritesmith.png);background-position:-835px -1095px;width:60px;height:60px}.customize-option.hair_base_4_TRUred{background-image:url(spritesmith.png);background-position:-925px -1095px;width:60px;height:60px}.customize-option.hair_base_4_black{background-image:url(spritesmith.png);background-position:-1015px -1095px;width:60px;height:60px}.customize-option.hair_base_4_blond{background-image:url(spritesmith.png);background-position:-1105px -1095px;width:60px;height:60px}.customize-option.hair_base_4_blue{background-image:url(spritesmith.png);background-position:-1195px -15px;width:60px;height:60px}.customize-option.hair_base_4_brown{background-image:url(spritesmith.png);background-position:-1195px -105px;width:60px;height:60px}.customize-option.hair_base_4_candycane{background-image:url(spritesmith.png);background-position:-1195px -195px;width:60px;height:60px}.customize-option.hair_base_4_frost{background-image:url(spritesmith.png);background-position:-1195px -285px;width:60px;height:60px}.customize-option.hair_base_4_green{background-image:url(spritesmith.png);background-position:-1195px -375px;width:60px;height:60px}.customize-option.hair_base_4_holly{background-image:url(spritesmith.png);background-position:-1195px -465px;width:60px;height:60px}.customize-option.hair_base_4_purple{background-image:url(spritesmith.png);background-position:-1195px -555px;width:60px;height:60px}.customize-option.hair_base_4_rainbow{background-image:url(spritesmith.png);background-position:-1195px -645px;width:60px;height:60px}.customize-option.hair_base_4_red{background-image:url(spritesmith.png);background-position:-1195px -735px;width:60px;height:60px}.customize-option.hair_base_4_white{background-image:url(spritesmith.png);background-position:-1195px -825px;width:60px;height:60px}.customize-option.hair_base_4_winternight{background-image:url(spritesmith.png);background-position:-1195px -915px;width:60px;height:60px}.customize-option.hair_base_4_yellow{background-image:url(spritesmith.png);background-position:-1195px -1005px;width:60px;height:60px}.customize-option.hair_base_5_TRUred{background-image:url(spritesmith.png);background-position:-1195px -1095px;width:60px;height:60px}.customize-option.hair_base_5_black{background-image:url(spritesmith.png);background-position:-25px -1185px;width:60px;height:60px}.customize-option.hair_base_5_blond{background-image:url(spritesmith.png);background-position:-115px -1185px;width:60px;height:60px}.customize-option.hair_base_5_blue{background-image:url(spritesmith.png);background-position:-205px -1185px;width:60px;height:60px}.customize-option.hair_base_5_brown{background-image:url(spritesmith.png);background-position:-295px -1185px;width:60px;height:60px}.customize-option.hair_base_5_candycane{background-image:url(spritesmith.png);background-position:-385px -1185px;width:60px;height:60px}.customize-option.hair_base_5_frost{background-image:url(spritesmith.png);background-position:-475px -1185px;width:60px;height:60px}.customize-option.hair_base_5_green{background-image:url(spritesmith.png);background-position:-565px -1185px;width:60px;height:60px}.customize-option.hair_base_5_holly{background-image:url(spritesmith.png);background-position:-655px -1185px;width:60px;height:60px}.customize-option.hair_base_5_purple{background-image:url(spritesmith.png);background-position:-745px -1185px;width:60px;height:60px}.customize-option.hair_base_5_rainbow{background-image:url(spritesmith.png);background-position:-835px -1185px;width:60px;height:60px}.customize-option.hair_base_5_red{background-image:url(spritesmith.png);background-position:-925px -1185px;width:60px;height:60px}.customize-option.hair_base_5_white{background-image:url(spritesmith.png);background-position:-1015px -1185px;width:60px;height:60px}.customize-option.hair_base_5_winternight{background-image:url(spritesmith.png);background-position:-1105px -1185px;width:60px;height:60px}.customize-option.hair_base_5_yellow{background-image:url(spritesmith.png);background-position:-1195px -1185px;width:60px;height:60px}.customize-option.hair_base_6_TRUred{background-image:url(spritesmith.png);background-position:-1285px -15px;width:60px;height:60px}.customize-option.hair_base_6_black{background-image:url(spritesmith.png);background-position:-1285px -105px;width:60px;height:60px}.customize-option.hair_base_6_blond{background-image:url(spritesmith.png);background-position:-1285px -195px;width:60px;height:60px}.customize-option.hair_base_6_blue{background-image:url(spritesmith.png);background-position:-1285px -285px;width:60px;height:60px}.customize-option.hair_base_6_brown{background-image:url(spritesmith.png);background-position:-1285px -375px;width:60px;height:60px}.customize-option.hair_base_6_candycane{background-image:url(spritesmith.png);background-position:-1285px -465px;width:60px;height:60px}.customize-option.hair_base_6_frost{background-image:url(spritesmith.png);background-position:-1285px -555px;width:60px;height:60px}.customize-option.hair_base_6_green{background-image:url(spritesmith.png);background-position:-1285px -645px;width:60px;height:60px}.customize-option.hair_base_6_holly{background-image:url(spritesmith.png);background-position:-1285px -735px;width:60px;height:60px}.customize-option.hair_base_6_purple{background-image:url(spritesmith.png);background-position:-1285px -825px;width:60px;height:60px}.customize-option.hair_base_6_rainbow{background-image:url(spritesmith.png);background-position:-1285px -915px;width:60px;height:60px}.customize-option.hair_base_6_red{background-image:url(spritesmith.png);background-position:-1285px -1005px;width:60px;height:60px}.customize-option.hair_base_6_white{background-image:url(spritesmith.png);background-position:-1285px -1095px;width:60px;height:60px}.customize-option.hair_base_6_winternight{background-image:url(spritesmith.png);background-position:-1285px -1185px;width:60px;height:60px}.customize-option.hair_base_6_yellow{background-image:url(spritesmith.png);background-position:-25px -1275px;width:60px;height:60px}.customize-option.hair_base_7_TRUred{background-image:url(spritesmith.png);background-position:-115px -1275px;width:60px;height:60px}.customize-option.hair_base_7_black{background-image:url(spritesmith.png);background-position:-205px -1275px;width:60px;height:60px}.customize-option.hair_base_7_blond{background-image:url(spritesmith.png);background-position:-295px -1275px;width:60px;height:60px}.customize-option.hair_base_7_blue{background-image:url(spritesmith.png);background-position:-385px -1275px;width:60px;height:60px}.customize-option.hair_base_7_brown{background-image:url(spritesmith.png);background-position:-475px -1275px;width:60px;height:60px}.customize-option.hair_base_7_candycane{background-image:url(spritesmith.png);background-position:-565px -1275px;width:60px;height:60px}.customize-option.hair_base_7_frost{background-image:url(spritesmith.png);background-position:-655px -1275px;width:60px;height:60px}.customize-option.hair_base_7_green{background-image:url(spritesmith.png);background-position:-745px -1275px;width:60px;height:60px}.customize-option.hair_base_7_holly{background-image:url(spritesmith.png);background-position:-835px -1275px;width:60px;height:60px}.customize-option.hair_base_7_purple{background-image:url(spritesmith.png);background-position:-925px -1275px;width:60px;height:60px}.customize-option.hair_base_7_rainbow{background-image:url(spritesmith.png);background-position:-1015px -1275px;width:60px;height:60px}.customize-option.hair_base_7_red{background-image:url(spritesmith.png);background-position:-1105px -1275px;width:60px;height:60px}.customize-option.hair_base_7_white{background-image:url(spritesmith.png);background-position:-1195px -1275px;width:60px;height:60px}.customize-option.hair_base_7_winternight{background-image:url(spritesmith.png);background-position:-1285px -1275px;width:60px;height:60px}.customize-option.hair_base_7_yellow{background-image:url(spritesmith.png);background-position:-1375px -15px;width:60px;height:60px}.customize-option.hair_base_8_TRUred{background-image:url(spritesmith.png);background-position:-1375px -105px;width:60px;height:60px}.customize-option.hair_base_8_black{background-image:url(spritesmith.png);background-position:-1375px -195px;width:60px;height:60px}.customize-option.hair_base_8_blond{background-image:url(spritesmith.png);background-position:-1375px -285px;width:60px;height:60px}.customize-option.hair_base_8_blue{background-image:url(spritesmith.png);background-position:-1375px -375px;width:60px;height:60px}.customize-option.hair_base_8_brown{background-image:url(spritesmith.png);background-position:-1375px -465px;width:60px;height:60px}.customize-option.hair_base_8_candycane{background-image:url(spritesmith.png);background-position:-1375px -555px;width:60px;height:60px}.customize-option.hair_base_8_frost{background-image:url(spritesmith.png);background-position:-1375px -645px;width:60px;height:60px}.customize-option.hair_base_8_green{background-image:url(spritesmith.png);background-position:-1375px -735px;width:60px;height:60px}.customize-option.hair_base_8_holly{background-image:url(spritesmith.png);background-position:-1375px -825px;width:60px;height:60px}.customize-option.hair_base_8_purple{background-image:url(spritesmith.png);background-position:-1375px -915px;width:60px;height:60px}.customize-option.hair_base_8_rainbow{background-image:url(spritesmith.png);background-position:-1375px -1005px;width:60px;height:60px}.customize-option.hair_base_8_red{background-image:url(spritesmith.png);background-position:-1375px -1095px;width:60px;height:60px}.customize-option.hair_base_8_white{background-image:url(spritesmith.png);background-position:-1375px -1185px;width:60px;height:60px}.customize-option.hair_base_8_winternight{background-image:url(spritesmith.png);background-position:-1375px -1275px;width:60px;height:60px}.customize-option.hair_base_8_yellow{background-image:url(spritesmith.png);background-position:-25px -1365px;width:60px;height:60px}.customize-option.head_0{background-image:url(spritesmith.png);background-position:-1465px -645px;width:60px;height:60px}.customize-option.skin_0ff591{background-image:url(spritesmith.png);background-position:-115px -1365px;width:60px;height:60px}.customize-option.skin_2b43f6{background-image:url(spritesmith.png);background-position:-205px -1365px;width:60px;height:60px}.customize-option.skin_6bd049{background-image:url(spritesmith.png);background-position:-295px -1365px;width:60px;height:60px}.customize-option.skin_800ed0{background-image:url(spritesmith.png);background-position:-385px -1365px;width:60px;height:60px}.customize-option.skin_915533{background-image:url(spritesmith.png);background-position:-475px -1365px;width:60px;height:60px}.customize-option.skin_98461a{background-image:url(spritesmith.png);background-position:-565px -1365px;width:60px;height:60px}.customize-option.skin_c06534{background-image:url(spritesmith.png);background-position:-655px -1365px;width:60px;height:60px}.customize-option.skin_c3e1dc{background-image:url(spritesmith.png);background-position:-745px -1365px;width:60px;height:60px}.customize-option.skin_d7a9f7{background-image:url(spritesmith.png);background-position:-835px -1365px;width:60px;height:60px}.customize-option.skin_ddc994{background-image:url(spritesmith.png);background-position:-925px -1365px;width:60px;height:60px}.customize-option.skin_ea8349{background-image:url(spritesmith.png);background-position:-1015px -1365px;width:60px;height:60px}.customize-option.skin_eb052b{background-image:url(spritesmith.png);background-position:-1105px -1365px;width:60px;height:60px}.customize-option.skin_f5a76e{background-image:url(spritesmith.png);background-position:-1195px -1365px;width:60px;height:60px}.customize-option.skin_f5d70f{background-image:url(spritesmith.png);background-position:-1285px -1365px;width:60px;height:60px}.customize-option.skin_f69922{background-image:url(spritesmith.png);background-position:-1375px -1365px;width:60px;height:60px}.customize-option.skin_ghost{background-image:url(spritesmith.png);background-position:-1465px -15px;width:60px;height:60px}.customize-option.skin_monster{background-image:url(spritesmith.png);background-position:-1465px -105px;width:60px;height:60px}.customize-option.skin_pumpkin{background-image:url(spritesmith.png);background-position:-1465px -195px;width:60px;height:60px}.customize-option.skin_rainbow{background-image:url(spritesmith.png);background-position:-1465px -285px;width:60px;height:60px}.customize-option.skin_shadow{background-image:url(spritesmith.png);background-position:-1465px -375px;width:60px;height:60px}.customize-option.skin_skeleton{background-image:url(spritesmith.png);background-position:-1465px -465px;width:60px;height:60px}.customize-option.skin_zombie{background-image:url(spritesmith.png);background-position:-1465px -555px;width:60px;height:60px}.achievement-alien{background-image:url(spritesmith.png);background-position:-2688px -2610px;width:24px;height:26px}.achievement-armor{background-image:url(spritesmith.png);background-position:-2745px -1448px;width:24px;height:26px}.achievement-boot{background-image:url(spritesmith.png);background-position:-2748px -1376px;width:24px;height:26px}.achievement-bow{background-image:url(spritesmith.png);background-position:-2745px -1422px;width:24px;height:26px}.achievement-cactus{background-image:url(spritesmith.png);background-position:-2739px -1590px;width:24px;height:26px}.achievement-cake{background-image:url(spritesmith.png);background-position:-2556px -2430px;width:24px;height:26px}.achievement-cave{background-image:url(spritesmith.png);background-position:-2148px -2070px;width:24px;height:26px}.achievement-coffin{background-image:url(spritesmith.png);background-position:-2286px -2160px;width:24px;height:26px}.achievement-comment{background-image:url(spritesmith.png);background-position:-2262px -2160px;width:24px;height:26px}.achievement-firefox{background-image:url(spritesmith.png);background-position:-2238px -2160px;width:24px;height:26px}.achievement-habitBirthday{background-image:url(spritesmith.png);background-position:-2376px -2250px;width:24px;height:26px}.achievement-heart{background-image:url(spritesmith.png);background-position:-2352px -2250px;width:24px;height:26px}.achievement-helm{background-image:url(spritesmith.png);background-position:-2328px -2250px;width:24px;height:26px}.achievement-karaoke{background-image:url(spritesmith.png);background-position:-2466px -2340px;width:24px;height:26px}.achievement-ninja{background-image:url(spritesmith.png);background-position:-2442px -2340px;width:24px;height:26px}.achievement-perfect{background-image:url(spritesmith.png);background-position:-2418px -2340px;width:24px;height:26px}.achievement-rat{background-image:url(spritesmith.png);background-position:-2748px -1350px;width:24px;height:26px}.achievement-shield{background-image:url(spritesmith.png);background-position:-2532px -2430px;width:24px;height:26px}.achievement-snowball{background-image:url(spritesmith.png);background-position:-2508px -2430px;width:24px;height:26px}.achievement-sun{background-image:url(spritesmith.png);background-position:-2646px -2520px;width:24px;height:26px}.achievement-sword{background-image:url(spritesmith.png);background-position:-2622px -2520px;width:24px;height:26px}.achievement-thermometer{background-image:url(spritesmith.png);background-position:-2598px -2520px;width:24px;height:26px}.achievement-tree{background-image:url(spritesmith.png);background-position:-2736px -2610px;width:24px;height:26px}.achievement-valentine{background-image:url(spritesmith.png);background-position:-2712px -2610px;width:24px;height:26px}.broad_armor_healer_1{background-image:url(spritesmith.png);background-position:-2148px 0;width:90px;height:90px}.broad_armor_healer_2{background-image:url(spritesmith.png);background-position:-2148px -90px;width:90px;height:90px}.broad_armor_healer_3{background-image:url(spritesmith.png);background-position:-2148px -180px;width:90px;height:90px}.broad_armor_healer_4{background-image:url(spritesmith.png);background-position:-2148px -270px;width:90px;height:90px}.broad_armor_healer_5{background-image:url(spritesmith.png);background-position:-2148px -360px;width:90px;height:90px}.broad_armor_rogue_1{background-image:url(spritesmith.png);background-position:-2148px -450px;width:90px;height:90px}.broad_armor_rogue_2{background-image:url(spritesmith.png);background-position:-2148px -540px;width:90px;height:90px}.broad_armor_rogue_3{background-image:url(spritesmith.png);background-position:-2148px -630px;width:90px;height:90px}.broad_armor_rogue_4{background-image:url(spritesmith.png);background-position:-2148px -720px;width:90px;height:90px}.broad_armor_rogue_5{background-image:url(spritesmith.png);background-position:-2148px -810px;width:90px;height:90px}.broad_armor_special_2{background-image:url(spritesmith.png);background-position:-2148px -900px;width:90px;height:90px}.broad_armor_special_birthday{background-image:url(spritesmith.png);background-position:-2148px -990px;width:90px;height:90px}.broad_armor_special_candycane{background-image:url(spritesmith.png);background-position:-2148px -1080px;width:90px;height:90px}.broad_armor_special_ski{background-image:url(spritesmith.png);background-position:-2148px -1170px;width:90px;height:90px}.broad_armor_special_snowflake{background-image:url(spritesmith.png);background-position:-2148px -1260px;width:90px;height:90px}.broad_armor_special_tarutaru{background-image:url(spritesmith.png);background-position:-2148px -1350px;width:90px;height:90px}.broad_armor_special_yeti{background-image:url(spritesmith.png);background-position:-2148px -1440px;width:90px;height:90px}.broad_armor_warrior_1{background-image:url(spritesmith.png);background-position:-2148px -1530px;width:90px;height:90px}.broad_armor_warrior_2{background-image:url(spritesmith.png);background-position:-2148px -1620px;width:90px;height:90px}.broad_armor_warrior_3{background-image:url(spritesmith.png);background-position:-2148px -1710px;width:90px;height:90px}.broad_armor_warrior_4{background-image:url(spritesmith.png);background-position:-2148px -1800px;width:90px;height:90px}.broad_armor_warrior_5{background-image:url(spritesmith.png);background-position:-2148px -1890px;width:90px;height:90px}.broad_armor_wizard_1{background-image:url(spritesmith.png);background-position:-2148px -1980px;width:90px;height:90px}.broad_armor_wizard_2{background-image:url(spritesmith.png);background-position:0 -2100px;width:90px;height:90px}.broad_armor_wizard_3{background-image:url(spritesmith.png);background-position:-90px -2100px;width:90px;height:90px}.broad_armor_wizard_4{background-image:url(spritesmith.png);background-position:-180px -2100px;width:90px;height:90px}.broad_armor_wizard_5{background-image:url(spritesmith.png);background-position:-270px -2100px;width:90px;height:90px}.slim_armor_healer_1{background-image:url(spritesmith.png);background-position:-360px -2100px;width:90px;height:90px}.slim_armor_healer_2{background-image:url(spritesmith.png);background-position:-450px -2100px;width:90px;height:90px}.slim_armor_healer_3{background-image:url(spritesmith.png);background-position:-540px -2100px;width:90px;height:90px}.slim_armor_healer_4{background-image:url(spritesmith.png);background-position:-630px -2100px;width:90px;height:90px}.slim_armor_healer_5{background-image:url(spritesmith.png);background-position:-720px -2100px;width:90px;height:90px}.slim_armor_rogue_1{background-image:url(spritesmith.png);background-position:-810px -2100px;width:90px;height:90px}.slim_armor_rogue_2{background-image:url(spritesmith.png);background-position:-900px -2100px;width:90px;height:90px}.slim_armor_rogue_3{background-image:url(spritesmith.png);background-position:-990px -2100px;width:90px;height:90px}.slim_armor_rogue_4{background-image:url(spritesmith.png);background-position:-1080px -2100px;width:90px;height:90px}.slim_armor_rogue_5{background-image:url(spritesmith.png);background-position:-1170px -2100px;width:90px;height:90px}.slim_armor_special_2{background-image:url(spritesmith.png);background-position:-1260px -2100px;width:90px;height:90px}.slim_armor_special_birthday{background-image:url(spritesmith.png);background-position:-1350px -2100px;width:90px;height:90px}.slim_armor_special_candycane{background-image:url(spritesmith.png);background-position:-1440px -2100px;width:90px;height:90px}.slim_armor_special_ski{background-image:url(spritesmith.png);background-position:-1530px -2100px;width:90px;height:90px}.slim_armor_special_snowflake{background-image:url(spritesmith.png);background-position:-1620px -2100px;width:90px;height:90px}.slim_armor_special_yeti{background-image:url(spritesmith.png);background-position:-1710px -2100px;width:90px;height:90px}.slim_armor_warrior_1{background-image:url(spritesmith.png);background-position:-1800px -2100px;width:90px;height:90px}.slim_armor_warrior_2{background-image:url(spritesmith.png);background-position:-1890px -2100px;width:90px;height:90px}.slim_armor_warrior_3{background-image:url(spritesmith.png);background-position:-1980px -2100px;width:90px;height:90px}.slim_armor_warrior_4{background-image:url(spritesmith.png);background-position:-2070px -2100px;width:90px;height:90px}.slim_armor_warrior_5{background-image:url(spritesmith.png);background-position:-2238px 0;width:90px;height:90px}.slim_armor_wizard_1{background-image:url(spritesmith.png);background-position:-2238px -90px;width:90px;height:90px}.slim_armor_wizard_2{background-image:url(spritesmith.png);background-position:-2238px -180px;width:90px;height:90px}.slim_armor_wizard_3{background-image:url(spritesmith.png);background-position:-2238px -270px;width:90px;height:90px}.slim_armor_wizard_4{background-image:url(spritesmith.png);background-position:-2238px -360px;width:90px;height:90px}.slim_armor_wizard_5{background-image:url(spritesmith.png);background-position:-2238px -450px;width:90px;height:90px}.beard_{background-image:url(spritesmith.png);background-position:-2238px -540px;width:90px;height:90px}.hair_beard_1_TRUred{background-image:url(spritesmith.png);background-position:-2238px -630px;width:90px;height:90px}.hair_beard_1_black{background-image:url(spritesmith.png);background-position:-2238px -720px;width:90px;height:90px}.hair_beard_1_blond{background-image:url(spritesmith.png);background-position:-2238px -900px;width:90px;height:90px}.hair_beard_1_blue{background-image:url(spritesmith.png);background-position:-2238px -990px;width:90px;height:90px}.hair_beard_1_brown{background-image:url(spritesmith.png);background-position:-2238px -1080px;width:90px;height:90px}.hair_beard_1_candycane{background-image:url(spritesmith.png);background-position:-2238px -1170px;width:90px;height:90px}.hair_beard_1_frost{background-image:url(spritesmith.png);background-position:-2238px -1260px;width:90px;height:90px}.hair_beard_1_green{background-image:url(spritesmith.png);background-position:-2238px -1350px;width:90px;height:90px}.hair_beard_1_holly{background-image:url(spritesmith.png);background-position:-2238px -1440px;width:90px;height:90px}.hair_beard_1_purple{background-image:url(spritesmith.png);background-position:-2238px -1530px;width:90px;height:90px}.hair_beard_1_rainbow{background-image:url(spritesmith.png);background-position:-2238px -1620px;width:90px;height:90px}.hair_beard_1_red{background-image:url(spritesmith.png);background-position:-2238px -1710px;width:90px;height:90px}.hair_beard_1_white{background-image:url(spritesmith.png);background-position:-2238px -1800px;width:90px;height:90px}.hair_beard_1_winternight{background-image:url(spritesmith.png);background-position:-2238px -1890px;width:90px;height:90px}.hair_beard_1_yellow{background-image:url(spritesmith.png);background-position:-2238px -1980px;width:90px;height:90px}.hair_beard_2_TRUred{background-image:url(spritesmith.png);background-position:-2238px -2070px;width:90px;height:90px}.hair_beard_2_black{background-image:url(spritesmith.png);background-position:0 -2190px;width:90px;height:90px}.hair_beard_2_blond{background-image:url(spritesmith.png);background-position:-90px -2190px;width:90px;height:90px}.hair_beard_2_blue{background-image:url(spritesmith.png);background-position:-180px -2190px;width:90px;height:90px}.hair_beard_2_brown{background-image:url(spritesmith.png);background-position:-270px -2190px;width:90px;height:90px}.hair_beard_2_candycane{background-image:url(spritesmith.png);background-position:-360px -2190px;width:90px;height:90px}.hair_beard_2_frost{background-image:url(spritesmith.png);background-position:-450px -2190px;width:90px;height:90px}.hair_beard_2_green{background-image:url(spritesmith.png);background-position:-540px -2190px;width:90px;height:90px}.hair_beard_2_holly{background-image:url(spritesmith.png);background-position:-630px -2190px;width:90px;height:90px}.hair_beard_2_purple{background-image:url(spritesmith.png);background-position:-720px -2190px;width:90px;height:90px}.hair_beard_2_rainbow{background-image:url(spritesmith.png);background-position:-810px -2190px;width:90px;height:90px}.hair_beard_2_red{background-image:url(spritesmith.png);background-position:-900px -2190px;width:90px;height:90px}.hair_beard_2_white{background-image:url(spritesmith.png);background-position:-990px -2190px;width:90px;height:90px}.hair_beard_2_winternight{background-image:url(spritesmith.png);background-position:-1080px -2190px;width:90px;height:90px}.hair_beard_2_yellow{background-image:url(spritesmith.png);background-position:-1170px -2190px;width:90px;height:90px}.hair_beard_3_TRUred{background-image:url(spritesmith.png);background-position:-1260px -2190px;width:90px;height:90px}.hair_beard_3_black{background-image:url(spritesmith.png);background-position:-1350px -2190px;width:90px;height:90px}.hair_beard_3_blond{background-image:url(spritesmith.png);background-position:-1440px -2190px;width:90px;height:90px}.hair_beard_3_blue{background-image:url(spritesmith.png);background-position:-1530px -2190px;width:90px;height:90px}.hair_beard_3_brown{background-image:url(spritesmith.png);background-position:-1620px -2190px;width:90px;height:90px}.hair_beard_3_candycane{background-image:url(spritesmith.png);background-position:-1710px -2190px;width:90px;height:90px}.hair_beard_3_frost{background-image:url(spritesmith.png);background-position:-1800px -2190px;width:90px;height:90px}.hair_beard_3_green{background-image:url(spritesmith.png);background-position:-1890px -2190px;width:90px;height:90px}.hair_beard_3_holly{background-image:url(spritesmith.png);background-position:-1980px -2190px;width:90px;height:90px}.hair_beard_3_purple{background-image:url(spritesmith.png);background-position:-2070px -2190px;width:90px;height:90px}.hair_beard_3_rainbow{background-image:url(spritesmith.png);background-position:-2160px -2190px;width:90px;height:90px}.hair_beard_3_red{background-image:url(spritesmith.png);background-position:-2328px 0;width:90px;height:90px}.hair_beard_3_white{background-image:url(spritesmith.png);background-position:-2328px -90px;width:90px;height:90px}.hair_beard_3_winternight{background-image:url(spritesmith.png);background-position:-2328px -180px;width:90px;height:90px}.hair_beard_3_yellow{background-image:url(spritesmith.png);background-position:-2328px -270px;width:90px;height:90px}.hair_mustache_1_TRUred{background-image:url(spritesmith.png);background-position:-2328px -360px;width:90px;height:90px}.hair_mustache_1_black{background-image:url(spritesmith.png);background-position:-2328px -450px;width:90px;height:90px}.hair_mustache_1_blond{background-image:url(spritesmith.png);background-position:-2328px -540px;width:90px;height:90px}.hair_mustache_1_blue{background-image:url(spritesmith.png);background-position:-2328px -630px;width:90px;height:90px}.hair_mustache_1_brown{background-image:url(spritesmith.png);background-position:-2328px -720px;width:90px;height:90px}.hair_mustache_1_candycane{background-image:url(spritesmith.png);background-position:-2328px -810px;width:90px;height:90px}.hair_mustache_1_frost{background-image:url(spritesmith.png);background-position:-2328px -900px;width:90px;height:90px}.hair_mustache_1_green{background-image:url(spritesmith.png);background-position:-2328px -990px;width:90px;height:90px}.hair_mustache_1_holly{background-image:url(spritesmith.png);background-position:-2328px -1080px;width:90px;height:90px}.hair_mustache_1_purple{background-image:url(spritesmith.png);background-position:-2328px -1170px;width:90px;height:90px}.hair_mustache_1_rainbow{background-image:url(spritesmith.png);background-position:-2328px -1260px;width:90px;height:90px}.hair_mustache_1_red{background-image:url(spritesmith.png);background-position:-2328px -1350px;width:90px;height:90px}.hair_mustache_1_white{background-image:url(spritesmith.png);background-position:-2328px -1440px;width:90px;height:90px}.hair_mustache_1_winternight{background-image:url(spritesmith.png);background-position:-2328px -1530px;width:90px;height:90px}.hair_mustache_1_yellow{background-image:url(spritesmith.png);background-position:-2328px -1620px;width:90px;height:90px}.hair_mustache_2_TRUred{background-image:url(spritesmith.png);background-position:-2328px -1710px;width:90px;height:90px}.hair_mustache_2_black{background-image:url(spritesmith.png);background-position:-2328px -1800px;width:90px;height:90px}.hair_mustache_2_blond{background-image:url(spritesmith.png);background-position:-2328px -1890px;width:90px;height:90px}.hair_mustache_2_blue{background-image:url(spritesmith.png);background-position:-2328px -1980px;width:90px;height:90px}.hair_mustache_2_brown{background-image:url(spritesmith.png);background-position:-2328px -2070px;width:90px;height:90px}.hair_mustache_2_candycane{background-image:url(spritesmith.png);background-position:-2328px -2160px;width:90px;height:90px}.hair_mustache_2_frost{background-image:url(spritesmith.png);background-position:0 -2280px;width:90px;height:90px}.hair_mustache_2_green{background-image:url(spritesmith.png);background-position:-90px -2280px;width:90px;height:90px}.hair_mustache_2_holly{background-image:url(spritesmith.png);background-position:-180px -2280px;width:90px;height:90px}.hair_mustache_2_purple{background-image:url(spritesmith.png);background-position:-270px -2280px;width:90px;height:90px}.hair_mustache_2_rainbow{background-image:url(spritesmith.png);background-position:-360px -2280px;width:90px;height:90px}.hair_mustache_2_red{background-image:url(spritesmith.png);background-position:-450px -2280px;width:90px;height:90px}.hair_mustache_2_white{background-image:url(spritesmith.png);background-position:-540px -2280px;width:90px;height:90px}.hair_mustache_2_winternight{background-image:url(spritesmith.png);background-position:-630px -2280px;width:90px;height:90px}.hair_mustache_2_yellow{background-image:url(spritesmith.png);background-position:-720px -2280px;width:90px;height:90px}.hair_bangs_1_TRUred{background-image:url(spritesmith.png);background-position:-810px -2280px;width:90px;height:90px}.hair_bangs_1_black{background-image:url(spritesmith.png);background-position:-900px -2280px;width:90px;height:90px}.hair_bangs_1_blond{background-image:url(spritesmith.png);background-position:-990px -2280px;width:90px;height:90px}.hair_bangs_1_blue{background-image:url(spritesmith.png);background-position:-1080px -2280px;width:90px;height:90px}.hair_bangs_1_brown{background-image:url(spritesmith.png);background-position:-1170px -2280px;width:90px;height:90px}.hair_bangs_1_candycane{background-image:url(spritesmith.png);background-position:-1260px -2280px;width:90px;height:90px}.hair_bangs_1_frost{background-image:url(spritesmith.png);background-position:-1350px -2280px;width:90px;height:90px}.hair_bangs_1_green{background-image:url(spritesmith.png);background-position:-1440px -2280px;width:90px;height:90px}.hair_bangs_1_holly{background-image:url(spritesmith.png);background-position:-1530px -2280px;width:90px;height:90px}.hair_bangs_1_purple{background-image:url(spritesmith.png);background-position:-1620px -2280px;width:90px;height:90px}.hair_bangs_1_rainbow{background-image:url(spritesmith.png);background-position:-1710px -2280px;width:90px;height:90px}.hair_bangs_1_red{background-image:url(spritesmith.png);background-position:-1800px -2280px;width:90px;height:90px}.hair_bangs_1_white{background-image:url(spritesmith.png);background-position:-1890px -2280px;width:90px;height:90px}.hair_bangs_1_winternight{background-image:url(spritesmith.png);background-position:-1980px -2280px;width:90px;height:90px}.hair_bangs_1_yellow{background-image:url(spritesmith.png);background-position:-2070px -2280px;width:90px;height:90px}.hair_bangs_2_TRUred{background-image:url(spritesmith.png);background-position:-2160px -2280px;width:90px;height:90px}.hair_bangs_2_black{background-image:url(spritesmith.png);background-position:-2250px -2280px;width:90px;height:90px}.hair_bangs_2_blond{background-image:url(spritesmith.png);background-position:-2418px 0;width:90px;height:90px}.hair_bangs_2_blue{background-image:url(spritesmith.png);background-position:-2418px -90px;width:90px;height:90px}.hair_bangs_2_brown{background-image:url(spritesmith.png);background-position:-2418px -180px;width:90px;height:90px}.hair_bangs_2_candycane{background-image:url(spritesmith.png);background-position:-2418px -270px;width:90px;height:90px}.hair_bangs_2_frost{background-image:url(spritesmith.png);background-position:-2418px -360px;width:90px;height:90px}.hair_bangs_2_green{background-image:url(spritesmith.png);background-position:-2418px -450px;width:90px;height:90px}.hair_bangs_2_holly{background-image:url(spritesmith.png);background-position:-2418px -540px;width:90px;height:90px}.hair_bangs_2_purple{background-image:url(spritesmith.png);background-position:-2418px -630px;width:90px;height:90px}.hair_bangs_2_rainbow{background-image:url(spritesmith.png);background-position:-2418px -720px;width:90px;height:90px}.hair_bangs_2_red{background-image:url(spritesmith.png);background-position:-2418px -810px;width:90px;height:90px}.hair_bangs_2_white{background-image:url(spritesmith.png);background-position:-2418px -900px;width:90px;height:90px}.hair_bangs_2_winternight{background-image:url(spritesmith.png);background-position:-2418px -990px;width:90px;height:90px}.hair_bangs_2_yellow{background-image:url(spritesmith.png);background-position:-2418px -1080px;width:90px;height:90px}.hair_bangs_3_TRUred{background-image:url(spritesmith.png);background-position:-2418px -1170px;width:90px;height:90px}.hair_bangs_3_black{background-image:url(spritesmith.png);background-position:-2418px -1260px;width:90px;height:90px}.hair_bangs_3_blond{background-image:url(spritesmith.png);background-position:-2418px -1350px;width:90px;height:90px}.hair_bangs_3_blue{background-image:url(spritesmith.png);background-position:-2418px -1440px;width:90px;height:90px}.hair_bangs_3_brown{background-image:url(spritesmith.png);background-position:-2418px -1530px;width:90px;height:90px}.hair_bangs_3_candycane{background-image:url(spritesmith.png);background-position:-2418px -1620px;width:90px;height:90px}.hair_bangs_3_frost{background-image:url(spritesmith.png);background-position:-2418px -1710px;width:90px;height:90px}.hair_bangs_3_green{background-image:url(spritesmith.png);background-position:-2418px -1800px;width:90px;height:90px}.hair_bangs_3_holly{background-image:url(spritesmith.png);background-position:-2418px -1890px;width:90px;height:90px}.hair_bangs_3_purple{background-image:url(spritesmith.png);background-position:-2418px -1980px;width:90px;height:90px}.hair_bangs_3_rainbow{background-image:url(spritesmith.png);background-position:-2418px -2070px;width:90px;height:90px}.hair_bangs_3_red{background-image:url(spritesmith.png);background-position:-2418px -2160px;width:90px;height:90px}.hair_bangs_3_white{background-image:url(spritesmith.png);background-position:-2418px -2250px;width:90px;height:90px}.hair_bangs_3_winternight{background-image:url(spritesmith.png);background-position:0 -2370px;width:90px;height:90px}.hair_bangs_3_yellow{background-image:url(spritesmith.png);background-position:-90px -2370px;width:90px;height:90px}.hair_base_1_TRUred{background-image:url(spritesmith.png);background-position:-180px -2370px;width:90px;height:90px}.hair_base_1_black{background-image:url(spritesmith.png);background-position:-270px -2370px;width:90px;height:90px}.hair_base_1_blond{background-image:url(spritesmith.png);background-position:-360px -2370px;width:90px;height:90px}.hair_base_1_blue{background-image:url(spritesmith.png);background-position:-450px -2370px;width:90px;height:90px}.hair_base_1_brown{background-image:url(spritesmith.png);background-position:-540px -2370px;width:90px;height:90px}.hair_base_1_candycane{background-image:url(spritesmith.png);background-position:-630px -2370px;width:90px;height:90px}.hair_base_1_frost{background-image:url(spritesmith.png);background-position:-720px -2370px;width:90px;height:90px}.hair_base_1_green{background-image:url(spritesmith.png);background-position:-900px -2370px;width:90px;height:90px}.hair_base_1_holly{background-image:url(spritesmith.png);background-position:-990px -2370px;width:90px;height:90px}.hair_base_1_purple{background-image:url(spritesmith.png);background-position:-1080px -2370px;width:90px;height:90px}.hair_base_1_rainbow{background-image:url(spritesmith.png);background-position:-1260px -2370px;width:90px;height:90px}.hair_base_1_red{background-image:url(spritesmith.png);background-position:-1350px -2370px;width:90px;height:90px}.hair_base_1_white{background-image:url(spritesmith.png);background-position:-1440px -2370px;width:90px;height:90px}.hair_base_1_winternight{background-image:url(spritesmith.png);background-position:-1530px -2370px;width:90px;height:90px}.hair_base_1_yellow{background-image:url(spritesmith.png);background-position:-1620px -2370px;width:90px;height:90px}.hair_base_2_TRUred{background-image:url(spritesmith.png);background-position:-1710px -2370px;width:90px;height:90px}.hair_base_2_black{background-image:url(spritesmith.png);background-position:-1800px -2370px;width:90px;height:90px}.hair_base_2_blond{background-image:url(spritesmith.png);background-position:-1890px -2370px;width:90px;height:90px}.hair_base_2_blue{background-image:url(spritesmith.png);background-position:-1980px -2370px;width:90px;height:90px}.hair_base_2_brown{background-image:url(spritesmith.png);background-position:-2070px -2370px;width:90px;height:90px}.hair_base_2_candycane{background-image:url(spritesmith.png);background-position:-2160px -2370px;width:90px;height:90px}.hair_base_2_frost{background-image:url(spritesmith.png);background-position:-2250px -2370px;width:90px;height:90px}.hair_base_2_green{background-image:url(spritesmith.png);background-position:-2340px -2370px;width:90px;height:90px}.hair_base_2_holly{background-image:url(spritesmith.png);background-position:-2508px 0;width:90px;height:90px}.hair_base_2_purple{background-image:url(spritesmith.png);background-position:-2508px -90px;width:90px;height:90px}.hair_base_2_rainbow{background-image:url(spritesmith.png);background-position:-2508px -180px;width:90px;height:90px}.hair_base_2_red{background-image:url(spritesmith.png);background-position:-2508px -270px;width:90px;height:90px}.hair_base_2_white{background-image:url(spritesmith.png);background-position:-2508px -360px;width:90px;height:90px}.hair_base_2_winternight{background-image:url(spritesmith.png);background-position:-2508px -450px;width:90px;height:90px}.hair_base_2_yellow{background-image:url(spritesmith.png);background-position:-2508px -540px;width:90px;height:90px}.hair_base_3_TRUred{background-image:url(spritesmith.png);background-position:-2508px -630px;width:90px;height:90px}.hair_base_3_black{background-image:url(spritesmith.png);background-position:-2508px -720px;width:90px;height:90px}.hair_base_3_blond{background-image:url(spritesmith.png);background-position:-2508px -810px;width:90px;height:90px}.hair_base_3_blue{background-image:url(spritesmith.png);background-position:-2508px -900px;width:90px;height:90px}.hair_base_3_brown{background-image:url(spritesmith.png);background-position:-2508px -990px;width:90px;height:90px}.hair_base_3_candycane{background-image:url(spritesmith.png);background-position:-2508px -1080px;width:90px;height:90px}.hair_base_3_frost{background-image:url(spritesmith.png);background-position:-2508px -1260px;width:90px;height:90px}.hair_base_3_green{background-image:url(spritesmith.png);background-position:-2508px -1350px;width:90px;height:90px}.hair_base_3_holly{background-image:url(spritesmith.png);background-position:-2508px -1440px;width:90px;height:90px}.hair_base_3_purple{background-image:url(spritesmith.png);background-position:-2508px -1530px;width:90px;height:90px}.hair_base_3_rainbow{background-image:url(spritesmith.png);background-position:-2508px -1620px;width:90px;height:90px}.hair_base_3_red{background-image:url(spritesmith.png);background-position:-2508px -1710px;width:90px;height:90px}.hair_base_3_white{background-image:url(spritesmith.png);background-position:-2508px -1800px;width:90px;height:90px}.hair_base_3_winternight{background-image:url(spritesmith.png);background-position:-2508px -1890px;width:90px;height:90px}.hair_base_3_yellow{background-image:url(spritesmith.png);background-position:-2508px -1980px;width:90px;height:90px}.hair_base_4_TRUred{background-image:url(spritesmith.png);background-position:-2508px -2070px;width:90px;height:90px}.hair_base_4_black{background-image:url(spritesmith.png);background-position:-2508px -2160px;width:90px;height:90px}.hair_base_4_blond{background-image:url(spritesmith.png);background-position:-2508px -2250px;width:90px;height:90px}.hair_base_4_blue{background-image:url(spritesmith.png);background-position:-2508px -2340px;width:90px;height:90px}.hair_base_4_brown{background-image:url(spritesmith.png);background-position:0 -2460px;width:90px;height:90px}.hair_base_4_candycane{background-image:url(spritesmith.png);background-position:-90px -2460px;width:90px;height:90px}.hair_base_4_frost{background-image:url(spritesmith.png);background-position:-180px -2460px;width:90px;height:90px}.hair_base_4_green{background-image:url(spritesmith.png);background-position:-270px -2460px;width:90px;height:90px}.hair_base_4_holly{background-image:url(spritesmith.png);background-position:-360px -2460px;width:90px;height:90px}.hair_base_4_purple{background-image:url(spritesmith.png);background-position:-450px -2460px;width:90px;height:90px}.hair_base_4_rainbow{background-image:url(spritesmith.png);background-position:-540px -2460px;width:90px;height:90px}.hair_base_4_red{background-image:url(spritesmith.png);background-position:-630px -2460px;width:90px;height:90px}.hair_base_4_white{background-image:url(spritesmith.png);background-position:-720px -2460px;width:90px;height:90px}.hair_base_4_winternight{background-image:url(spritesmith.png);background-position:-810px -2460px;width:90px;height:90px}.hair_base_4_yellow{background-image:url(spritesmith.png);background-position:-900px -2460px;width:90px;height:90px}.hair_base_5_TRUred{background-image:url(spritesmith.png);background-position:-990px -2460px;width:90px;height:90px}.hair_base_5_black{background-image:url(spritesmith.png);background-position:-1080px -2460px;width:90px;height:90px}.hair_base_5_blond{background-image:url(spritesmith.png);background-position:-1170px -2460px;width:90px;height:90px}.hair_base_5_blue{background-image:url(spritesmith.png);background-position:-1260px -2460px;width:90px;height:90px}.hair_base_5_brown{background-image:url(spritesmith.png);background-position:-1350px -2460px;width:90px;height:90px}.hair_base_5_candycane{background-image:url(spritesmith.png);background-position:-1440px -2460px;width:90px;height:90px}.hair_base_5_frost{background-image:url(spritesmith.png);background-position:-1530px -2460px;width:90px;height:90px}.hair_base_5_green{background-image:url(spritesmith.png);background-position:-1620px -2460px;width:90px;height:90px}.hair_base_5_holly{background-image:url(spritesmith.png);background-position:-1710px -2460px;width:90px;height:90px}.hair_base_5_purple{background-image:url(spritesmith.png);background-position:-1800px -2460px;width:90px;height:90px}.hair_base_5_rainbow{background-image:url(spritesmith.png);background-position:-1890px -2460px;width:90px;height:90px}.hair_base_5_red{background-image:url(spritesmith.png);background-position:-1980px -2460px;width:90px;height:90px}.hair_base_5_white{background-image:url(spritesmith.png);background-position:-2070px -2460px;width:90px;height:90px}.hair_base_5_winternight{background-image:url(spritesmith.png);background-position:-2160px -2460px;width:90px;height:90px}.hair_base_5_yellow{background-image:url(spritesmith.png);background-position:-2250px -2460px;width:90px;height:90px}.hair_base_6_TRUred{background-image:url(spritesmith.png);background-position:-2340px -2460px;width:90px;height:90px}.hair_base_6_black{background-image:url(spritesmith.png);background-position:-2430px -2460px;width:90px;height:90px}.hair_base_6_blond{background-image:url(spritesmith.png);background-position:-2598px 0;width:90px;height:90px}.hair_base_6_blue{background-image:url(spritesmith.png);background-position:-2598px -90px;width:90px;height:90px}.hair_base_6_brown{background-image:url(spritesmith.png);background-position:-2598px -180px;width:90px;height:90px}.hair_base_6_candycane{background-image:url(spritesmith.png);background-position:-2598px -270px;width:90px;height:90px}.hair_base_6_frost{background-image:url(spritesmith.png);background-position:-2598px -360px;width:90px;height:90px}.hair_base_6_green{background-image:url(spritesmith.png);background-position:-2598px -450px;width:90px;height:90px}.hair_base_6_holly{background-image:url(spritesmith.png);background-position:-2598px -540px;width:90px;height:90px}.hair_base_6_purple{background-image:url(spritesmith.png);background-position:-2598px -630px;width:90px;height:90px}.hair_base_6_rainbow{background-image:url(spritesmith.png);background-position:-2598px -720px;width:90px;height:90px}.hair_base_6_red{background-image:url(spritesmith.png);background-position:-2598px -810px;width:90px;height:90px}.hair_base_6_white{background-image:url(spritesmith.png);background-position:-2598px -900px;width:90px;height:90px}.hair_base_6_winternight{background-image:url(spritesmith.png);background-position:-2598px -990px;width:90px;height:90px}.hair_base_6_yellow{background-image:url(spritesmith.png);background-position:-2598px -1080px;width:90px;height:90px}.hair_base_7_TRUred{background-image:url(spritesmith.png);background-position:-2598px -1170px;width:90px;height:90px}.hair_base_7_black{background-image:url(spritesmith.png);background-position:-2598px -1260px;width:90px;height:90px}.hair_base_7_blond{background-image:url(spritesmith.png);background-position:-2598px -1350px;width:90px;height:90px}.hair_base_7_blue{background-image:url(spritesmith.png);background-position:-2598px -1440px;width:90px;height:90px}.hair_base_7_brown{background-image:url(spritesmith.png);background-position:-2598px -1530px;width:90px;height:90px}.hair_base_7_candycane{background-image:url(spritesmith.png);background-position:-2598px -1620px;width:90px;height:90px}.hair_base_7_frost{background-image:url(spritesmith.png);background-position:-2598px -1710px;width:90px;height:90px}.hair_base_7_green{background-image:url(spritesmith.png);background-position:-2598px -1800px;width:90px;height:90px}.hair_base_7_holly{background-image:url(spritesmith.png);background-position:-2598px -1890px;width:90px;height:90px}.hair_base_7_purple{background-image:url(spritesmith.png);background-position:-2598px -1980px;width:90px;height:90px}.hair_base_7_rainbow{background-image:url(spritesmith.png);background-position:-2598px -2070px;width:90px;height:90px}.hair_base_7_red{background-image:url(spritesmith.png);background-position:-2598px -2160px;width:90px;height:90px}.hair_base_7_white{background-image:url(spritesmith.png);background-position:-2598px -2250px;width:90px;height:90px}.hair_base_7_winternight{background-image:url(spritesmith.png);background-position:-2598px -2340px;width:90px;height:90px}.hair_base_7_yellow{background-image:url(spritesmith.png);background-position:-2598px -2430px;width:90px;height:90px}.hair_base_8_TRUred{background-image:url(spritesmith.png);background-position:0 -2550px;width:90px;height:90px}.hair_base_8_black{background-image:url(spritesmith.png);background-position:-90px -2550px;width:90px;height:90px}.hair_base_8_blond{background-image:url(spritesmith.png);background-position:-180px -2550px;width:90px;height:90px}.hair_base_8_blue{background-image:url(spritesmith.png);background-position:-270px -2550px;width:90px;height:90px}.hair_base_8_brown{background-image:url(spritesmith.png);background-position:-360px -2550px;width:90px;height:90px}.hair_base_8_candycane{background-image:url(spritesmith.png);background-position:-450px -2550px;width:90px;height:90px}.hair_base_8_frost{background-image:url(spritesmith.png);background-position:-540px -2550px;width:90px;height:90px}.hair_base_8_green{background-image:url(spritesmith.png);background-position:-630px -2550px;width:90px;height:90px}.hair_base_8_holly{background-image:url(spritesmith.png);background-position:-720px -2550px;width:90px;height:90px}.hair_base_8_purple{background-image:url(spritesmith.png);background-position:-810px -2550px;width:90px;height:90px}.hair_base_8_rainbow{background-image:url(spritesmith.png);background-position:-900px -2550px;width:90px;height:90px}.hair_base_8_red{background-image:url(spritesmith.png);background-position:-1080px -2550px;width:90px;height:90px}.hair_base_8_white{background-image:url(spritesmith.png);background-position:0 -1830px;width:90px;height:90px}.hair_base_8_winternight{background-image:url(spritesmith.png);background-position:-90px -1830px;width:90px;height:90px}.hair_base_8_yellow{background-image:url(spritesmith.png);background-position:-180px -1830px;width:90px;height:90px}.head_0{background-image:url(spritesmith.png);background-position:-270px -1830px;width:90px;height:90px}.head_healer_1{background-image:url(spritesmith.png);background-position:-360px -1830px;width:90px;height:90px}.head_healer_2{background-image:url(spritesmith.png);background-position:-450px -1830px;width:90px;height:90px}.head_healer_3{background-image:url(spritesmith.png);background-position:-540px -1830px;width:90px;height:90px}.head_healer_4{background-image:url(spritesmith.png);background-position:-630px -1830px;width:90px;height:90px}.head_healer_5{background-image:url(spritesmith.png);background-position:-720px -1830px;width:90px;height:90px}.head_rogue_1{background-image:url(spritesmith.png);background-position:-810px -1830px;width:90px;height:90px}.head_rogue_2{background-image:url(spritesmith.png);background-position:-900px -1830px;width:90px;height:90px}.head_rogue_3{background-image:url(spritesmith.png);background-position:-990px -1830px;width:90px;height:90px}.head_rogue_4{background-image:url(spritesmith.png);background-position:-1080px -1830px;width:90px;height:90px}.head_rogue_5{background-image:url(spritesmith.png);background-position:-1170px -1830px;width:90px;height:90px}.head_special_2{background-image:url(spritesmith.png);background-position:-1260px -1830px;width:90px;height:90px}.head_special_candycane{background-image:url(spritesmith.png);background-position:-1350px -1830px;width:90px;height:90px}.head_special_nye{background-image:url(spritesmith.png);background-position:-1440px -1830px;width:90px;height:90px}.head_special_ski{background-image:url(spritesmith.png);background-position:-1530px -1830px;width:90px;height:90px}.head_special_snowflake{background-image:url(spritesmith.png);background-position:-1620px -1830px;width:90px;height:90px}.head_special_yeti{background-image:url(spritesmith.png);background-position:-1710px -1830px;width:90px;height:90px}.head_warrior_1{background-image:url(spritesmith.png);background-position:-1800px -1830px;width:90px;height:90px}.head_warrior_2{background-image:url(spritesmith.png);background-position:-1968px 0;width:90px;height:90px}.head_warrior_3{background-image:url(spritesmith.png);background-position:-1968px -90px;width:90px;height:90px}.head_warrior_4{background-image:url(spritesmith.png);background-position:-1968px -180px;width:90px;height:90px}.head_warrior_5{background-image:url(spritesmith.png);background-position:-1968px -270px;width:90px;height:90px}.head_wizard_1{background-image:url(spritesmith.png);background-position:-1968px -360px;width:90px;height:90px}.head_wizard_2{background-image:url(spritesmith.png);background-position:-1968px -450px;width:90px;height:90px}.head_wizard_3{background-image:url(spritesmith.png);background-position:-1968px -540px;width:90px;height:90px}.head_wizard_4{background-image:url(spritesmith.png);background-position:-1968px -630px;width:90px;height:90px}.head_wizard_5{background-image:url(spritesmith.png);background-position:-1968px -720px;width:90px;height:90px}.Pet_Currency_Gem{background-image:url(spritesmith.png);background-position:-1040px -2640px;width:45px;height:39px}.Pet_Currency_Gem1x{background-image:url(spritesmith.png);background-position:-2748px -1402px;width:15px;height:13px}.Pet_Currency_Gem2x{background-image:url(spritesmith.png);background-position:-2739px -1539px;width:30px;height:26px}.Pet_Egg_BearCub{background-image:url(spritesmith.png);background-position:-1887px -297px;width:48px;height:51px}.Pet_Egg_Cactus{background-image:url(spritesmith.png);background-position:-2688px -2508px;width:48px;height:51px}.Pet_Egg_Dragon{background-image:url(spritesmith.png);background-position:-2688px -2559px;width:48px;height:51px}.Pet_Egg_FlyingPig{background-image:url(spritesmith.png);background-position:-1887px -348px;width:48px;height:51px}.Pet_Egg_Fox{background-image:url(spritesmith.png);background-position:-2688px -1488px;width:48px;height:51px}.Pet_Egg_Gryphon{background-image:url(spritesmith.png);background-position:-2688px -1641px;width:48px;height:51px}.Pet_Egg_LionCub{background-image:url(spritesmith.png);background-position:-1887px -960px;width:48px;height:51px}.Pet_Egg_PandaCub{background-image:url(spritesmith.png);background-position:-1887px -1011px;width:48px;height:51px}.Pet_Egg_PolarBear{background-image:url(spritesmith.png);background-position:-1887px -1062px;width:48px;height:51px}.Pet_Egg_TigerCub{background-image:url(spritesmith.png);background-position:-1887px -1113px;width:48px;height:51px}.Pet_Egg_Wolf{background-image:url(spritesmith.png);background-position:-1887px -1164px;width:48px;height:51px}.Pet_Food_Cake_Base{background-image:url(spritesmith.png);background-position:-1887px -1480px;width:43px;height:43px}.Pet_Food_Cake_CottonCandyBlue{background-image:url(spritesmith.png);background-position:-2736px -1641px;width:42px;height:44px}.Pet_Food_Cake_CottonCandyPink{background-image:url(spritesmith.png);background-position:-1887px -1215px;width:43px;height:45px}.Pet_Food_Cake_Desert{background-image:url(spritesmith.png);background-position:-1887px -1304px;width:43px;height:44px}.Pet_Food_Cake_Golden{background-image:url(spritesmith.png);background-position:-1887px -1523px;width:43px;height:42px}.Pet_Food_Cake_Red{background-image:url(spritesmith.png);background-position:-1887px -1260px;width:43px;height:44px}.Pet_Food_Cake_Shade{background-image:url(spritesmith.png);background-position:-1887px -1348px;width:43px;height:44px}.Pet_Food_Cake_Skeleton{background-image:url(spritesmith.png);background-position:-2736px -1488px;width:42px;height:47px}.Pet_Food_Cake_White{background-image:url(spritesmith.png);background-position:-1887px -1392px;width:44px;height:44px}.Pet_Food_Cake_Zombie{background-image:url(spritesmith.png);background-position:-1887px -1436px;width:45px;height:44px}.Pet_Food_Chocolate{background-image:url(spritesmith.png);background-position:-1887px -909px;width:48px;height:51px}.Pet_Food_CottonCandyBlue{background-image:url(spritesmith.png);background-position:-1887px -858px;width:48px;height:51px}.Pet_Food_CottonCandyPink{background-image:url(spritesmith.png);background-position:-1887px -807px;width:48px;height:51px}.Pet_Food_Fish{background-image:url(spritesmith.png);background-position:-1887px -756px;width:48px;height:51px}.Pet_Food_Honey{background-image:url(spritesmith.png);background-position:-1887px -705px;width:48px;height:51px}.Pet_Food_Meat{background-image:url(spritesmith.png);background-position:-1887px -654px;width:48px;height:51px}.Pet_Food_Milk{background-image:url(spritesmith.png);background-position:-1887px -603px;width:48px;height:51px}.Pet_Food_Potatoe{background-image:url(spritesmith.png);background-position:-1887px -552px;width:48px;height:51px}.Pet_Food_RottenMeat{background-image:url(spritesmith.png);background-position:-1887px -501px;width:48px;height:51px}.Pet_Food_Saddle{background-image:url(spritesmith.png);background-position:-1887px -450px;width:48px;height:51px}.Pet_Food_Strawberry{background-image:url(spritesmith.png);background-position:-2688px -2457px;width:48px;height:51px}.Pet_HatchingPotion_Base{background-image:url(spritesmith.png);background-position:-2688px -2406px;width:48px;height:51px}.Pet_HatchingPotion_CottonCandyBlue{background-image:url(spritesmith.png);background-position:-2688px -2355px;width:48px;height:51px}.Pet_HatchingPotion_CottonCandyPink{background-image:url(spritesmith.png);background-position:-2688px -2304px;width:48px;height:51px}.Pet_HatchingPotion_Desert{background-image:url(spritesmith.png);background-position:-2688px -2253px;width:48px;height:51px}.Pet_HatchingPotion_Golden{background-image:url(spritesmith.png);background-position:-2688px -2202px;width:48px;height:51px}.Pet_HatchingPotion_Red{background-image:url(spritesmith.png);background-position:-2688px -2151px;width:48px;height:51px}.Pet_HatchingPotion_Shade{background-image:url(spritesmith.png);background-position:-2688px -2100px;width:48px;height:51px}.Pet_HatchingPotion_Skeleton{background-image:url(spritesmith.png);background-position:-2688px -2049px;width:48px;height:51px}.Pet_HatchingPotion_White{background-image:url(spritesmith.png);background-position:-2688px -1998px;width:48px;height:51px}.Pet_HatchingPotion_Zombie{background-image:url(spritesmith.png);background-position:-2688px -1947px;width:48px;height:51px}.inventory_present{background-image:url(spritesmith.png);background-position:-2688px -1896px;width:48px;height:51px}.inventory_quest_scroll{background-image:url(spritesmith.png);background-position:-2688px -1845px;width:48px;height:51px}.inventory_special_fortify{background-image:url(spritesmith.png);background-position:-2688px -1794px;width:48px;height:51px}.inventory_special_snowball{background-image:url(spritesmith.png);background-position:-2688px -1743px;width:48px;height:51px}.inventory_special_valentine{background-image:url(spritesmith.png);background-position:-2736px -1743px;width:40px;height:40px}.rebirth_orb{background-image:url(spritesmith.png);background-position:-2688px -1692px;width:48px;height:51px}.GrimReaper{background-image:url(spritesmith.png);background-position:-2688px -1422px;width:57px;height:66px}.PixelPaw-Gold{background-image:url(spritesmith.png);background-position:-2688px -1590px;width:51px;height:51px}.PixelPaw{background-image:url(spritesmith.png);background-position:-2688px -1539px;width:51px;height:51px}.PixelPaw002{background-image:url(spritesmith.png);background-position:-1887px -399px;width:51px;height:51px}.snowman{background-image:url(spritesmith.png);background-position:-2058px -1890px;width:90px;height:90px}.Mount_Body_BearCub-Base{background-image:url(spritesmith.png);background-position:-1050px -1317px;width:105px;height:105px}.Mount_Body_BearCub-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-420px -1527px;width:105px;height:105px}.Mount_Body_BearCub-CottonCandyPink{background-image:url(spritesmith.png);background-position:-525px -1527px;width:105px;height:105px}.Mount_Body_BearCub-Desert{background-image:url(spritesmith.png);background-position:-630px -1527px;width:105px;height:105px}.Mount_Body_BearCub-Golden{background-image:url(spritesmith.png);background-position:-735px -1527px;width:105px;height:105px}.Mount_Body_BearCub-Polar{background-image:url(spritesmith.png);background-position:-840px -1527px;width:105px;height:105px}.Mount_Body_BearCub-Red{background-image:url(spritesmith.png);background-position:-945px -1527px;width:105px;height:105px}.Mount_Body_BearCub-Shade{background-image:url(spritesmith.png);background-position:-219px -354px;width:105px;height:105px}.Mount_Body_BearCub-Skeleton{background-image:url(spritesmith.png);background-position:-324px -354px;width:105px;height:105px}.Mount_Body_BearCub-White{background-image:url(spritesmith.png);background-position:-429px -354px;width:105px;height:105px}.Mount_Body_BearCub-Zombie{background-image:url(spritesmith.png);background-position:0 -477px;width:105px;height:105px}.Mount_Body_Cactus-Base{background-image:url(spritesmith.png);background-position:-105px -477px;width:105px;height:105px}.Mount_Body_Cactus-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-210px -477px;width:105px;height:105px}.Mount_Body_Cactus-CottonCandyPink{background-image:url(spritesmith.png);background-position:-315px -477px;width:105px;height:105px}.Mount_Body_Cactus-Desert{background-image:url(spritesmith.png);background-position:-420px -477px;width:105px;height:105px}.Mount_Body_Cactus-Golden{background-image:url(spritesmith.png);background-position:-594px 0;width:105px;height:105px}.Mount_Body_Cactus-Red{background-image:url(spritesmith.png);background-position:-594px -105px;width:105px;height:105px}.Mount_Body_Cactus-Shade{background-image:url(spritesmith.png);background-position:-594px -210px;width:105px;height:105px}.Mount_Body_Cactus-Skeleton{background-image:url(spritesmith.png);background-position:-594px -315px;width:105px;height:105px}.Mount_Body_Cactus-White{background-image:url(spritesmith.png);background-position:-594px -420px;width:105px;height:105px}.Mount_Body_Cactus-Zombie{background-image:url(spritesmith.png);background-position:0 -582px;width:105px;height:105px}.Mount_Body_Dragon-Base{background-image:url(spritesmith.png);background-position:-105px -582px;width:105px;height:105px}.Mount_Body_Dragon-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-210px -582px;width:105px;height:105px}.Mount_Body_Dragon-CottonCandyPink{background-image:url(spritesmith.png);background-position:-315px -582px;width:105px;height:105px}.Mount_Body_Dragon-Desert{background-image:url(spritesmith.png);background-position:-420px -582px;width:105px;height:105px}.Mount_Body_Dragon-Golden{background-image:url(spritesmith.png);background-position:-525px -582px;width:105px;height:105px}.Mount_Body_Dragon-Red{background-image:url(spritesmith.png);background-position:-699px 0;width:105px;height:105px}.Mount_Body_Dragon-Shade{background-image:url(spritesmith.png);background-position:-699px -105px;width:105px;height:105px}.Mount_Body_Dragon-Skeleton{background-image:url(spritesmith.png);background-position:-699px -210px;width:105px;height:105px}.Mount_Body_Dragon-White{background-image:url(spritesmith.png);background-position:-699px -315px;width:105px;height:105px}.Mount_Body_Dragon-Zombie{background-image:url(spritesmith.png);background-position:-699px -420px;width:105px;height:105px}.Mount_Body_FlyingPig-Base{background-image:url(spritesmith.png);background-position:-699px -525px;width:105px;height:105px}.Mount_Body_FlyingPig-CottonCandyBlue{background-image:url(spritesmith.png);background-position:0 -687px;width:105px;height:105px}.Mount_Body_FlyingPig-CottonCandyPink{background-image:url(spritesmith.png);background-position:-105px -687px;width:105px;height:105px}.Mount_Body_FlyingPig-Desert{background-image:url(spritesmith.png);background-position:-210px -687px;width:105px;height:105px}.Mount_Body_FlyingPig-Golden{background-image:url(spritesmith.png);background-position:-315px -687px;width:105px;height:105px}.Mount_Body_FlyingPig-Red{background-image:url(spritesmith.png);background-position:-420px -687px;width:105px;height:105px}.Mount_Body_FlyingPig-Shade{background-image:url(spritesmith.png);background-position:-525px -687px;width:105px;height:105px}.Mount_Body_FlyingPig-Skeleton{background-image:url(spritesmith.png);background-position:-630px -687px;width:105px;height:105px}.Mount_Body_FlyingPig-White{background-image:url(spritesmith.png);background-position:-804px 0;width:105px;height:105px}.Mount_Body_FlyingPig-Zombie{background-image:url(spritesmith.png);background-position:-804px -105px;width:105px;height:105px}.Mount_Body_Fox-Base{background-image:url(spritesmith.png);background-position:-804px -210px;width:105px;height:105px}.Mount_Body_Fox-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-804px -315px;width:105px;height:105px}.Mount_Body_Fox-CottonCandyPink{background-image:url(spritesmith.png);background-position:-804px -420px;width:105px;height:105px}.Mount_Body_Fox-Desert{background-image:url(spritesmith.png);background-position:-804px -525px;width:105px;height:105px}.Mount_Body_Fox-Golden{background-image:url(spritesmith.png);background-position:-804px -630px;width:105px;height:105px}.Mount_Body_Fox-Red{background-image:url(spritesmith.png);background-position:0 -792px;width:105px;height:105px}.Mount_Body_Fox-Shade{background-image:url(spritesmith.png);background-position:-105px -792px;width:105px;height:105px}.Mount_Body_Fox-Skeleton{background-image:url(spritesmith.png);background-position:-210px -792px;width:105px;height:105px}.Mount_Body_Fox-White{background-image:url(spritesmith.png);background-position:-315px -792px;width:105px;height:105px}.Mount_Body_Fox-Zombie{background-image:url(spritesmith.png);background-position:-420px -792px;width:105px;height:105px}.Mount_Body_Gryphon-Base{background-image:url(spritesmith.png);background-position:-525px -792px;width:105px;height:105px}.Mount_Body_Gryphon-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-630px -792px;width:105px;height:105px}.Mount_Body_Gryphon-CottonCandyPink{background-image:url(spritesmith.png);background-position:-735px -792px;width:105px;height:105px}.Mount_Body_Gryphon-Desert{background-image:url(spritesmith.png);background-position:-909px 0;width:105px;height:105px}.Mount_Body_Gryphon-Golden{background-image:url(spritesmith.png);background-position:-909px -105px;width:105px;height:105px}.Mount_Body_Gryphon-Red{background-image:url(spritesmith.png);background-position:-909px -210px;width:105px;height:105px}.Mount_Body_Gryphon-Shade{background-image:url(spritesmith.png);background-position:-909px -315px;width:105px;height:105px}.Mount_Body_Gryphon-Skeleton{background-image:url(spritesmith.png);background-position:-909px -420px;width:105px;height:105px}.Mount_Body_Gryphon-White{background-image:url(spritesmith.png);background-position:-909px -525px;width:105px;height:105px}.Mount_Body_Gryphon-Zombie{background-image:url(spritesmith.png);background-position:-909px -630px;width:105px;height:105px}.Mount_Body_LionCub-Base{background-image:url(spritesmith.png);background-position:-909px -735px;width:105px;height:105px}.Mount_Body_LionCub-CottonCandyBlue{background-image:url(spritesmith.png);background-position:0 -897px;width:105px;height:105px}.Mount_Body_LionCub-CottonCandyPink{background-image:url(spritesmith.png);background-position:-105px -897px;width:105px;height:105px}.Mount_Body_LionCub-Desert{background-image:url(spritesmith.png);background-position:-210px -897px;width:105px;height:105px}.Mount_Body_LionCub-Ethereal{background-image:url(spritesmith.png);background-position:-315px -897px;width:105px;height:105px}.Mount_Body_LionCub-Golden{background-image:url(spritesmith.png);background-position:-420px -897px;width:105px;height:105px}.Mount_Body_LionCub-Red{background-image:url(spritesmith.png);background-position:-525px -897px;width:105px;height:105px}.Mount_Body_LionCub-Shade{background-image:url(spritesmith.png);background-position:-630px -897px;width:105px;height:105px}.Mount_Body_LionCub-Skeleton{background-image:url(spritesmith.png);background-position:-735px -897px;width:105px;height:105px}.Mount_Body_LionCub-White{background-image:url(spritesmith.png);background-position:-840px -897px;width:105px;height:105px}.Mount_Body_LionCub-Zombie{background-image:url(spritesmith.png);background-position:-1014px 0;width:105px;height:105px}.Mount_Body_PandaCub-Base{background-image:url(spritesmith.png);background-position:-1014px -105px;width:105px;height:105px}.Mount_Body_PandaCub-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-1014px -210px;width:105px;height:105px}.Mount_Body_PandaCub-CottonCandyPink{background-image:url(spritesmith.png);background-position:-1014px -315px;width:105px;height:105px}.Mount_Body_PandaCub-Desert{background-image:url(spritesmith.png);background-position:-1014px -420px;width:105px;height:105px}.Mount_Body_PandaCub-Golden{background-image:url(spritesmith.png);background-position:-1014px -525px;width:105px;height:105px}.Mount_Body_PandaCub-Red{background-image:url(spritesmith.png);background-position:-1014px -630px;width:105px;height:105px}.Mount_Body_PandaCub-Shade{background-image:url(spritesmith.png);background-position:-1014px -735px;width:105px;height:105px}.Mount_Body_PandaCub-Skeleton{background-image:url(spritesmith.png);background-position:-315px -1527px;width:105px;height:105px}.Mount_Body_PandaCub-White{background-image:url(spritesmith.png);background-position:-1014px -840px;width:105px;height:105px}.Mount_Body_PandaCub-Zombie{background-image:url(spritesmith.png);background-position:0 -1002px;width:105px;height:105px}.Mount_Body_TigerCub-Base{background-image:url(spritesmith.png);background-position:-105px -1002px;width:105px;height:105px}.Mount_Body_TigerCub-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-210px -1002px;width:105px;height:105px}.Mount_Body_TigerCub-CottonCandyPink{background-image:url(spritesmith.png);background-position:-315px -1002px;width:105px;height:105px}.Mount_Body_TigerCub-Desert{background-image:url(spritesmith.png);background-position:-420px -1002px;width:105px;height:105px}.Mount_Body_TigerCub-Golden{background-image:url(spritesmith.png);background-position:-525px -1002px;width:105px;height:105px}.Mount_Body_TigerCub-Red{background-image:url(spritesmith.png);background-position:-630px -1002px;width:105px;height:105px}.Mount_Body_TigerCub-Shade{background-image:url(spritesmith.png);background-position:-735px -1002px;width:105px;height:105px}.Mount_Body_TigerCub-Skeleton{background-image:url(spritesmith.png);background-position:-840px -1002px;width:105px;height:105px}.Mount_Body_TigerCub-White{background-image:url(spritesmith.png);background-position:-945px -1002px;width:105px;height:105px}.Mount_Body_TigerCub-Zombie{background-image:url(spritesmith.png);background-position:-1119px 0;width:105px;height:105px}.Mount_Body_Wolf-Base{background-image:url(spritesmith.png);background-position:-1119px -105px;width:105px;height:105px}.Mount_Body_Wolf-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-1119px -210px;width:105px;height:105px}.Mount_Body_Wolf-CottonCandyPink{background-image:url(spritesmith.png);background-position:-1119px -315px;width:105px;height:105px}.Mount_Body_Wolf-Desert{background-image:url(spritesmith.png);background-position:-1119px -420px;width:105px;height:105px}.Mount_Body_Wolf-Golden{background-image:url(spritesmith.png);background-position:-1119px -525px;width:105px;height:105px}.Mount_Body_Wolf-Red{background-image:url(spritesmith.png);background-position:-1119px -630px;width:105px;height:105px}.Mount_Body_Wolf-Shade{background-image:url(spritesmith.png);background-position:-1119px -735px;width:105px;height:105px}.Mount_Body_Wolf-Skeleton{background-image:url(spritesmith.png);background-position:-1119px -840px;width:105px;height:105px}.Mount_Body_Wolf-White{background-image:url(spritesmith.png);background-position:-1119px -945px;width:105px;height:105px}.Mount_Body_Wolf-Zombie{background-image:url(spritesmith.png);background-position:0 -1107px;width:105px;height:105px}.Mount_Head_BearCub-Base{background-image:url(spritesmith.png);background-position:-105px -1107px;width:105px;height:105px}.Mount_Head_BearCub-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-210px -1107px;width:105px;height:105px}.Mount_Head_BearCub-CottonCandyPink{background-image:url(spritesmith.png);background-position:-315px -1107px;width:105px;height:105px}.Mount_Head_BearCub-Desert{background-image:url(spritesmith.png);background-position:-420px -1107px;width:105px;height:105px}.Mount_Head_BearCub-Golden{background-image:url(spritesmith.png);background-position:-525px -1107px;width:105px;height:105px}.Mount_Head_BearCub-Polar{background-image:url(spritesmith.png);background-position:-630px -1107px;width:105px;height:105px}.Mount_Head_BearCub-Red{background-image:url(spritesmith.png);background-position:-735px -1107px;width:105px;height:105px}.Mount_Head_BearCub-Shade{background-image:url(spritesmith.png);background-position:-840px -1107px;width:105px;height:105px}.Mount_Head_BearCub-Skeleton{background-image:url(spritesmith.png);background-position:-945px -1107px;width:105px;height:105px}.Mount_Head_BearCub-White{background-image:url(spritesmith.png);background-position:-1050px -1107px;width:105px;height:105px}.Mount_Head_BearCub-Zombie{background-image:url(spritesmith.png);background-position:-1224px 0;width:105px;height:105px}.Mount_Head_Cactus-Base{background-image:url(spritesmith.png);background-position:-1224px -105px;width:105px;height:105px}.Mount_Head_Cactus-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-1224px -210px;width:105px;height:105px}.Mount_Head_Cactus-CottonCandyPink{background-image:url(spritesmith.png);background-position:-1224px -315px;width:105px;height:105px}.Mount_Head_Cactus-Desert{background-image:url(spritesmith.png);background-position:-1224px -420px;width:105px;height:105px}.Mount_Head_Cactus-Golden{background-image:url(spritesmith.png);background-position:-1224px -525px;width:105px;height:105px}.Mount_Head_Cactus-Red{background-image:url(spritesmith.png);background-position:-1224px -630px;width:105px;height:105px}.Mount_Head_Cactus-Shade{background-image:url(spritesmith.png);background-position:-1224px -735px;width:105px;height:105px}.Mount_Head_Cactus-Skeleton{background-image:url(spritesmith.png);background-position:-1224px -840px;width:105px;height:105px}.Mount_Head_Cactus-White{background-image:url(spritesmith.png);background-position:-1224px -945px;width:105px;height:105px}.Mount_Head_Cactus-Zombie{background-image:url(spritesmith.png);background-position:-1224px -1050px;width:105px;height:105px}.Mount_Head_Dragon-Base{background-image:url(spritesmith.png);background-position:0 -1212px;width:105px;height:105px}.Mount_Head_Dragon-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-105px -1212px;width:105px;height:105px}.Mount_Head_Dragon-CottonCandyPink{background-image:url(spritesmith.png);background-position:-210px -1212px;width:105px;height:105px}.Mount_Head_Dragon-Desert{background-image:url(spritesmith.png);background-position:-315px -1212px;width:105px;height:105px}.Mount_Head_Dragon-Golden{background-image:url(spritesmith.png);background-position:-420px -1212px;width:105px;height:105px}.Mount_Head_Dragon-Red{background-image:url(spritesmith.png);background-position:-525px -1212px;width:105px;height:105px}.Mount_Head_Dragon-Shade{background-image:url(spritesmith.png);background-position:-630px -1212px;width:105px;height:105px}.Mount_Head_Dragon-Skeleton{background-image:url(spritesmith.png);background-position:-735px -1212px;width:105px;height:105px}.Mount_Head_Dragon-White{background-image:url(spritesmith.png);background-position:-840px -1212px;width:105px;height:105px}.Mount_Head_Dragon-Zombie{background-image:url(spritesmith.png);background-position:-945px -1212px;width:105px;height:105px}.Mount_Head_FlyingPig-Base{background-image:url(spritesmith.png);background-position:-1050px -1212px;width:105px;height:105px}.Mount_Head_FlyingPig-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-1155px -1212px;width:105px;height:105px}.Mount_Head_FlyingPig-CottonCandyPink{background-image:url(spritesmith.png);background-position:-1329px 0;width:105px;height:105px}.Mount_Head_FlyingPig-Desert{background-image:url(spritesmith.png);background-position:-1329px -105px;width:105px;height:105px}.Mount_Head_FlyingPig-Golden{background-image:url(spritesmith.png);background-position:-1329px -210px;width:105px;height:105px}.Mount_Head_FlyingPig-Red{background-image:url(spritesmith.png);background-position:-1329px -315px;width:105px;height:105px}.Mount_Head_FlyingPig-Shade{background-image:url(spritesmith.png);background-position:-1329px -420px;width:105px;height:105px}.Mount_Head_FlyingPig-Skeleton{background-image:url(spritesmith.png);background-position:-1329px -525px;width:105px;height:105px}.Mount_Head_FlyingPig-White{background-image:url(spritesmith.png);background-position:-1329px -630px;width:105px;height:105px}.Mount_Head_FlyingPig-Zombie{background-image:url(spritesmith.png);background-position:-1329px -735px;width:105px;height:105px}.Mount_Head_Fox-Base{background-image:url(spritesmith.png);background-position:-1329px -840px;width:105px;height:105px}.Mount_Head_Fox-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-1329px -945px;width:105px;height:105px}.Mount_Head_Fox-CottonCandyPink{background-image:url(spritesmith.png);background-position:-1329px -1050px;width:105px;height:105px}.Mount_Head_Fox-Desert{background-image:url(spritesmith.png);background-position:-1329px -1155px;width:105px;height:105px}.Mount_Head_Fox-Golden{background-image:url(spritesmith.png);background-position:0 -1317px;width:105px;height:105px}.Mount_Head_Fox-Red{background-image:url(spritesmith.png);background-position:-105px -1317px;width:105px;height:105px}.Mount_Head_Fox-Shade{background-image:url(spritesmith.png);background-position:-210px -1317px;width:105px;height:105px}.Mount_Head_Fox-Skeleton{background-image:url(spritesmith.png);background-position:-315px -1317px;width:105px;height:105px}.Mount_Head_Fox-White{background-image:url(spritesmith.png);background-position:-420px -1317px;width:105px;height:105px}.Mount_Head_Fox-Zombie{background-image:url(spritesmith.png);background-position:-525px -1317px;width:105px;height:105px}.Mount_Head_Gryphon-Base{background-image:url(spritesmith.png);background-position:-630px -1317px;width:105px;height:105px}.Mount_Head_Gryphon-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-735px -1317px;width:105px;height:105px}.Mount_Head_Gryphon-CottonCandyPink{background-image:url(spritesmith.png);background-position:-840px -1317px;width:105px;height:105px}.Mount_Head_Gryphon-Desert{background-image:url(spritesmith.png);background-position:-945px -1317px;width:105px;height:105px}.Mount_Head_Gryphon-Golden{background-image:url(spritesmith.png);background-position:-1050px -1527px;width:105px;height:105px}.Mount_Head_Gryphon-Red{background-image:url(spritesmith.png);background-position:-1155px -1317px;width:105px;height:105px}.Mount_Head_Gryphon-Shade{background-image:url(spritesmith.png);background-position:-1260px -1317px;width:105px;height:105px}.Mount_Head_Gryphon-Skeleton{background-image:url(spritesmith.png);background-position:-1434px 0;width:105px;height:105px}.Mount_Head_Gryphon-White{background-image:url(spritesmith.png);background-position:-1434px -105px;width:105px;height:105px}.Mount_Head_Gryphon-Zombie{background-image:url(spritesmith.png);background-position:-1434px -210px;width:105px;height:105px}.Mount_Head_LionCub-Base{background-image:url(spritesmith.png);background-position:-1434px -315px;width:105px;height:105px}.Mount_Head_LionCub-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-1434px -420px;width:105px;height:105px}.Mount_Head_LionCub-CottonCandyPink{background-image:url(spritesmith.png);background-position:-1434px -525px;width:105px;height:105px}.Mount_Head_LionCub-Desert{background-image:url(spritesmith.png);background-position:-1434px -630px;width:105px;height:105px}.Mount_Head_LionCub-Ethereal{background-image:url(spritesmith.png);background-position:-1434px -735px;width:105px;height:105px}.Mount_Head_LionCub-Golden{background-image:url(spritesmith.png);background-position:-1434px -840px;width:105px;height:105px}.Mount_Head_LionCub-Red{background-image:url(spritesmith.png);background-position:-1434px -945px;width:105px;height:105px}.Mount_Head_LionCub-Shade{background-image:url(spritesmith.png);background-position:-1434px -1050px;width:105px;height:105px}.Mount_Head_LionCub-Skeleton{background-image:url(spritesmith.png);background-position:-1434px -1155px;width:105px;height:105px}.Mount_Head_LionCub-White{background-image:url(spritesmith.png);background-position:-1434px -1260px;width:105px;height:105px}.Mount_Head_LionCub-Zombie{background-image:url(spritesmith.png);background-position:0 -1422px;width:105px;height:105px}.Mount_Head_PandaCub-Base{background-image:url(spritesmith.png);background-position:-105px -1422px;width:105px;height:105px}.Mount_Head_PandaCub-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-210px -1422px;width:105px;height:105px}.Mount_Head_PandaCub-CottonCandyPink{background-image:url(spritesmith.png);background-position:-315px -1422px;width:105px;height:105px}.Mount_Head_PandaCub-Desert{background-image:url(spritesmith.png);background-position:-420px -1422px;width:105px;height:105px}.Mount_Head_PandaCub-Golden{background-image:url(spritesmith.png);background-position:-525px -1422px;width:105px;height:105px}.Mount_Head_PandaCub-Red{background-image:url(spritesmith.png);background-position:-630px -1422px;width:105px;height:105px}.Mount_Head_PandaCub-Shade{background-image:url(spritesmith.png);background-position:-735px -1422px;width:105px;height:105px}.Mount_Head_PandaCub-Skeleton{background-image:url(spritesmith.png);background-position:-840px -1422px;width:105px;height:105px}.Mount_Head_PandaCub-White{background-image:url(spritesmith.png);background-position:-945px -1422px;width:105px;height:105px}.Mount_Head_PandaCub-Zombie{background-image:url(spritesmith.png);background-position:-1050px -1422px;width:105px;height:105px}.Mount_Head_TigerCub-Base{background-image:url(spritesmith.png);background-position:-1155px -1422px;width:105px;height:105px}.Mount_Head_TigerCub-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-1260px -1422px;width:105px;height:105px}.Mount_Head_TigerCub-CottonCandyPink{background-image:url(spritesmith.png);background-position:-1365px -1422px;width:105px;height:105px}.Mount_Head_TigerCub-Desert{background-image:url(spritesmith.png);background-position:-1539px 0;width:105px;height:105px}.Mount_Head_TigerCub-Golden{background-image:url(spritesmith.png);background-position:-1539px -105px;width:105px;height:105px}.Mount_Head_TigerCub-Red{background-image:url(spritesmith.png);background-position:-1539px -210px;width:105px;height:105px}.Mount_Head_TigerCub-Shade{background-image:url(spritesmith.png);background-position:-1539px -315px;width:105px;height:105px}.Mount_Head_TigerCub-Skeleton{background-image:url(spritesmith.png);background-position:-1539px -420px;width:105px;height:105px}.Mount_Head_TigerCub-White{background-image:url(spritesmith.png);background-position:-1539px -525px;width:105px;height:105px}.Mount_Head_TigerCub-Zombie{background-image:url(spritesmith.png);background-position:-1539px -630px;width:105px;height:105px}.Mount_Head_Wolf-Base{background-image:url(spritesmith.png);background-position:-1539px -735px;width:105px;height:105px}.Mount_Head_Wolf-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-1539px -840px;width:105px;height:105px}.Mount_Head_Wolf-CottonCandyPink{background-image:url(spritesmith.png);background-position:-1539px -945px;width:105px;height:105px}.Mount_Head_Wolf-Desert{background-image:url(spritesmith.png);background-position:-1539px -1050px;width:105px;height:105px}.Mount_Head_Wolf-Golden{background-image:url(spritesmith.png);background-position:-1539px -1155px;width:105px;height:105px}.Mount_Head_Wolf-Red{background-image:url(spritesmith.png);background-position:-1539px -1260px;width:105px;height:105px}.Mount_Head_Wolf-Shade{background-image:url(spritesmith.png);background-position:-1539px -1365px;width:105px;height:105px}.Mount_Head_Wolf-Skeleton{background-image:url(spritesmith.png);background-position:0 -1527px;width:105px;height:105px}.Mount_Head_Wolf-White{background-image:url(spritesmith.png);background-position:-105px -1527px;width:105px;height:105px}.Mount_Head_Wolf-Zombie{background-image:url(spritesmith.png);background-position:-210px -1527px;width:105px;height:105px}.npc_alex{background-image:url(spritesmith.png);background-position:-432px 0;width:162px;height:138px}.npc_bailey{background-image:url(spritesmith.png);background-position:-2688px -1350px;width:60px;height:72px}.npc_daniel{background-image:url(spritesmith.png);background-position:0 -354px;width:135px;height:123px}.npc_justin{background-image:url(spritesmith.png);background-position:-135px -354px;width:84px;height:120px}.npc_matt{background-image:url(spritesmith.png);background-position:-216px -177px;width:198px;height:144px}.npc_tyler{background-image:url(spritesmith.png);background-position:-1170px -2370px;width:90px;height:90px}.Pet-BearCub-Base{background-image:url(spritesmith.png);background-position:-1887px -99px;width:81px;height:99px}.Pet-BearCub-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-1887px 0;width:81px;height:99px}.Pet-BearCub-CottonCandyPink{background-image:url(spritesmith.png);background-position:-1782px -1731px;width:81px;height:99px}.Pet-BearCub-Desert{background-image:url(spritesmith.png);background-position:-1155px -1527px;width:81px;height:99px}.Pet-BearCub-Golden{background-image:url(spritesmith.png);background-position:-1053px -1632px;width:81px;height:99px}.Pet-BearCub-Polar{background-image:url(spritesmith.png);background-position:-1236px -1527px;width:81px;height:99px}.Pet-BearCub-Red{background-image:url(spritesmith.png);background-position:-1317px -1527px;width:81px;height:99px}.Pet-BearCub-Shade{background-image:url(spritesmith.png);background-position:-1398px -1527px;width:81px;height:99px}.Pet-BearCub-Skeleton{background-image:url(spritesmith.png);background-position:-1479px -1527px;width:81px;height:99px}.Pet-BearCub-White{background-image:url(spritesmith.png);background-position:-1560px -1527px;width:81px;height:99px}.Pet-BearCub-Zombie{background-image:url(spritesmith.png);background-position:-1644px 0;width:81px;height:99px}.Pet-Cactus-Base{background-image:url(spritesmith.png);background-position:-1644px -99px;width:81px;height:99px}.Pet-Cactus-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-1644px -198px;width:81px;height:99px}.Pet-Cactus-CottonCandyPink{background-image:url(spritesmith.png);background-position:-1644px -297px;width:81px;height:99px}.Pet-Cactus-Desert{background-image:url(spritesmith.png);background-position:-1644px -396px;width:81px;height:99px}.Pet-Cactus-Golden{background-image:url(spritesmith.png);background-position:-1644px -495px;width:81px;height:99px}.Pet-Cactus-Red{background-image:url(spritesmith.png);background-position:-1644px -594px;width:81px;height:99px}.Pet-Cactus-Shade{background-image:url(spritesmith.png);background-position:-1644px -693px;width:81px;height:99px}.Pet-Cactus-Skeleton{background-image:url(spritesmith.png);background-position:-1644px -792px;width:81px;height:99px}.Pet-Cactus-White{background-image:url(spritesmith.png);background-position:-1644px -891px;width:81px;height:99px}.Pet-Cactus-Zombie{background-image:url(spritesmith.png);background-position:-1644px -990px;width:81px;height:99px}.Pet-Dragon-Base{background-image:url(spritesmith.png);background-position:-1644px -1089px;width:81px;height:99px}.Pet-Dragon-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-1644px -1188px;width:81px;height:99px}.Pet-Dragon-CottonCandyPink{background-image:url(spritesmith.png);background-position:-1644px -1287px;width:81px;height:99px}.Pet-Dragon-Desert{background-image:url(spritesmith.png);background-position:-1644px -1386px;width:81px;height:99px}.Pet-Dragon-Golden{background-image:url(spritesmith.png);background-position:-1644px -1485px;width:81px;height:99px}.Pet-Dragon-Hydra{background-image:url(spritesmith.png);background-position:-432px -269px;width:114px;height:84px}.Pet-Dragon-Red{background-image:url(spritesmith.png);background-position:-1725px 0;width:81px;height:99px}.Pet-Dragon-Shade{background-image:url(spritesmith.png);background-position:-1725px -99px;width:81px;height:99px}.Pet-Dragon-Skeleton{background-image:url(spritesmith.png);background-position:-1725px -198px;width:81px;height:99px}.Pet-Dragon-White{background-image:url(spritesmith.png);background-position:-1725px -297px;width:81px;height:99px}.Pet-Dragon-Zombie{background-image:url(spritesmith.png);background-position:-1725px -396px;width:81px;height:99px}.Pet-FlyingPig-Base{background-image:url(spritesmith.png);background-position:-1725px -495px;width:81px;height:99px}.Pet-FlyingPig-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-1725px -594px;width:81px;height:99px}.Pet-FlyingPig-CottonCandyPink{background-image:url(spritesmith.png);background-position:-1725px -693px;width:81px;height:99px}.Pet-FlyingPig-Desert{background-image:url(spritesmith.png);background-position:-1725px -792px;width:81px;height:99px}.Pet-FlyingPig-Golden{background-image:url(spritesmith.png);background-position:-1725px -891px;width:81px;height:99px}.Pet-FlyingPig-Red{background-image:url(spritesmith.png);background-position:-1725px -990px;width:81px;height:99px}.Pet-FlyingPig-Shade{background-image:url(spritesmith.png);background-position:-1725px -1089px;width:81px;height:99px}.Pet-FlyingPig-Skeleton{background-image:url(spritesmith.png);background-position:-1725px -1188px;width:81px;height:99px}.Pet-FlyingPig-White{background-image:url(spritesmith.png);background-position:-1725px -1287px;width:81px;height:99px}.Pet-FlyingPig-Zombie{background-image:url(spritesmith.png);background-position:-1725px -1386px;width:81px;height:99px}.Pet-Fox-Base{background-image:url(spritesmith.png);background-position:-1725px -1485px;width:81px;height:99px}.Pet-Fox-CottonCandyBlue{background-image:url(spritesmith.png);background-position:0 -1632px;width:81px;height:99px}.Pet-Fox-CottonCandyPink{background-image:url(spritesmith.png);background-position:-81px -1632px;width:81px;height:99px}.Pet-Fox-Desert{background-image:url(spritesmith.png);background-position:-162px -1632px;width:81px;height:99px}.Pet-Fox-Golden{background-image:url(spritesmith.png);background-position:-243px -1632px;width:81px;height:99px}.Pet-Fox-Red{background-image:url(spritesmith.png);background-position:-324px -1632px;width:81px;height:99px}.Pet-Fox-Shade{background-image:url(spritesmith.png);background-position:-405px -1632px;width:81px;height:99px}.Pet-Fox-Skeleton{background-image:url(spritesmith.png);background-position:-486px -1632px;width:81px;height:99px}.Pet-Fox-White{background-image:url(spritesmith.png);background-position:-567px -1632px;width:81px;height:99px}.Pet-Fox-Zombie{background-image:url(spritesmith.png);background-position:-648px -1632px;width:81px;height:99px}.Pet-Gryphon-Base{background-image:url(spritesmith.png);background-position:-729px -1632px;width:81px;height:99px}.Pet-Gryphon-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-810px -1632px;width:81px;height:99px}.Pet-Gryphon-CottonCandyPink{background-image:url(spritesmith.png);background-position:-891px -1632px;width:81px;height:99px}.Pet-Gryphon-Desert{background-image:url(spritesmith.png);background-position:-972px -1632px;width:81px;height:99px}.Pet-Gryphon-Golden{background-image:url(spritesmith.png);background-position:-1887px -198px;width:81px;height:99px}.Pet-Gryphon-Red{background-image:url(spritesmith.png);background-position:-1134px -1632px;width:81px;height:99px}.Pet-Gryphon-Shade{background-image:url(spritesmith.png);background-position:-1215px -1632px;width:81px;height:99px}.Pet-Gryphon-Skeleton{background-image:url(spritesmith.png);background-position:-1296px -1632px;width:81px;height:99px}.Pet-Gryphon-White{background-image:url(spritesmith.png);background-position:-1377px -1632px;width:81px;height:99px}.Pet-Gryphon-Zombie{background-image:url(spritesmith.png);background-position:-1458px -1632px;width:81px;height:99px}.Pet-LionCub-Base{background-image:url(spritesmith.png);background-position:-1539px -1632px;width:81px;height:99px}.Pet-LionCub-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-1620px -1632px;width:81px;height:99px}.Pet-LionCub-CottonCandyPink{background-image:url(spritesmith.png);background-position:-1701px -1632px;width:81px;height:99px}.Pet-LionCub-Desert{background-image:url(spritesmith.png);background-position:-1806px 0;width:81px;height:99px}.Pet-LionCub-Golden{background-image:url(spritesmith.png);background-position:-1806px -99px;width:81px;height:99px}.Pet-LionCub-Red{background-image:url(spritesmith.png);background-position:-1806px -198px;width:81px;height:99px}.Pet-LionCub-Shade{background-image:url(spritesmith.png);background-position:-1806px -297px;width:81px;height:99px}.Pet-LionCub-Skeleton{background-image:url(spritesmith.png);background-position:-1806px -396px;width:81px;height:99px}.Pet-LionCub-White{background-image:url(spritesmith.png);background-position:-1806px -495px;width:81px;height:99px}.Pet-LionCub-Zombie{background-image:url(spritesmith.png);background-position:-1806px -594px;width:81px;height:99px}.Pet-PandaCub-Base{background-image:url(spritesmith.png);background-position:-1806px -693px;width:81px;height:99px}.Pet-PandaCub-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-1806px -792px;width:81px;height:99px}.Pet-PandaCub-CottonCandyPink{background-image:url(spritesmith.png);background-position:-1806px -891px;width:81px;height:99px}.Pet-PandaCub-Desert{background-image:url(spritesmith.png);background-position:-1806px -990px;width:81px;height:99px}.Pet-PandaCub-Golden{background-image:url(spritesmith.png);background-position:-1806px -1089px;width:81px;height:99px}.Pet-PandaCub-Red{background-image:url(spritesmith.png);background-position:-1806px -1188px;width:81px;height:99px}.Pet-PandaCub-Shade{background-image:url(spritesmith.png);background-position:-1806px -1287px;width:81px;height:99px}.Pet-PandaCub-Skeleton{background-image:url(spritesmith.png);background-position:-1806px -1386px;width:81px;height:99px}.Pet-PandaCub-White{background-image:url(spritesmith.png);background-position:-1806px -1485px;width:81px;height:99px}.Pet-PandaCub-Zombie{background-image:url(spritesmith.png);background-position:-1806px -1584px;width:81px;height:99px}.Pet-TigerCub-Base{background-image:url(spritesmith.png);background-position:0 -1731px;width:81px;height:99px}.Pet-TigerCub-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-81px -1731px;width:81px;height:99px}.Pet-TigerCub-CottonCandyPink{background-image:url(spritesmith.png);background-position:-162px -1731px;width:81px;height:99px}.Pet-TigerCub-Desert{background-image:url(spritesmith.png);background-position:-243px -1731px;width:81px;height:99px}.Pet-TigerCub-Golden{background-image:url(spritesmith.png);background-position:-324px -1731px;width:81px;height:99px}.Pet-TigerCub-Red{background-image:url(spritesmith.png);background-position:-405px -1731px;width:81px;height:99px}.Pet-TigerCub-Shade{background-image:url(spritesmith.png);background-position:-486px -1731px;width:81px;height:99px}.Pet-TigerCub-Skeleton{background-image:url(spritesmith.png);background-position:-567px -1731px;width:81px;height:99px}.Pet-TigerCub-White{background-image:url(spritesmith.png);background-position:-648px -1731px;width:81px;height:99px}.Pet-TigerCub-Zombie{background-image:url(spritesmith.png);background-position:-729px -1731px;width:81px;height:99px}.Pet-Turkey-Base{background-image:url(spritesmith.png);background-position:-810px -1731px;width:81px;height:99px}.Pet-Wolf-Base{background-image:url(spritesmith.png);background-position:-891px -1731px;width:81px;height:99px}.Pet-Wolf-CottonCandyBlue{background-image:url(spritesmith.png);background-position:-972px -1731px;width:81px;height:99px}.Pet-Wolf-CottonCandyPink{background-image:url(spritesmith.png);background-position:-1053px -1731px;width:81px;height:99px}.Pet-Wolf-Desert{background-image:url(spritesmith.png);background-position:-1134px -1731px;width:81px;height:99px}.Pet-Wolf-Golden{background-image:url(spritesmith.png);background-position:-1215px -1731px;width:81px;height:99px}.Pet-Wolf-Red{background-image:url(spritesmith.png);background-position:-1296px -1731px;width:81px;height:99px}.Pet-Wolf-Shade{background-image:url(spritesmith.png);background-position:-1377px -1731px;width:81px;height:99px}.Pet-Wolf-Skeleton{background-image:url(spritesmith.png);background-position:-1458px -1731px;width:81px;height:99px}.Pet-Wolf-Veteran{background-image:url(spritesmith.png);background-position:-1539px -1731px;width:81px;height:99px}.Pet-Wolf-White{background-image:url(spritesmith.png);background-position:-1620px -1731px;width:81px;height:99px}.Pet-Wolf-Zombie{background-image:url(spritesmith.png);background-position:-1701px -1731px;width:81px;height:99px}.quest_evilsanta{background-image:url(spritesmith.png);background-position:-432px -138px;width:118px;height:131px}.quest_gryphon{background-image:url(spritesmith.png);background-position:0 -177px;width:216px;height:177px}.quest_vice1{background-image:url(spritesmith.png);background-position:-216px 0;width:216px;height:177px}.quest_vice2_lightCrystal{background-image:url(spritesmith.png);background-position:-2736px -1845px;width:40px;height:40px}.quest_vice3{background-image:url(spritesmith.png);background-position:0 0;width:216px;height:177px}.shield_healer_1{background-image:url(spritesmith.png);background-position:-1170px -2550px;width:90px;height:90px}.shield_healer_2{background-image:url(spritesmith.png);background-position:-1260px -2550px;width:90px;height:90px}.shield_healer_3{background-image:url(spritesmith.png);background-position:-1350px -2550px;width:90px;height:90px}.shield_healer_4{background-image:url(spritesmith.png);background-position:-1440px -2550px;width:90px;height:90px}.shield_healer_5{background-image:url(spritesmith.png);background-position:-1530px -2550px;width:90px;height:90px}.shield_rogue_0{background-image:url(spritesmith.png);background-position:-1620px -2550px;width:90px;height:90px}.shield_rogue_1{background-image:url(spritesmith.png);background-position:-1710px -2550px;width:103px;height:90px}.shield_rogue_2{background-image:url(spritesmith.png);background-position:-1813px -2550px;width:103px;height:90px}.shield_rogue_3{background-image:url(spritesmith.png);background-position:-1916px -2550px;width:114px;height:90px}.shield_rogue_4{background-image:url(spritesmith.png);background-position:-2030px -2550px;width:100px;height:90px}.shield_rogue_5{background-image:url(spritesmith.png);background-position:-2130px -2550px;width:114px;height:90px}.shield_rogue_6{background-image:url(spritesmith.png);background-position:-2244px -2550px;width:114px;height:90px}.shield_special_1{background-image:url(spritesmith.png);background-position:-2358px -2550px;width:90px;height:90px}.shield_special_ski{background-image:url(spritesmith.png);background-position:-2448px -2550px;width:104px;height:90px}.shield_special_snowflake{background-image:url(spritesmith.png);background-position:-2552px -2550px;width:90px;height:90px}.shield_special_yeti{background-image:url(spritesmith.png);background-position:-2688px 0;width:90px;height:90px}.shield_warrior_1{background-image:url(spritesmith.png);background-position:-2688px -90px;width:90px;height:90px}.shield_warrior_2{background-image:url(spritesmith.png);background-position:-2688px -180px;width:90px;height:90px}.shield_warrior_3{background-image:url(spritesmith.png);background-position:-2688px -270px;width:90px;height:90px}.shield_warrior_4{background-image:url(spritesmith.png);background-position:-2688px -360px;width:90px;height:90px}.shield_warrior_5{background-image:url(spritesmith.png);background-position:-2688px -450px;width:90px;height:90px}.broad_shirt_black{background-image:url(spritesmith.png);background-position:-2688px -540px;width:90px;height:90px}.broad_shirt_blue{background-image:url(spritesmith.png);background-position:-2688px -630px;width:90px;height:90px}.broad_shirt_convict{background-image:url(spritesmith.png);background-position:-2688px -720px;width:90px;height:90px}.broad_shirt_cross{background-image:url(spritesmith.png);background-position:-2688px -810px;width:90px;height:90px}.broad_shirt_fire{background-image:url(spritesmith.png);background-position:-2688px -900px;width:90px;height:90px}.broad_shirt_green{background-image:url(spritesmith.png);background-position:-2688px -990px;width:90px;height:90px}.broad_shirt_horizon{background-image:url(spritesmith.png);background-position:-2688px -1080px;width:90px;height:90px}.broad_shirt_ocean{background-image:url(spritesmith.png);background-position:-2688px -1170px;width:90px;height:90px}.broad_shirt_pink{background-image:url(spritesmith.png);background-position:-2688px -1260px;width:90px;height:90px}.broad_shirt_purple{background-image:url(spritesmith.png);background-position:-990px -2550px;width:90px;height:90px}.broad_shirt_rainbow{background-image:url(spritesmith.png);background-position:-2508px -1170px;width:90px;height:90px}.broad_shirt_redblue{background-image:url(spritesmith.png);background-position:-810px -2370px;width:90px;height:90px}.broad_shirt_thunder{background-image:url(spritesmith.png);background-position:-2238px -810px;width:90px;height:90px}.broad_shirt_tropical{background-image:url(spritesmith.png);background-position:-2058px -1800px;width:90px;height:90px}.broad_shirt_white{background-image:url(spritesmith.png);background-position:-2058px -1710px;width:90px;height:90px}.broad_shirt_yellow{background-image:url(spritesmith.png);background-position:-2058px -1620px;width:90px;height:90px}.broad_shirt_zombie{background-image:url(spritesmith.png);background-position:-2058px -1530px;width:90px;height:90px}.slim_shirt_black{background-image:url(spritesmith.png);background-position:-2058px -1440px;width:90px;height:90px}.slim_shirt_blue{background-image:url(spritesmith.png);background-position:-2058px -1350px;width:90px;height:90px}.slim_shirt_convict{background-image:url(spritesmith.png);background-position:-2058px -1260px;width:90px;height:90px}.slim_shirt_cross{background-image:url(spritesmith.png);background-position:-2058px -1170px;width:90px;height:90px}.slim_shirt_fire{background-image:url(spritesmith.png);background-position:-2058px -1080px;width:90px;height:90px}.slim_shirt_green{background-image:url(spritesmith.png);background-position:-2058px -990px;width:90px;height:90px}.slim_shirt_horizon{background-image:url(spritesmith.png);background-position:-2058px -900px;width:90px;height:90px}.slim_shirt_ocean{background-image:url(spritesmith.png);background-position:-2058px -810px;width:90px;height:90px}.slim_shirt_pink{background-image:url(spritesmith.png);background-position:-2058px -720px;width:90px;height:90px}.slim_shirt_purple{background-image:url(spritesmith.png);background-position:-2058px -630px;width:90px;height:90px}.slim_shirt_rainbow{background-image:url(spritesmith.png);background-position:-2058px -540px;width:90px;height:90px}.slim_shirt_redblue{background-image:url(spritesmith.png);background-position:-2058px -450px;width:90px;height:90px}.slim_shirt_thunder{background-image:url(spritesmith.png);background-position:-2058px -360px;width:90px;height:90px}.slim_shirt_tropical{background-image:url(spritesmith.png);background-position:-2058px -270px;width:90px;height:90px}.slim_shirt_white{background-image:url(spritesmith.png);background-position:-2058px -180px;width:90px;height:90px}.slim_shirt_yellow{background-image:url(spritesmith.png);background-position:-2058px -90px;width:90px;height:90px}.slim_shirt_zombie{background-image:url(spritesmith.png);background-position:-2058px 0;width:90px;height:90px}.shop_armor_base_0{background-image:url(spritesmith.png);background-position:-699px -630px;width:40px;height:40px}.shop_armor_healer_1{background-image:url(spritesmith.png);background-position:-546px -269px;width:40px;height:40px}.shop_armor_healer_2{background-image:url(spritesmith.png);background-position:-546px -309px;width:40px;height:40px}.shop_armor_healer_3{background-image:url(spritesmith.png);background-position:0 -2640px;width:40px;height:40px}.shop_armor_healer_4{background-image:url(spritesmith.png);background-position:-40px -2640px;width:40px;height:40px}.shop_armor_healer_5{background-image:url(spritesmith.png);background-position:-80px -2640px;width:40px;height:40px}.shop_armor_rogue_1{background-image:url(spritesmith.png);background-position:-120px -2640px;width:40px;height:40px}.shop_armor_rogue_2{background-image:url(spritesmith.png);background-position:-160px -2640px;width:40px;height:40px}.shop_armor_rogue_3{background-image:url(spritesmith.png);background-position:-200px -2640px;width:40px;height:40px}.shop_armor_rogue_4{background-image:url(spritesmith.png);background-position:-240px -2640px;width:40px;height:40px}.shop_armor_rogue_5{background-image:url(spritesmith.png);background-position:-280px -2640px;width:40px;height:40px}.shop_armor_special_0{background-image:url(spritesmith.png);background-position:-320px -2640px;width:40px;height:40px}.shop_armor_special_1{background-image:url(spritesmith.png);background-position:-360px -2640px;width:40px;height:40px}.shop_armor_special_2{background-image:url(spritesmith.png);background-position:-400px -2640px;width:40px;height:40px}.shop_armor_special_birthday{background-image:url(spritesmith.png);background-position:-440px -2640px;width:40px;height:40px}.shop_armor_special_candycane{background-image:url(spritesmith.png);background-position:-480px -2640px;width:40px;height:40px}.shop_armor_special_ski{background-image:url(spritesmith.png);background-position:-520px -2640px;width:40px;height:40px}.shop_armor_special_snowflake{background-image:url(spritesmith.png);background-position:-560px -2640px;width:40px;height:40px}.shop_armor_special_yeti{background-image:url(spritesmith.png);background-position:-600px -2640px;width:40px;height:40px}.shop_armor_warrior_1{background-image:url(spritesmith.png);background-position:-640px -2640px;width:40px;height:40px}.shop_armor_warrior_2{background-image:url(spritesmith.png);background-position:-680px -2640px;width:40px;height:40px}.shop_armor_warrior_3{background-image:url(spritesmith.png);background-position:-720px -2640px;width:40px;height:40px}.shop_armor_warrior_4{background-image:url(spritesmith.png);background-position:-760px -2640px;width:40px;height:40px}.shop_armor_warrior_5{background-image:url(spritesmith.png);background-position:-800px -2640px;width:40px;height:40px}.shop_armor_wizard_1{background-image:url(spritesmith.png);background-position:-840px -2640px;width:40px;height:40px}.shop_armor_wizard_2{background-image:url(spritesmith.png);background-position:-880px -2640px;width:40px;height:40px}.shop_armor_wizard_3{background-image:url(spritesmith.png);background-position:-920px -2640px;width:40px;height:40px}.shop_armor_wizard_4{background-image:url(spritesmith.png);background-position:-960px -2640px;width:40px;height:40px}.shop_armor_wizard_5{background-image:url(spritesmith.png);background-position:-1000px -2640px;width:40px;height:40px}.shop_copper{background-image:url(spritesmith.png);background-position:-2739px -1616px;width:32px;height:22px}.shop_eyes{background-image:url(spritesmith.png);background-position:-2736px -1794px;width:40px;height:40px}.shop_gold{background-image:url(spritesmith.png);background-position:-2172px -2070px;width:32px;height:22px}.shop_head_base_0{background-image:url(spritesmith.png);background-position:-2736px -1896px;width:40px;height:40px}.shop_head_healer_{background-image:url(spritesmith.png);background-position:-2736px -1947px;width:40px;height:40px}.shop_head_healer_1{background-image:url(spritesmith.png);background-position:-2736px -1998px;width:40px;height:40px}.shop_head_healer_2{background-image:url(spritesmith.png);background-position:-2736px -2049px;width:40px;height:40px}.shop_head_healer_3{background-image:url(spritesmith.png);background-position:-2736px -2100px;width:40px;height:40px}.shop_head_healer_4{background-image:url(spritesmith.png);background-position:-2736px -2151px;width:40px;height:40px}.shop_head_healer_5{background-image:url(spritesmith.png);background-position:-2736px -2202px;width:40px;height:40px}.shop_head_rogue_1{background-image:url(spritesmith.png);background-position:-2736px -2253px;width:40px;height:40px}.shop_head_rogue_2{background-image:url(spritesmith.png);background-position:-2736px -2304px;width:40px;height:40px}.shop_head_rogue_3{background-image:url(spritesmith.png);background-position:-2736px -2355px;width:40px;height:40px}.shop_head_rogue_4{background-image:url(spritesmith.png);background-position:-2736px -2406px;width:40px;height:40px}.shop_head_rogue_5{background-image:url(spritesmith.png);background-position:-2736px -2457px;width:40px;height:40px}.shop_head_special_0{background-image:url(spritesmith.png);background-position:-2736px -2508px;width:40px;height:40px}.shop_head_special_1{background-image:url(spritesmith.png);background-position:-2736px -2559px;width:40px;height:40px}.shop_head_special_2{background-image:url(spritesmith.png);background-position:-1887px -1565px;width:40px;height:40px}.shop_head_special_candycane{background-image:url(spritesmith.png);background-position:-1927px -1565px;width:40px;height:40px}.shop_head_special_nye{background-image:url(spritesmith.png);background-position:-1887px -1605px;width:40px;height:40px}.shop_head_special_ski{background-image:url(spritesmith.png);background-position:-1927px -1605px;width:40px;height:40px}.shop_head_special_snowflake{background-image:url(spritesmith.png);background-position:-1887px -1645px;width:40px;height:40px}.shop_head_special_yeti{background-image:url(spritesmith.png);background-position:-1927px -1645px;width:40px;height:40px}.shop_head_warrior_1{background-image:url(spritesmith.png);background-position:-1887px -1685px;width:40px;height:40px}.shop_head_warrior_2{background-image:url(spritesmith.png);background-position:-1927px -1685px;width:40px;height:40px}.shop_head_warrior_3{background-image:url(spritesmith.png);background-position:-1887px -1725px;width:40px;height:40px}.shop_head_warrior_4{background-image:url(spritesmith.png);background-position:-1927px -1725px;width:40px;height:40px}.shop_head_warrior_5{background-image:url(spritesmith.png);background-position:-1887px -1765px;width:40px;height:40px}.shop_head_wizard_1{background-image:url(spritesmith.png);background-position:-1927px -1765px;width:40px;height:40px}.shop_head_wizard_2{background-image:url(spritesmith.png);background-position:-1806px -1683px;width:40px;height:40px}.shop_head_wizard_3{background-image:url(spritesmith.png);background-position:-1846px -1683px;width:40px;height:40px}.shop_head_wizard_4{background-image:url(spritesmith.png);background-position:-1725px -1584px;width:40px;height:40px}.shop_head_wizard_5{background-image:url(spritesmith.png);background-position:-1765px -1584px;width:40px;height:40px}.shop_potion{background-image:url(spritesmith.png);background-position:-1644px -1584px;width:40px;height:40px}.shop_reroll{background-image:url(spritesmith.png);background-position:-1684px -1584px;width:40px;height:40px}.shop_shield_base_0{background-image:url(spritesmith.png);background-position:-1539px -1470px;width:40px;height:40px}.shop_shield_healer_1{background-image:url(spritesmith.png);background-position:-1579px -1470px;width:40px;height:40px}.shop_shield_healer_2{background-image:url(spritesmith.png);background-position:-1434px -1365px;width:40px;height:40px}.shop_shield_healer_3{background-image:url(spritesmith.png);background-position:-1474px -1365px;width:40px;height:40px}.shop_shield_healer_4{background-image:url(spritesmith.png);background-position:-1329px -1260px;width:40px;height:40px}.shop_shield_healer_5{background-image:url(spritesmith.png);background-position:-1369px -1260px;width:40px;height:40px}.shop_shield_rogue_0{background-image:url(spritesmith.png);background-position:-1224px -1155px;width:40px;height:40px}.shop_shield_rogue_1{background-image:url(spritesmith.png);background-position:-1264px -1155px;width:40px;height:40px}.shop_shield_rogue_2{background-image:url(spritesmith.png);background-position:-1119px -1050px;width:40px;height:40px}.shop_shield_rogue_3{background-image:url(spritesmith.png);background-position:-1159px -1050px;width:40px;height:40px}.shop_shield_rogue_4{background-image:url(spritesmith.png);background-position:-1014px -945px;width:40px;height:40px}.shop_shield_rogue_5{background-image:url(spritesmith.png);background-position:-1054px -945px;width:40px;height:40px}.shop_shield_rogue_6{background-image:url(spritesmith.png);background-position:-909px -840px;width:40px;height:40px}.shop_shield_special_0{background-image:url(spritesmith.png);background-position:-949px -840px;width:40px;height:40px}.shop_shield_special_1{background-image:url(spritesmith.png);background-position:-804px -735px;width:40px;height:40px}.shop_shield_special_ski{background-image:url(spritesmith.png);background-position:-844px -735px;width:40px;height:40px}.shop_shield_special_snowflake{background-image:url(spritesmith.png);background-position:-2736px -1692px;width:40px;height:40px}.shop_shield_special_yeti{background-image:url(spritesmith.png);background-position:-739px -630px;width:40px;height:40px}.shop_shield_warrior_1{background-image:url(spritesmith.png);background-position:-594px -525px;width:40px;height:40px}.shop_shield_warrior_2{background-image:url(spritesmith.png);background-position:-634px -525px;width:40px;height:40px}.shop_shield_warrior_3{background-image:url(spritesmith.png);background-position:-550px -138px;width:40px;height:40px}.shop_shield_warrior_4{background-image:url(spritesmith.png);background-position:-550px -178px;width:40px;height:40px}.shop_shield_warrior_5{background-image:url(spritesmith.png);background-position:-550px -218px;width:40px;height:40px}.shop_silver{background-image:url(spritesmith.png);background-position:-2739px -1565px;width:32px;height:22px}.shop_snowball{background-image:url(spritesmith.png);background-position:-2204px -2070px;width:32px;height:22px}.shop_weapon_base_0{background-image:url(spritesmith.png);background-position:-534px -354px;width:40px;height:40px}.shop_weapon_healer_0{background-image:url(spritesmith.png);background-position:-534px -394px;width:40px;height:40px}.shop_weapon_healer_1{background-image:url(spritesmith.png);background-position:-525px -477px;width:40px;height:40px}.shop_weapon_healer_2{background-image:url(spritesmith.png);background-position:-525px -517px;width:40px;height:40px}.shop_weapon_healer_3{background-image:url(spritesmith.png);background-position:-630px -582px;width:40px;height:40px}.shop_weapon_healer_4{background-image:url(spritesmith.png);background-position:-630px -622px;width:40px;height:40px}.shop_weapon_healer_5{background-image:url(spritesmith.png);background-position:-735px -687px;width:40px;height:40px}.shop_weapon_healer_6{background-image:url(spritesmith.png);background-position:-735px -727px;width:40px;height:40px}.shop_weapon_rogue_0{background-image:url(spritesmith.png);background-position:-840px -792px;width:40px;height:40px}.shop_weapon_rogue_1{background-image:url(spritesmith.png);background-position:-840px -832px;width:40px;height:40px}.shop_weapon_rogue_2{background-image:url(spritesmith.png);background-position:-945px -897px;width:40px;height:40px}.shop_weapon_rogue_3{background-image:url(spritesmith.png);background-position:-945px -937px;width:40px;height:40px}.shop_weapon_rogue_4{background-image:url(spritesmith.png);background-position:-1050px -1002px;width:40px;height:40px}.shop_weapon_rogue_5{background-image:url(spritesmith.png);background-position:-1050px -1042px;width:40px;height:40px}.shop_weapon_rogue_6{background-image:url(spritesmith.png);background-position:-1155px -1107px;width:40px;height:40px}.shop_weapon_special_0{background-image:url(spritesmith.png);background-position:-1155px -1147px;width:40px;height:40px}.shop_weapon_special_1{background-image:url(spritesmith.png);background-position:-1260px -1212px;width:40px;height:40px}.shop_weapon_special_2{background-image:url(spritesmith.png);background-position:-1260px -1252px;width:40px;height:40px}.shop_weapon_special_3{background-image:url(spritesmith.png);background-position:-1365px -1317px;width:40px;height:40px}.shop_weapon_special_candycane{background-image:url(spritesmith.png);background-position:-1365px -1357px;width:40px;height:40px}.shop_weapon_special_critical{background-image:url(spritesmith.png);background-position:-1470px -1422px;width:40px;height:40px}.shop_weapon_special_ski{background-image:url(spritesmith.png);background-position:-1470px -1462px;width:40px;height:40px}.shop_weapon_special_snowflake{background-image:url(spritesmith.png);background-position:-1890px -1830px;width:40px;height:40px}.shop_weapon_special_yeti{background-image:url(spritesmith.png);background-position:-1890px -1870px;width:40px;height:40px}.shop_weapon_warrior_0{background-image:url(spritesmith.png);background-position:-1980px -1920px;width:40px;height:40px}.shop_weapon_warrior_1{background-image:url(spritesmith.png);background-position:-1980px -1960px;width:40px;height:40px}.shop_weapon_warrior_2{background-image:url(spritesmith.png);background-position:-2085px -2010px;width:40px;height:40px}.shop_weapon_warrior_3{background-image:url(spritesmith.png);background-position:-2085px -2050px;width:40px;height:40px}.shop_weapon_warrior_4{background-image:url(spritesmith.png);background-position:-2160px -2100px;width:40px;height:40px}.shop_weapon_warrior_5{background-image:url(spritesmith.png);background-position:-2160px -2140px;width:40px;height:40px}.shop_weapon_warrior_6{background-image:url(spritesmith.png);background-position:-2250px -2190px;width:40px;height:40px}.shop_weapon_wizard_0{background-image:url(spritesmith.png);background-position:-2250px -2230px;width:40px;height:40px}.shop_weapon_wizard_1{background-image:url(spritesmith.png);background-position:-2340px -2280px;width:40px;height:40px}.shop_weapon_wizard_2{background-image:url(spritesmith.png);background-position:-2340px -2320px;width:40px;height:40px}.shop_weapon_wizard_3{background-image:url(spritesmith.png);background-position:-2430px -2370px;width:40px;height:40px}.shop_weapon_wizard_4{background-image:url(spritesmith.png);background-position:-2430px -2410px;width:40px;height:40px}.shop_weapon_wizard_5{background-image:url(spritesmith.png);background-position:-2520px -2460px;width:40px;height:40px}.shop_weapon_wizard_6{background-image:url(spritesmith.png);background-position:-2520px -2500px;width:40px;height:40px}.zzz{background-image:url(spritesmith.png);background-position:-2642px -2550px;width:40px;height:40px}.zzz_light{background-image:url(spritesmith.png);background-position:-2642px -2590px;width:40px;height:40px}.skin_0ff591{background-image:url(spritesmith.png);background-position:-1890px -1920px;width:90px;height:90px}.skin_2b43f6{background-image:url(spritesmith.png);background-position:-1800px -1920px;width:90px;height:90px}.skin_6bd049{background-image:url(spritesmith.png);background-position:-1710px -1920px;width:90px;height:90px}.skin_800ed0{background-image:url(spritesmith.png);background-position:-1620px -1920px;width:90px;height:90px}.skin_915533{background-image:url(spritesmith.png);background-position:-1530px -1920px;width:90px;height:90px}.skin_98461a{background-image:url(spritesmith.png);background-position:-1440px -1920px;width:90px;height:90px}.skin_c06534{background-image:url(spritesmith.png);background-position:-1350px -1920px;width:90px;height:90px}.skin_c3e1dc{background-image:url(spritesmith.png);background-position:-1260px -1920px;width:90px;height:90px}.skin_d7a9f7{background-image:url(spritesmith.png);background-position:-1170px -1920px;width:90px;height:90px}.skin_ddc994{background-image:url(spritesmith.png);background-position:-1080px -1920px;width:90px;height:90px}.skin_ea8349{background-image:url(spritesmith.png);background-position:-990px -1920px;width:90px;height:90px}.skin_eb052b{background-image:url(spritesmith.png);background-position:-900px -1920px;width:90px;height:90px}.skin_f5a76e{background-image:url(spritesmith.png);background-position:-810px -1920px;width:90px;height:90px}.skin_f5d70f{background-image:url(spritesmith.png);background-position:-720px -1920px;width:90px;height:90px}.skin_f69922{background-image:url(spritesmith.png);background-position:-630px -1920px;width:90px;height:90px}.skin_ghost{background-image:url(spritesmith.png);background-position:-540px -1920px;width:90px;height:90px}.skin_monster{background-image:url(spritesmith.png);background-position:-450px -1920px;width:90px;height:90px}.skin_pumpkin{background-image:url(spritesmith.png);background-position:-360px -1920px;width:90px;height:90px}.skin_rainbow{background-image:url(spritesmith.png);background-position:-270px -1920px;width:90px;height:90px}.skin_shadow{background-image:url(spritesmith.png);background-position:-180px -1920px;width:90px;height:90px}.skin_skeleton{background-image:url(spritesmith.png);background-position:-90px -1920px;width:90px;height:90px}.skin_zombie{background-image:url(spritesmith.png);background-position:0 -1920px;width:90px;height:90px}.weapon_healer_0{background-image:url(spritesmith.png);background-position:-1968px -1800px;width:90px;height:90px}.weapon_healer_1{background-image:url(spritesmith.png);background-position:-1968px -1710px;width:90px;height:90px}.weapon_healer_2{background-image:url(spritesmith.png);background-position:-1968px -1620px;width:90px;height:90px}.weapon_healer_3{background-image:url(spritesmith.png);background-position:-1968px -1530px;width:90px;height:90px}.weapon_healer_4{background-image:url(spritesmith.png);background-position:-1968px -1440px;width:90px;height:90px}.weapon_healer_5{background-image:url(spritesmith.png);background-position:-1968px -1350px;width:90px;height:90px}.weapon_healer_6{background-image:url(spritesmith.png);background-position:-1968px -1260px;width:90px;height:90px}.weapon_rogue_0{background-image:url(spritesmith.png);background-position:-1968px -1170px;width:90px;height:90px}.weapon_rogue_1{background-image:url(spritesmith.png);background-position:-1968px -1080px;width:90px;height:90px}.weapon_rogue_2{background-image:url(spritesmith.png);background-position:-1968px -990px;width:90px;height:90px}.weapon_rogue_3{background-image:url(spritesmith.png);background-position:-1968px -900px;width:90px;height:90px}.weapon_rogue_4{background-image:url(spritesmith.png);background-position:-1968px -810px;width:90px;height:90px}.weapon_rogue_5{background-image:url(spritesmith.png);background-position:-1995px -2010px;width:90px;height:90px}.weapon_rogue_6{background-image:url(spritesmith.png);background-position:-1905px -2010px;width:90px;height:90px}.weapon_special_1{background-image:url(spritesmith.png);background-position:-1800px -2010px;width:105px;height:90px}.weapon_special_2{background-image:url(spritesmith.png);background-position:-1710px -2010px;width:90px;height:90px}.weapon_special_3{background-image:url(spritesmith.png);background-position:-1620px -2010px;width:90px;height:90px}.weapon_special_candycane{background-image:url(spritesmith.png);background-position:-1530px -2010px;width:90px;height:90px}.weapon_special_ski{background-image:url(spritesmith.png);background-position:-1440px -2010px;width:90px;height:90px}.weapon_special_snowflake{background-image:url(spritesmith.png);background-position:-1350px -2010px;width:90px;height:90px}.weapon_special_yeti{background-image:url(spritesmith.png);background-position:-1260px -2010px;width:90px;height:90px}.weapon_warrior_0{background-image:url(spritesmith.png);background-position:-1170px -2010px;width:90px;height:90px}.weapon_warrior_1{background-image:url(spritesmith.png);background-position:-1080px -2010px;width:90px;height:90px}.weapon_warrior_2{background-image:url(spritesmith.png);background-position:-990px -2010px;width:90px;height:90px}.weapon_warrior_3{background-image:url(spritesmith.png);background-position:-900px -2010px;width:90px;height:90px}.weapon_warrior_4{background-image:url(spritesmith.png);background-position:-810px -2010px;width:90px;height:90px}.weapon_warrior_5{background-image:url(spritesmith.png);background-position:-720px -2010px;width:90px;height:90px}.weapon_warrior_6{background-image:url(spritesmith.png);background-position:-630px -2010px;width:90px;height:90px}.weapon_wizard_0{background-image:url(spritesmith.png);background-position:-540px -2010px;width:90px;height:90px}.weapon_wizard_1{background-image:url(spritesmith.png);background-position:-450px -2010px;width:90px;height:90px}.weapon_wizard_2{background-image:url(spritesmith.png);background-position:-360px -2010px;width:90px;height:90px}.weapon_wizard_3{background-image:url(spritesmith.png);background-position:-270px -2010px;width:90px;height:90px}.weapon_wizard_4{background-image:url(spritesmith.png);background-position:-180px -2010px;width:90px;height:90px}.weapon_wizard_5{background-image:url(spritesmith.png);background-position:-90px -2010px;width:90px;height:90px}.weapon_wizard_6{background-image:url(spritesmith.png);background-position:0 -2010px;width:90px;height:90px}.head_special_0,.weapon_special_0{width:105px;height:105px;margin-left:-3px;margin-top:-18px}.broad_armor_special_0,.shield_special_0,.slim_armor_special_0{width:90px;height:90px}.weapon_special_critical{background:url(../img/sprites/backer-only/weapon_special_critical.gif) no-repeat;width:90px;height:90px;margin-left:-12px;margin-top:12px}.weapon_special_1{height:105px;margin-left:-11px;margin-top:6px}.broad_armor_special_1,.head_special_1,.slim_armor_special_1{width:90px;height:90px}.head_special_0{background:url(../img/sprites/backer-only/BackerOnly-Equip-ShadeHelmet.gif) no-repeat}.head_special_1{background:url(../img/sprites/backer-only/ContributorOnly-Equip-CrystalHelmet.gif) no-repeat;margin-top:3px}.broad_armor_special_0,.slim_armor_special_0{background:url(../img/sprites/backer-only/BackerOnly-Equip-ShadeArmor.gif) no-repeat}.broad_armor_special_1,.slim_armor_special_1{background:url(../img/sprites/backer-only/ContributorOnly-Equip-CrystalArmor.gif) no-repeat}.shield_special_0{background:url(../img/sprites/backer-only/BackerOnly-Shield-TormentedSkull.gif) no-repeat}.weapon_special_0{background:url(../img/sprites/backer-only/BackerOnly-Weapon-DarkSoulsBlade.gif) no-repeat}.Pet-Wolf-Cerberus{width:105px;height:72px;background:url(../img/sprites/backer-only/BackerOnly-Pet-CerberusPup.gif) no-repeat}.npc_ian{background:url(../img/sprites/npc_ian.gif) no-repeat;width:78px;height:135px}.Gems{display:inline-block;margin-right:5px;border-style:none;margin-left:0;margin-top:2px}.inline-gems{vertical-align:middle;margin-left:0;display:inline-block}.customize-menu .locked{background-color:#727272}.achievement{float:left;clear:right;margin-right:10px}[class*=Mount_Body_],[class*=Mount_Head_]{margin-top:18px} \ No newline at end of file diff --git a/dist/habitrpg-shared.js b/dist/habitrpg-shared.js index 4ffda4c28e..ba1bd1da21 100644 --- a/dist/habitrpg-shared.js +++ b/dist/habitrpg-shared.js @@ -1,4 +1,4 @@ -;(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o * Build: `lodash modern -o ./dist/lodash.js` @@ -6850,9 +6851,10 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? } }.call(this)); +}).call(this,typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) },{}],4:[function(require,module,exports){ //! moment.js -//! version : 2.4.0 +//! version : 2.5.1 //! authors : Tim Wood, Iskren Chernev, Moment.js contributors //! license : MIT //! momentjs.com @@ -6864,7 +6866,8 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? ************************************/ var moment, - VERSION = "2.4.0", + VERSION = "2.5.1", + global = this, round = Math.round, i, @@ -6879,8 +6882,21 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? // internal storage for language config files languages = {}, + // moment internal properties + momentProperties = { + _isAMomentObject: null, + _i : null, + _f : null, + _l : null, + _strict : null, + _isUTC : null, + _offset : null, // optional. Combine with _isUTC + _pf : null, + _lang : null // optional + }, + // check for nodeJS - hasModule = (typeof module !== 'undefined' && module.exports), + hasModule = (typeof module !== 'undefined' && module.exports && typeof require !== 'undefined'), // ASP.NET json date format regex aspNetJsonRegex = /^\/?Date\((\-?\d+)/i, @@ -6891,32 +6907,40 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? isoDurationRegex = /^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/, // format tokens - formattingTokens = /(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|X|zz?|ZZ?|.)/g, + formattingTokens = /(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|X|zz?|ZZ?|.)/g, localFormattingTokens = /(\[[^\[]*\])|(\\)?(LT|LL?L?L?|l{1,4})/g, // parsing token regexes parseTokenOneOrTwoDigits = /\d\d?/, // 0 - 99 parseTokenOneToThreeDigits = /\d{1,3}/, // 0 - 999 - parseTokenThreeDigits = /\d{3}/, // 000 - 999 - parseTokenFourDigits = /\d{1,4}/, // 0 - 9999 - parseTokenSixDigits = /[+\-]?\d{1,6}/, // -999,999 - 999,999 + parseTokenOneToFourDigits = /\d{1,4}/, // 0 - 9999 + parseTokenOneToSixDigits = /[+\-]?\d{1,6}/, // -999,999 - 999,999 parseTokenDigits = /\d+/, // nonzero number of digits parseTokenWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i, // any word (or two) characters or numbers including two/three word month in arabic. - parseTokenTimezone = /Z|[\+\-]\d\d:?\d\d/i, // +00:00 -00:00 +0000 -0000 or Z - parseTokenT = /T/i, // T (ISO seperator) + parseTokenTimezone = /Z|[\+\-]\d\d:?\d\d/gi, // +00:00 -00:00 +0000 -0000 or Z + parseTokenT = /T/i, // T (ISO separator) parseTokenTimestampMs = /[\+\-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123 - // preliminary iso regex - // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000) - isoRegex = /^\s*\d{4}-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?([\+\-]\d\d:?\d\d|Z)?)?$/, + //strict parsing regexes + parseTokenOneDigit = /\d/, // 0 - 9 + parseTokenTwoDigits = /\d\d/, // 00 - 99 + parseTokenThreeDigits = /\d{3}/, // 000 - 999 + parseTokenFourDigits = /\d{4}/, // 0000 - 9999 + parseTokenSixDigits = /[+-]?\d{6}/, // -999,999 - 999,999 + parseTokenSignedNumber = /[+-]?\d+/, // -inf - inf + + // iso 8601 regex + // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) + isoRegex = /^\s*(?:[+-]\d{6}|\d{4})-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/, isoFormat = 'YYYY-MM-DDTHH:mm:ssZ', isoDates = [ - 'YYYY-MM-DD', - 'GGGG-[W]WW', - 'GGGG-[W]WW-E', - 'YYYY-DDD' + ['YYYYYY-MM-DD', /[+-]\d{6}-\d{2}-\d{2}/], + ['YYYY-MM-DD', /\d{4}-\d{2}-\d{2}/], + ['GGGG-[W]WW-E', /\d{4}-W\d{2}-\d/], + ['GGGG-[W]WW', /\d{4}-W\d{2}/], + ['YYYY-DDD', /\d{4}-\d{3}/] ], // iso time formats and regexes @@ -7018,11 +7042,15 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? YYYYY : function () { return leftZeroFill(this.year(), 5); }, + YYYYYY : function () { + var y = this.year(), sign = y >= 0 ? '+' : '-'; + return sign + leftZeroFill(Math.abs(y), 6); + }, gg : function () { return leftZeroFill(this.weekYear() % 100, 2); }, gggg : function () { - return this.weekYear(); + return leftZeroFill(this.weekYear(), 4); }, ggggg : function () { return leftZeroFill(this.weekYear(), 5); @@ -7031,7 +7059,7 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? return leftZeroFill(this.isoWeekYear() % 100, 2); }, GGGG : function () { - return this.isoWeekYear(); + return leftZeroFill(this.isoWeekYear(), 4); }, GGGGG : function () { return leftZeroFill(this.isoWeekYear(), 5); @@ -7088,7 +7116,7 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? a = -a; b = "-"; } - return b + leftZeroFill(toInt(10 * a / 6), 4); + return b + leftZeroFill(toInt(a / 60), 2) + leftZeroFill(toInt(a) % 60, 2); }, z : function () { return this.zoneAbbr(); @@ -7098,11 +7126,31 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? }, X : function () { return this.unix(); + }, + Q : function () { + return this.quarter(); } }, lists = ['months', 'monthsShort', 'weekdays', 'weekdaysShort', 'weekdaysMin']; + function defaultParsingFlags() { + // We need to deep clone this object, and es5 standard is not very + // helpful. + return { + empty : false, + unusedTokens : [], + unusedInput : [], + overflow : -2, + charsLeftOver : 0, + nullInput : false, + invalidMonth : null, + invalidFormat : false, + userInvalidated : false, + iso: false + }; + } + function padToken(func, count) { return function (a) { return leftZeroFill(func.call(this, a), count); @@ -7151,9 +7199,6 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? seconds = normalizedInput.second || 0, milliseconds = normalizedInput.millisecond || 0; - // store reference to input for deterministic cloning - this._input = duration; - // representation for dateAddRemove this._milliseconds = +milliseconds + seconds * 1e3 + // 1000 @@ -7197,6 +7242,17 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? return a; } + function cloneMoment(m) { + var result = {}, i; + for (i in m) { + if (m.hasOwnProperty(i) && momentProperties.hasOwnProperty(i)) { + result[i] = m[i]; + } + } + + return result; + } + function absRound(number) { if (number < 0) { return Math.ceil(number); @@ -7207,12 +7263,14 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? // left zero fill a number // see http://jsperf.com/left-zero-filling for performance comparison - function leftZeroFill(number, targetLength) { - var output = number + ''; + function leftZeroFill(number, targetLength, forceSign) { + var output = '' + Math.abs(number), + sign = number >= 0; + while (output.length < targetLength) { output = '0' + output; } - return output; + return (sign ? (forceSign ? '+' : '') : '-') + output; } // helper function for _.addTime and _.subtractTime @@ -7283,8 +7341,7 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? function normalizeObjectUnits(inputObject) { var normalizedInput = {}, normalizedProp, - prop, - index; + prop; for (prop in inputObject) { if (inputObject.hasOwnProperty(prop)) { @@ -7387,21 +7444,6 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? } } - function initializeParsingFlags(config) { - config._pf = { - empty : false, - unusedTokens : [], - unusedInput : [], - overflow : -2, - charsLeftOver : 0, - nullInput : false, - invalidMonth : null, - invalidFormat : false, - userInvalidated : false, - iso: false - }; - } - function isValid(m) { if (m._isValid == null) { m._isValid = !isNaN(m._d.getTime()) && @@ -7425,6 +7467,12 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? return key ? key.toLowerCase().replace('_', '-') : key; } + // Return a moment from input, that is local/utc/zone equivalent to model. + function makeAs(input, model) { + return model._isUTC ? moment(input).zone(model._offset || 0) : + moment(input).local(); + } + /************************************ Languages ************************************/ @@ -7756,21 +7804,32 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? // get the regex to find the next token function getParseRegexForToken(token, config) { - var a; + var a, strict = config._strict; switch (token) { case 'DDDD': return parseTokenThreeDigits; case 'YYYY': case 'GGGG': case 'gggg': - return parseTokenFourDigits; + return strict ? parseTokenFourDigits : parseTokenOneToFourDigits; + case 'Y': + case 'G': + case 'g': + return parseTokenSignedNumber; + case 'YYYYYY': case 'YYYYY': case 'GGGGG': case 'ggggg': - return parseTokenSixDigits; + return strict ? parseTokenSixDigits : parseTokenOneToSixDigits; case 'S': + if (strict) { return parseTokenOneDigit; } + /* falls through */ case 'SS': + if (strict) { return parseTokenTwoDigits; } + /* falls through */ case 'SSS': + if (strict) { return parseTokenThreeDigits; } + /* falls through */ case 'DDD': return parseTokenOneToThreeDigits; case 'MMM': @@ -7800,6 +7859,9 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? case 'hh': case 'mm': case 'ss': + case 'ww': + case 'WW': + return strict ? parseTokenTwoDigits : parseTokenOneOrTwoDigits; case 'M': case 'D': case 'd': @@ -7808,9 +7870,7 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? case 'm': case 's': case 'w': - case 'ww': case 'W': - case 'WW': case 'e': case 'E': return parseTokenOneOrTwoDigits; @@ -7821,8 +7881,10 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? } function timezoneMinutesFromString(string) { - var tzchunk = (parseTokenTimezone.exec(string) || [])[0], - parts = (tzchunk + '').match(parseTimezoneChunker) || ['-', 0, 0], + string = string || ""; + var possibleTzMatches = (string.match(parseTokenTimezone) || []), + tzChunk = possibleTzMatches[possibleTzMatches.length - 1] || [], + parts = (tzChunk + '').match(parseTimezoneChunker) || ['-', 0, 0], minutes = +(parts[1] * 60) + toInt(parts[2]); return parts[0] === '+' ? -minutes : minutes; @@ -7871,6 +7933,7 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? break; case 'YYYY' : case 'YYYYY' : + case 'YYYYYY' : datePartArray[YEAR] = toInt(input); break; // AM / PM @@ -7955,8 +8018,9 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? //compute day of the year from weeks and weekdays if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { fixYear = function (val) { + var int_val = parseInt(val, 10); return val ? - (val.length < 3 ? (parseInt(val, 10) > 68 ? '19' + val : '20' + val) : val) : + (val.length < 3 ? (int_val > 68 ? 1900 + int_val : 2000 + int_val) : int_val) : (config._a[YEAR] == null ? moment().weekYear() : config._a[YEAR]); }; @@ -8068,7 +8132,7 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? for (i = 0; i < tokens.length; i++) { token = tokens[i]; - parsedInput = (getParseRegexForToken(token, config).exec(string) || [])[0]; + parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; if (parsedInput) { skipped = string.substr(0, string.indexOf(parsedInput)); if (skipped.length > 0) { @@ -8140,7 +8204,7 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? for (i = 0; i < config._f.length; i++) { currentScore = 0; tempConfig = extend({}, config); - initializeParsingFlags(tempConfig); + tempConfig._pf = defaultParsingFlags(); tempConfig._f = config._f[i]; makeDateFromStringAndFormat(tempConfig); @@ -8167,26 +8231,26 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? // date from iso format function makeDateFromString(config) { - var i, + var i, l, string = config._i, match = isoRegex.exec(string); if (match) { config._pf.iso = true; - for (i = 4; i > 0; i--) { - if (match[i]) { + for (i = 0, l = isoDates.length; i < l; i++) { + if (isoDates[i][1].exec(string)) { // match[5] should be "T" or undefined - config._f = isoDates[i - 1] + (match[6] || " "); + config._f = isoDates[i][0] + (match[6] || " "); break; } } - for (i = 0; i < 4; i++) { + for (i = 0, l = isoTimes.length; i < l; i++) { if (isoTimes[i][1].exec(string)) { config._f += isoTimes[i][0]; break; } } - if (parseTokenTimezone.exec(string)) { + if (string.match(parseTokenTimezone)) { config._f += "Z"; } makeDateFromStringAndFormat(config); @@ -8321,11 +8385,10 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday function dayOfYearFromWeeks(year, week, weekday, firstDayOfWeekOfYear, firstDayOfWeek) { - var d = new Date(Date.UTC(year, 0)).getUTCDay(), - daysToAdd, dayOfYear; + var d = makeUTCDate(year, 0, 1).getUTCDay(), daysToAdd, dayOfYear; weekday = weekday != null ? weekday : firstDayOfWeek; - daysToAdd = firstDayOfWeek - d + (d > firstDayOfWeekOfYear ? 7 : 0); + daysToAdd = firstDayOfWeek - d + (d > firstDayOfWeekOfYear ? 7 : 0) - (d < firstDayOfWeek ? 7 : 0); dayOfYear = 7 * (week - 1) + (weekday - firstDayOfWeek) + daysToAdd + 1; return { @@ -8342,10 +8405,6 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? var input = config._i, format = config._f; - if (typeof config._pf === 'undefined') { - initializeParsingFlags(config); - } - if (input === null) { return moment.invalid({nullInput: true}); } @@ -8355,7 +8414,7 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? } if (moment.isMoment(input)) { - config = extend({}, input); + config = cloneMoment(input); config._d = new Date(+input._d); } else if (format) { @@ -8372,37 +8431,47 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? } moment = function (input, format, lang, strict) { + var c; + if (typeof(lang) === "boolean") { strict = lang; lang = undefined; } - return makeMoment({ - _i : input, - _f : format, - _l : lang, - _strict : strict, - _isUTC : false - }); + // object construction must be done this way. + // https://github.com/moment/moment/issues/1423 + c = {}; + c._isAMomentObject = true; + c._i = input; + c._f = format; + c._l = lang; + c._strict = strict; + c._isUTC = false; + c._pf = defaultParsingFlags(); + + return makeMoment(c); }; // creating with utc moment.utc = function (input, format, lang, strict) { - var m; + var c; if (typeof(lang) === "boolean") { strict = lang; lang = undefined; } - m = makeMoment({ - _useUTC : true, - _isUTC : true, - _l : lang, - _i : input, - _f : format, - _strict : strict - }).utc(); + // object construction must be done this way. + // https://github.com/moment/moment/issues/1423 + c = {}; + c._isAMomentObject = true; + c._useUTC = true; + c._isUTC = true; + c._l = lang; + c._i = input; + c._f = format; + c._strict = strict; + c._pf = defaultParsingFlags(); - return m; + return makeMoment(c).utc(); }; // creating with unix timestamp (in seconds) @@ -8412,18 +8481,21 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? // duration moment.duration = function (input, key) { - var isDuration = moment.isDuration(input), - isNumber = (typeof input === 'number'), - duration = (isDuration ? input._input : (isNumber ? {} : input)), + var duration = input, // matching against regexp is expensive, do it on demand match = null, sign, ret, - parseIso, - timeEmpty, - dateTimeEmpty; + parseIso; - if (isNumber) { + if (moment.isDuration(input)) { + duration = { + ms: input._milliseconds, + d: input._days, + M: input._months + }; + } else if (typeof input === 'number') { + duration = {}; if (key) { duration[key] = input; } else { @@ -8462,7 +8534,7 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? ret = new Duration(duration); - if (isDuration && input.hasOwnProperty('_lang')) { + if (moment.isDuration(input) && input.hasOwnProperty('_lang')) { ret._lang = input._lang; } @@ -8509,7 +8581,8 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? // compare moment object moment.isMoment = function (obj) { - return obj instanceof Moment; + return obj instanceof Moment || + (obj != null && obj.hasOwnProperty('_isAMomentObject')); }; // for typechecking Duration objects @@ -8569,7 +8642,12 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? }, toISOString : function () { - return formatMoment(moment(this).utc(), 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); + var m = moment(this).utc(); + if (0 < m.year() && m.year() <= 9999) { + return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); + } else { + return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); + } }, toArray : function () { @@ -8646,7 +8724,7 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? }, diff : function (input, units, asFloat) { - var that = this._isUTC ? moment(input).zone(this._offset || 0) : moment(input).local(), + var that = makeAs(input, this), zoneDiff = (this.zone() - that.zone()) * 6e4, diff, output; @@ -8688,13 +8766,16 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? }, calendar : function () { - var diff = this.diff(moment().zone(this.zone()).startOf('day'), 'days', true), + // We want to compare the start of today, vs this. + // Getting start-of-today depends on whether we're zone'd or not. + var sod = makeAs(moment(), this).startOf('day'), + diff = this.diff(sod, 'days', true), format = diff < -6 ? 'sameElse' : - diff < -1 ? 'lastWeek' : - diff < 0 ? 'lastDay' : - diff < 1 ? 'sameDay' : - diff < 2 ? 'nextDay' : - diff < 7 ? 'nextWeek' : 'sameElse'; + diff < -1 ? 'lastWeek' : + diff < 0 ? 'lastDay' : + diff < 1 ? 'sameDay' : + diff < 2 ? 'nextDay' : + diff < 7 ? 'nextWeek' : 'sameElse'; return this.format(this.lang().calendar(format, this)); }, @@ -8794,8 +8875,8 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? }, isSame: function (input, units) { - units = typeof units !== 'undefined' ? units : 'millisecond'; - return +this.clone().startOf(units) === +moment(input).startOf(units); + units = units || 'ms'; + return +this.clone().startOf(units) === +makeAs(input, this).startOf(units); }, min: function (other) { @@ -8837,7 +8918,9 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? }, parseZone : function () { - if (typeof this._i === 'string') { + if (this._tzm) { + this.zone(this._tzm); + } else if (typeof this._i === 'string') { this.zone(this._i); } return this; @@ -8863,6 +8946,10 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? return input == null ? dayOfYear : this.add("d", (input - dayOfYear)); }, + quarter : function () { + return Math.ceil((this.month() + 1.0) / 3.0); + }, + weekYear : function (input) { var year = weekOfYear(this, this.lang()._week.dow, this.lang()._week.doy).year; return input == null ? year : this.add("y", (input - year)); @@ -9133,7 +9220,7 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? // add `moment` as a global object via a string identifier, // for Closure Compiler "advanced" mode if (deprecate) { - this.moment = function () { + global.moment = function () { if (!warned && console && console.warn) { warned = true; console.warn( @@ -9143,8 +9230,9 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? } return local_moment.apply(null, arguments); }; + extend(global.moment, local_moment); } else { - this['moment'] = moment; + global['moment'] = moment; } } @@ -9154,7 +9242,7 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? makeGlobal(true); } else if (typeof define === "function" && define.amd) { define("moment", function (require, exports, module) { - if (module.config().noGlobal !== true) { + if (module.config && module.config() && module.config().noGlobal !== true) { // If user provided noGlobal, he is aware of global makeGlobal(module.config().noGlobal === undefined); } @@ -9167,3899 +9255,3808 @@ var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? }).call(this); },{}],5:[function(require,module,exports){ -(function() { - var api, classes, diminishingReturns, events, gear, gearTypes, moment, repeat, _; +var api, classes, diminishingReturns, events, gear, gearTypes, moment, repeat, _; - _ = require('lodash'); +_ = require('lodash'); - api = module.exports; +api = module.exports; - moment = require('moment'); - - /* - --------------------------------------------------------------- - Gear (Weapons, Armor, Head, Shield) - Item definitions: {index, text, notes, value, str, def, int, per, classes, type} - --------------------------------------------------------------- - */ +moment = require('moment'); - classes = ['warrior', 'rogue', 'healer', 'wizard']; +/* + --------------------------------------------------------------- + Gear (Weapons, Armor, Head, Shield) + Item definitions: {index, text, notes, value, str, def, int, per, classes, type} + --------------------------------------------------------------- + */ - gearTypes = ['armor', 'weapon', 'shield', 'head']; +classes = ['warrior', 'rogue', 'healer', 'wizard']; - events = { - winter: { - start: '2013-12-31', - end: '2014-02-01' - }, - birthday: { - start: '2013-01-30', - end: '2014-02-01' - } - }; +gearTypes = ['armor', 'weapon', 'shield', 'head']; - gear = { - weapon: { - base: { - 0: { - text: "No Weapon", - notes: 'No Weapon.', - value: 0 - } - }, - warrior: { - 0: { - text: "Training Sword", - notes: 'Practice weapon. Confers no benefit.', - value: 0 - }, - 1: { - text: "Sword", - notes: 'Common soldier\'s blade. Increases STR by 3.', - str: 3, - value: 20 - }, - 2: { - text: "Axe", - notes: 'Double-bitted battle-axe. Increases STR by 6.', - str: 6, - value: 30 - }, - 3: { - text: "Morning Star", - notes: 'Heavy club with brutal spikes. Increases STR by 9.', - str: 9, - value: 45 - }, - 4: { - text: "Sapphire Blade", - notes: 'Sword whose edge bites like the north wind. Increases STR by 12.', - str: 12, - value: 65 - }, - 5: { - text: "Ruby Sword", - notes: 'Weapon whose forge-glow never fades. Increases STR by 15.', - str: 15, - value: 90 - }, - 6: { - text: "Golden Sword", - notes: 'Bane of creatures of darkness. Increases STR by 18.', - str: 18, - value: 120, - last: true - } - }, - rogue: { - 0: { - text: "Dagger", - notes: 'A rogue\'s most basic weapon. Confers no benefit.', - str: 0, - value: 0 - }, - 1: { - text: "Short Sword", - notes: 'Light, concealable blade. Increases STR by 2.', - str: 2, - value: 20 - }, - 2: { - text: "Scimitar", - notes: 'Slashing sword, swift to deliver a killing blow. Increases STR by 3.', - str: 3, - value: 35 - }, - 3: { - text: "Kukri", - notes: 'Distinctive bush knife, both survival tool and weapon. Increases STR by 4.', - str: 4, - value: 50 - }, - 4: { - text: "Nunchaku", - notes: 'Heavy batons whirled about on a length of chain. Increases STR by 6.', - str: 6, - value: 70 - }, - 5: { - text: "Ninja-to", - notes: 'Sleek and deadly as the ninja themselves. Increases STR by 8.', - str: 8, - value: 90 - }, - 6: { - text: "Hook Sword", - notes: 'Complex weapon adept at ensnaring and disarming opponents. Increases STR by 10.', - str: 10, - value: 120, - last: true - } - }, - wizard: { - 0: { - twoHanded: true, - text: "Apprentice Staff", - notes: 'Practice staff. Confers no benefit.', - value: 0 - }, - 1: { - twoHanded: true, - text: "Wooden Staff", - notes: 'Basic implement of carven wood. Increases INT by 3 and PER by 1.', - int: 3, - per: 1, - value: 30 - }, - 2: { - twoHanded: true, - text: "Jeweled Staff", - notes: 'Focuses power through a precious stone. Increases INT by 6 and PER by 2.', - int: 6, - per: 2, - value: 50 - }, - 3: { - twoHanded: true, - text: "Iron Staff", - notes: 'Plated in metal to channel heat, cold, and lightning. Increases INT by 9 and PER by 3.', - int: 9, - per: 3, - value: 80 - }, - 4: { - twoHanded: true, - text: "Brass Staff", - notes: 'As powerful as it is heavy. Increases INT by 12 and PER by 5.', - int: 12, - per: 5, - value: 120 - }, - 5: { - twoHanded: true, - text: "Archmage Staff", - notes: 'Assists in weaving the most complex of spells. Increases INT by 15 and PER by 7.', - int: 15, - per: 7, - value: 160 - }, - 6: { - twoHanded: true, - text: "Golden Staff", - notes: 'Fashioned of orichalcum, the alchemic gold, mighty and rare. Increases INT by 18 and PER by 10.', - int: 18, - per: 10, - value: 200, - last: true - } - }, - healer: { - 0: { - text: "Novice Rod", - notes: 'For healers in training. Confers no benefit.', - value: 0 - }, - 1: { - text: "Acolyte Rod", - notes: 'Crafted during a healer\'s initiation. Increases INT by 2.', - int: 2, - value: 20 - }, - 2: { - text: "Quartz Rod", - notes: 'Topped with a gem bearing curative properties. Increases INT by 3.', - int: 3, - value: 30 - }, - 3: { - text: "Amethyst Rod", - notes: 'Purifies poison at a touch. Increases INT by 5.', - int: 5, - value: 45 - }, - 4: { - text: "Physician Rod", - notes: 'As much a badge of office as a healing tool. Increases INT by 7.', - int: 7, - value: 65 - }, - 5: { - text: "Royal Scepter", - notes: 'Fit to grace the hand of a monarch, or of one who stands at a monarch\'s right hand. Increases INT by 9.', - int: 9, - value: 90 - }, - 6: { - text: "Golden Scepter", - notes: 'Soothes the pain of all who look upon it. Increases INT by 11.', - int: 11, - value: 120, - last: true - } - }, - special: { - 0: { - text: "Dark Souls Blade", - notes: 'Feasts upon foes\' life essence to power its wicked strokes. Increases STR by 20.', - str: 20, - value: 150, - canOwn: (function(u) { - var _ref; +events = { + winter: { + start: '2013-12-31', + end: '2014-02-01' + }, + birthday: { + start: '2013-01-30', + end: '2014-02-01' + } +}; - return +((_ref = u.backer) != null ? _ref.tier : void 0) >= 70; - }) - }, - 1: { - text: "Crystal Blade", - notes: 'Its glittering facets tell the tale of a hero. Increases all attributes by 6.', - str: 6, - per: 6, - con: 6, - int: 6, - value: 170, - canOwn: (function(u) { - var _ref; - - return +((_ref = u.contributor) != null ? _ref.level : void 0) >= 4; - }) - }, - 2: { - text: "Stephen Weber's Shaft of the Dragon", - notes: 'Feel the potency of the dragon surge from within! Increases STR and PER by 25 each.', - str: 25, - per: 25, - value: 200, - canOwn: (function(u) { - var _ref; - - return +((_ref = u.backer) != null ? _ref.tier : void 0) >= 300; - }) - }, - 3: { - text: "Mustaine's Milestone Mashing Morning Star", - notes: "Meetings, monsters, malaise: managed! Mash! Increases STR, INT, and CON by 17 each.", - str: 17, - int: 17, - con: 17, - value: 200, - canOwn: (function(u) { - var _ref; - - return +((_ref = u.backer) != null ? _ref.tier : void 0) >= 300; - }) - }, - critical: { - text: "Critical Hammer of Bug-Crushing", - notes: "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 STR and PER by 40 each.", - str: 40, - per: 40, - value: 200, - canOwn: (function(u) { - var _ref; - - return !!((_ref = u.contributor) != null ? _ref.critical : void 0); - }) - }, - yeti: { - event: events.winter, - canOwn: (function(u) { - return u.stats["class"] === 'warrior'; - }), - text: "Yeti-Tamer Spear", - notes: 'Limited Edition 2013 Winter Gear! This spear allows its user to command any yeti. Increases STR by 15.', - str: 15, - value: 90 - }, - ski: { - event: events.winter, - canOwn: (function(u) { - return u.stats["class"] === 'rogue'; - }), - text: "Ski-sassin Pole", - notes: 'Limited Edition 2013 Winter Gear! A weapon capable of destroying hordes of enemies! It also helps the user make very nice parallel turns. Increases STR by 8.', - str: 8, - value: 90 - }, - candycane: { - event: events.winter, - canOwn: (function(u) { - return u.stats["class"] === 'wizard'; - }), - twoHanded: true, - text: "Candy Cane Staff", - notes: "Limited Edition 2013 Winter Gear! A powerful mage's staff. Powerfully DELICIOUS, we mean! Two-handed weapon. Increases INT by 15 and PER by 7.", - int: 15, - per: 7, - value: 160 - }, - snowflake: { - event: events.winter, - canOwn: (function(u) { - return u.stats["class"] === 'healer'; - }), - text: "Snowflake Wand", - notes: 'Limited Edition 2013 Winter Gear! This wand sparkles with unlimited healing power. Increases INT by 9.', - int: 9, - value: 90 - } - } - }, - armor: { - base: { - 0: { - text: "Plain Clothing", - notes: 'Ordinary clothing. Confers no benefit.', - value: 0 - } - }, - warrior: { - 1: { - text: "Leather Armor", - notes: 'Jerkin of sturdy boiled hide. Increases CON by 3.', - con: 3, - value: 30 - }, - 2: { - text: "Chain Mail", - notes: 'Armor of interlocked metal rings. Increases CON by 5.', - con: 5, - value: 45 - }, - 3: { - text: "Plate Armor", - notes: 'Suit of all-encasing steel, the pride of knights. Increases CON by 7.', - con: 7, - value: 65 - }, - 4: { - text: "Red Armor", - notes: 'Heavy plate glowing with defensive enchantments. Increases CON by 9.', - con: 9, - value: 90 - }, - 5: { - text: "Golden Armor", - notes: 'Looks ceremonial, but no known blade can pierce it. Increases CON by 11.', - con: 11, - value: 120, - last: true - } - }, - rogue: { - 1: { - text: "Oiled Leather", - notes: 'Leather armor treated to reduce noise. Increases PER by 6.', - per: 6, - value: 30 - }, - 2: { - text: "Black Leather", - notes: 'Colored with dark dye to blend into shadows. Increases PER by 9', - per: 9, - value: 45 - }, - 3: { - text: "Camouflage Vest", - notes: 'Equally discreet in dungeon or wilderness. Increases PER by 12.', - per: 12, - value: 65 - }, - 4: { - text: "Penumbral Armor", - notes: 'Wraps the wearer in a veil of twilight. Increases PER by 15.', - per: 15, - value: 90 - }, - 5: { - text: "Umbral Armor", - notes: 'Allows stealth in the open in broad daylight. Increases PER by 18.', - per: 18, - value: 120, - last: true - } - }, - wizard: { - 1: { - text: "Magician Robe", - notes: 'Hedge-mage\'s outfit. Increases INT by 2.', - int: 2, - value: 30 - }, - 2: { - text: "Wizard Robe", - notes: 'Clothes for a wandering wonder-worker. Increases INT by 4.', - int: 4, - value: 45 - }, - 3: { - text: "Robe of Mysteries", - notes: 'Denotes initiation into elite secrets. Increases INT by 6.', - int: 6, - value: 65 - }, - 4: { - text: "Archmage Robe", - notes: 'Spirits and elementals bow before it. Increases INT by 9.', - int: 9, - value: 90 - }, - 5: { - text: "Royal Magus Robe", - notes: 'Symbol of the power behind the throne. Increases INT by 12.', - int: 12, - value: 120, - last: true - } - }, - healer: { - 1: { - text: "Acolyte Robe", - notes: 'Garment showing humility and purpose. Increases CON by 6.', - con: 6, - value: 30 - }, - 2: { - text: "Medic Robe", - notes: 'Worn by those dedicated to tending the wounded in battle. Increases CON by 9.', - con: 9, - value: 45 - }, - 3: { - text: "Defender Mantle", - notes: 'Turns the healer\'s own magics inward to fend off harm. Increases CON by 12.', - con: 12, - value: 65 - }, - 4: { - text: "Physician Mantle", - notes: 'Projects authority and dissipates curses. Increases CON by 15.', - con: 15, - value: 90 - }, - 5: { - text: "Royal Mantle", - notes: 'Attire of those who have saved the lives of kings. Increases CON by 18.', - con: 18, - value: 120, - last: true - } - }, - special: { - 0: { - text: "Shade Armor", - notes: 'Screams when struck, for it feels pain in its wearer\'s place. Increases CON by 20.', - con: 20, - value: 150, - canOwn: (function(u) { - var _ref; - - return +((_ref = u.backer) != null ? _ref.tier : void 0) >= 45; - }) - }, - 1: { - text: "Crystal Armor", - notes: 'Its tireless power inures the wearer to mundane discomfort. Increases all attributes by 6.', - con: 6, - str: 6, - per: 6, - int: 6, - value: 170, - canOwn: (function(u) { - var _ref; - - return +((_ref = u.contributor) != null ? _ref.level : void 0) >= 2; - }) - }, - 2: { - text: "Jean Chalard's Noble Tunic", - notes: 'Makes you extra fluffy! Increases CON and INT by 25 each.', - int: 25, - con: 25, - value: 200, - canOwn: (function(u) { - var _ref; - - return +((_ref = u.backer) != null ? _ref.tier : void 0) >= 300; - }) - }, - yeti: { - event: events.winter, - canOwn: (function(u) { - return u.stats["class"] === 'warrior'; - }), - text: "Yeti-Tamer Robe", - notes: 'Limited Edition 2013 Winter Gear! Fuzzy and fierce. Increases CON by 9.', - con: 9, - value: 90 - }, - ski: { - event: events.winter, - canOwn: (function(u) { - return u.stats["class"] === 'rogue'; - }), - text: "Ski-sassin Parka", - notes: 'Limited Edition 2013 Winter Gear! Full of secret daggers and ski trail maps. Increases PER by 15.', - per: 15, - value: 90 - }, - candycane: { - event: events.winter, - canOwn: (function(u) { - return u.stats["class"] === 'wizard'; - }), - text: "Candy Cane Robe", - notes: 'Limited Edition 2013 Winter Gear! Spun from sugar and silk. Increases INT by 9.', - int: 9, - value: 90 - }, - snowflake: { - event: events.winter, - canOwn: (function(u) { - return u.stats["class"] === 'healer'; - }), - text: "Snowflake Robe", - notes: 'Limited Edition 2013 Winter Gear! A robe to keep you warm, even in a blizzard. Increases CON by 15.', - con: 15, - value: 90 - }, - birthday: { - event: events.birthday, - text: "Absurd Party Robes", - notes: "As part of the festivities, Absurd Party Robes are available free of charge in the Item Store! Swath yourself in those silly garbs and don your matching hats to celebrate this momentous day.", - value: 0 - } - } - }, - head: { - base: { - 0: { - text: "No Helm", - notes: 'No headgear.', - value: 0 - } - }, - warrior: { - 1: { - text: "Leather Helm", - notes: 'Cap of sturdy boiled hide. Increases STR by 2.', - str: 2, - value: 15 - }, - 2: { - text: "Chain Coif", - notes: 'Hood of interlocked metal rings. Increases STR by 4.', - str: 4, - value: 25 - }, - 3: { - text: "Plate Helm", - notes: 'Thick steel helmet, proof against any blow. Increases STR by 6.', - str: 6, - value: 40 - }, - 4: { - text: "Red Helm", - notes: 'Set with rubies for power, and glows when the wearer is angered. Increases STR by 9.', - str: 9, - value: 60 - }, - 5: { - text: "Golden Helm", - notes: 'Regal crown bound to shining armor. Increases STR by 12.', - str: 12, - value: 80, - last: true - } - }, - rogue: { - 1: { - text: "Leather Hood", - notes: 'Basic protective cowl. Increases PER by 2.', - per: 2, - value: 15 - }, - 2: { - text: "Black Leather Hood", - notes: 'Useful for both defense and disguise. Increases PER by 4.', - per: 4, - value: 25 - }, - 3: { - text: "Camouflage Hood", - notes: 'Rugged, but doesn\'t impede hearing. Increases PER by 6.', - per: 6, - value: 40 - }, - 4: { - text: "Penumbral Hood", - notes: 'Grants perfect vision in darkness. Increases PER by 9.', - per: 9, - value: 60 - }, - 5: { - text: "Umbral Hood", - notes: 'Conceals even thoughts from those who would probe them. Increases PER by 12.', - per: 12, - value: 80, - last: true - } - }, - wizard: { - 1: { - text: "Magician Hat", - notes: 'Simple, comfortable, and fashionable. Increases PER by 2.', - per: 2, - value: 15 - }, - 2: { - text: "Cornuthaum", - notes: 'Traditional headgear of the itinerant wizard. Increases PER by 3.', - per: 3, - value: 25 - }, - 3: { - text: "Astrologer Hat", - notes: 'Adorned with the rings of Saturn. Increases PER by 5.', - per: 5, - value: 40 - }, - 4: { - text: "Archmage Hat", - notes: 'Focuses the mind for intensive spellcasting. Increases PER by 7.', - per: 7, - value: 60 - }, - 5: { - text: "Royal Magus Hat", - notes: 'Shows authority over fortune, weather, and lesser mages. Increases PER by 10.', - per: 10, - value: 80, - last: true - } - }, - healer: { - 1: { - text: "Quartz Circlet", - notes: 'Jeweled headpiece, for focus on the task at hand. Increases INT by 2.', - int: 2, - value: 15 - }, - 2: { - text: "Amethyst Circlet", - notes: 'A taste of luxury for a humble profession. Increases INT by 3.', - int: 3, - value: 25 - }, - 3: { - text: "Sapphire Circlet", - notes: 'Shines to let sufferers know their salvation is at hand. Increases INT by 5.', - int: 5, - value: 40 - }, - 4: { - text: "Emerald Diadem", - notes: 'Emits an aura of life and growth. Increases INT by 7.', - int: 7, - value: 60 - }, - 5: { - text: "Royal Diadem", - notes: 'For king, queen, or miracle-worker. Increases INT by 9.', - int: 9, - value: 80, - last: true - } - }, - special: { - 0: { - text: "Shade Helm", - notes: 'Blood and ash, lava and obsidian give this helm its imagery and power. Increases INT by 20.', - int: 20, - value: 150, - canOwn: (function(u) { - var _ref; - - return +((_ref = u.backer) != null ? _ref.tier : void 0) >= 45; - }) - }, - 1: { - text: "Crystal Helm", - notes: 'The favored crown of those who lead by example. Increases all attributes by 6.', - con: 6, - str: 6, - per: 6, - int: 6, - value: 170, - canOwn: (function(u) { - var _ref; - - return +((_ref = u.contributor) != null ? _ref.level : void 0) >= 3; - }) - }, - 2: { - text: "Nameless Helm", - notes: 'A testament to those who gave of themselves while asking nothing in return. Increases INT and STR by 25 each.', - int: 25, - str: 25, - value: 200, - canOwn: (function(u) { - var _ref; - - return +((_ref = u.backer) != null ? _ref.tier : void 0) >= 300; - }) - }, - nye: { - event: events.winter, - text: "Absurd Party Hat", - notes: "You've received an Absurd Party Hat! Wear it with pride while ringing in the New Year!", - value: 0 - }, - yeti: { - event: events.winter, - canOwn: (function(u) { - return u.stats["class"] === 'warrior'; - }), - text: "Yeti-Tamer Helm", - notes: 'Limited Edition 2013 Winter Gear! An adorably fearsome hat. Increases STR by 9.', - str: 9, - value: 60 - }, - ski: { - event: events.winter, - canOwn: (function(u) { - return u.stats["class"] === 'rogue'; - }), - text: "Ski-sassin Helm", - notes: "Limited Edition 2013 Winter Gear! Keeps the wearer's identity secret... and their face toasty. Increases PER by 9.", - per: 9, - value: 60 - }, - candycane: { - event: events.winter, - canOwn: (function(u) { - return u.stats["class"] === 'wizard'; - }), - text: "Candy Cane Hat", - notes: "Limited Edition 2013 Winter Gear! This is the most delicious hat in the world. It's also known to appear and disappear mysteriously. Increases PER by 7.", - per: 7, - value: 60 - }, - snowflake: { - event: events.winter, - canOwn: (function(u) { - return u.stats["class"] === 'healer'; - }), - text: "Snowflake Crown", - notes: 'Limited Edition 2013 Winter Gear! The wearer of this crown is never cold. Increases INT by 7.', - int: 7, - value: 60 - } - } - }, - shield: { - base: { - 0: { - text: "No Off-Hand Equipment", - notes: 'No shield or second weapon.', - value: 0 - } - }, - warrior: { - 1: { - text: "Wooden Shield", - notes: 'Round shield of thick wood. Increases CON by 2.', - con: 2, - value: 20 - }, - 2: { - text: "Buckler", - notes: 'Light and sturdy, quick to bring to the defense. Increases CON by 3.', - con: 3, - value: 35 - }, - 3: { - text: "Reinforced Shield", - notes: 'Made of wood but bolstered with metal bands. Increases CON by 5.', - con: 5, - value: 50 - }, - 4: { - text: "Red Shield", - notes: 'Rebukes blows with a burst of flame. Increases CON by 7.', - con: 7, - value: 70 - }, - 5: { - text: "Golden Shield", - notes: 'Shining badge of the vanguard. Increases CON by 9.', - con: 9, - value: 90, - last: true - } - }, - rogue: { - 0: { - text: "Dagger", - notes: 'A rogue\'s most basic weapon. Confers no benefit.', - str: 0, - value: 0 - }, - 1: { - text: "Short Sword", - notes: 'Light, concealable blade. Increases STR by 2.', - str: 2, - value: 20 - }, - 2: { - text: "Scimitar", - notes: 'Slashing sword, swift to deliver a killing blow. Increases STR by 3.', - str: 3, - value: 35 - }, - 3: { - text: "Kukri", - notes: 'Distinctive bush knife, both survival tool and weapon. Increases STR by 4.', - str: 4, - value: 50 - }, - 4: { - text: "Nunchaku", - notes: 'Heavy batons whirled about on a length of chain. Increases STR by 6.', - str: 6, - value: 70 - }, - 5: { - text: "Ninja-to", - notes: 'Sleek and deadly as the ninja themselves. Increases STR by 8.', - str: 8, - value: 90 - }, - 6: { - text: "Hook Sword", - notes: 'Complex weapon adept at ensnaring and disarming opponents. Increases STR by 10.', - str: 10, - value: 120, - last: true - } - }, - wizard: {}, - healer: { - 1: { - text: "Medic Buckler", - notes: 'Easy to disengage, freeing a hand for bandaging. Increases CON by 2.', - con: 2, - value: 20 - }, - 2: { - text: "Kite Shield", - notes: 'Tapered shield with the symbol of healing. Increases CON by 4.', - con: 4, - value: 35 - }, - 3: { - text: "Protector Shield", - notes: 'Traditional shield of defender knights. Increases CON by 6.', - con: 6, - value: 50 - }, - 4: { - text: "Savior Shield", - notes: 'Stops blows aimed at nearby innocents as well as those aimed at you. Increases CON by 9.', - con: 9, - value: 70 - }, - 5: { - text: "Royal Shield", - notes: 'Bestowed upon those most dedicated to the kingdom\'s defense. Increases CON by 12.', - con: 12, - value: 90, - last: true - } - }, - special: { - 0: { - text: "Tormented Skull", - notes: 'Sees beyond the veil of death, and displays what it finds there for enemies to fear. Increases PER by 20.', - per: 20, - value: 150, - canOwn: (function(u) { - var _ref; - - return +((_ref = u.backer) != null ? _ref.tier : void 0) >= 45; - }) - }, - 1: { - text: "Crystal Shield", - notes: 'Shatters arrows and deflects the words of naysayers. Increases all attributes by 6.', - con: 6, - str: 6, - per: 6, - int: 6, - value: 170, - canOwn: (function(u) { - var _ref; - - return +((_ref = u.contributor) != null ? _ref.level : void 0) >= 5; - }) - }, - yeti: { - event: events.winter, - canOwn: (function(u) { - return u.stats["class"] === 'warrior'; - }), - text: "Yeti-Tamer Shield", - notes: 'Limited Edition 2013 Winter Gear! This shield reflects light from the snow. Increases CON by 7.', - con: 7, - value: 70 - }, - ski: { - event: events.winter, - canOwn: (function(u) { - return u.stats["class"] === 'rogue'; - }), - text: "Ski-sassin Pole", - notes: 'Limited Edition 2013 Winter Gear! A weapon capable of destroying hordes of enemies! It also helps the user make very nice parallel turns. Increases STR by 8.', - str: 8, - value: 90 - }, - snowflake: { - event: events.winter, - canOwn: (function(u) { - return u.stats["class"] === 'healer'; - }), - text: "Snowflake Shield", - notes: 'Limited Edition 2013 Winter Gear! Every shield is unique. Increases CON by 9.', - con: 9, - value: 70 - } - } - } - }; - - /* - The gear is exported as a tree (defined above), and a flat list (eg, {weapon_healer_1: .., shield_special_0: ...}) since - they are needed in different froms at different points in the app - */ - - - api.gear = { - tree: gear, - flat: {} - }; - - _.each(gearTypes, function(type) { - return _.each(classes.concat(['base', 'special']), function(klass) { - return _.each(gear[type][klass], function(item, i) { - var key, _canOwn; - - key = "" + type + "_" + klass + "_" + i; - _.defaults(item, { - type: type, - key: key, - klass: klass, - index: i, - str: 0, - int: 0, - per: 0, - con: 0 - }); - if (item.event) { - _canOwn = item.canOwn || (function() { - return true; - }); - item.canOwn = function(u) { - return _canOwn(u) && ((u.items.gear.owned[key] != null) || (moment().isAfter(item.event.start) && moment().isBefore(item.event.end))); - }; - } - return api.gear.flat[key] = item; - }); - }); - }); - - /* - --------------------------------------------------------------- - Potion - --------------------------------------------------------------- - */ - - - api.potion = { - type: 'potion', - text: "Health Potion", - notes: "Recover 15 Health (Instant Use)", - value: 25, - key: 'potion' - }; - - /* - --------------------------------------------------------------- - Classes - --------------------------------------------------------------- - */ - - - api.classes = classes; - - /* - --------------------------------------------------------------- - Gear Types - --------------------------------------------------------------- - */ - - - api.gearTypes = gearTypes; - - /* - --------------------------------------------------------------- - Spells - --------------------------------------------------------------- - Text, notes, and mana are obvious. The rest: - - * {target}: one of [task, self, party, user]. This is very important, because if the cast() function is expecting one - thing and receives another, it will cause errors. `self` is used for self buffs, multi-task debuffs, AOEs (eg, meteor-shower), - etc. Basically, use self for anything that's not [task, party, user] and is an instant-cast - - * {cast}: the function that's run to perform the ability's action. This is pretty slick - because this is exported to the - web, this function can be performed on the client and on the server. `user` param is self (needed for determining your - own stats for effectiveness of cast), and `target` param is one of [task, party, user]. In the case of `self` spells, - you act on `user` instead of `target`. You can trust these are the correct objects, as long as the `target` attr of the - spell is correct. Take a look at habitrpg/src/models/user.js and habitrpg/src/models/task.js for what attributes are - available on each model. Note `task.value` is its "redness". If party is passed in, it's an array of users, - so you'll want to iterate over them like: `_.each(target,function(member){...})` - - Note, user.stats.mp is docked after automatically (it's appended to functions automatically down below in an _.each) - */ - - - diminishingReturns = function(bonus, max, halfway) { - if (halfway == null) { - halfway = max / 2; - } - return max * (bonus / (bonus + halfway)); - }; - - api.spells = { - wizard: { - fireball: { - text: 'Burst of Flames', - mana: 10, - lvl: 11, - target: 'task', - notes: 'With a crack, flames burst from your staff, scorching a task. You deal high damage to the task, and gain additional experience (more experience for greens).', - cast: function(user, target) { - var bonus; - - bonus = user._statsComputed.int * user.fns.crit('per'); - target.value += diminishingReturns(bonus * .02, 4); - bonus *= Math.ceil((target.value < 0 ? 1 : target.value + 1) * .075); - user.stats.exp += diminishingReturns(bonus, 75); - if (user.party.quest.key) { - return user.party.quest.progress.up += diminishingReturns(bonus * .1, 50, 30); - } - } - }, - mpheal: { - text: 'Ethereal Surge', - mana: 30, - lvl: 12, - target: 'party', - notes: "A flow of magical energy rushes from your hands and recharges your party. Your party recovers MP.", - cast: function(user, target) { - return _.each(target, function(member) { - var bonus; - - bonus = Math.ceil(user._statsComputed.int * .1); - if (bonus > 25) { - bonus = 25; - } - return member.stats.mp += bonus; - }); - } - }, - earth: { - text: 'Earthquake', - mana: 35, - lvl: 13, - target: 'party', - notes: "The ground below your party's tasks cracks and shakes with extreme intensity, slowing them down and opening them up to more attacks. Your party gains a buff to experience.", - cast: function(user, target) { - return _.each(target, function(member) { - var _base, _ref; - - if ((_ref = (_base = member.stats.buffs).int) == null) { - _base.int = 0; - } - return member.stats.buffs.int += Math.ceil(user._statsComputed.int * .05); - }); - } - }, - frost: { - text: 'Chilling Frost', - mana: 40, - lvl: 14, - target: 'self', - notes: "Ice erupts from every surface, swallowing your tasks and freezing them in place. Your dailies' streaks won't reset at the end of the day.", - cast: function(user, target) { - return user.stats.buffs.streaks = true; - } +gear = { + weapon: { + base: { + 0: { + text: "No Weapon", + notes: 'No Weapon.', + value: 0 } }, warrior: { - smash: { - text: 'Brutal Smash', - mana: 10, - lvl: 11, - target: 'task', - notes: "You savagely hit a single task with all of your might, beating it into submission. The task's redness decreases.", - cast: function(user, target) { - target.value += 2.5 * (user._statsComputed.str / (user._statsComputed.str + 50)) * user.fns.crit('per'); - if (user.party.quest.key) { - return user.party.quest.progress.up += Math.ceil(user._statsComputed.str * .2); - } - } + 0: { + text: "Training Sword", + notes: 'Practice weapon. Confers no benefit.', + value: 0 }, - defensiveStance: { - text: 'Defensive Stance', - mana: 25, - lvl: 12, - target: 'self', - notes: "You take a moment to relax your body and enter a defensive stance to ready yourself for the tasks' next onslaught. Reduces damage from dailies at the end of the day.", - cast: function(user, target) { - var _base, _ref; - - if ((_ref = (_base = user.stats.buffs).con) == null) { - _base.con = 0; - } - return user.stats.buffs.con += Math.ceil(user._statsComputed.con * .05); - } + 1: { + text: "Sword", + notes: 'Common soldier\'s blade. Increases STR by 3.', + str: 3, + value: 20 }, - valorousPresence: { - text: 'Valorous Presence', - mana: 20, - lvl: 13, - target: 'party', - notes: "Your presence emboldens the party. Their newfound courage gives them a boost of strength. Party members gain a buff to their STR.", - cast: function(user, target) { - return _.each(target, function(member) { - var _base, _ref; - - if ((_ref = (_base = member.stats.buffs).str) == null) { - _base.str = 0; - } - return member.stats.buffs.str += Math.ceil(user._statsComputed.str * .05); - }); - } + 2: { + text: "Axe", + notes: 'Double-bitted battle-axe. Increases STR by 6.', + str: 6, + value: 30 }, - intimidate: { - text: 'Intimidating Gaze', - mana: 15, - lvl: 14, - target: 'party', - notes: "Your gaze strikes fear into the hearts of your party's enemies. The party gains a moderate boost to defense.", - cast: function(user, target) { - return _.each(target, function(member) { - var _base, _ref; - - if ((_ref = (_base = member.stats.buffs).con) == null) { - _base.con = 0; - } - return member.stats.buffs.con += Math.ceil(user._statsComputed.con * .03); - }); - } + 3: { + text: "Morning Star", + notes: 'Heavy club with brutal spikes. Increases STR by 9.', + str: 9, + value: 45 + }, + 4: { + text: "Sapphire Blade", + notes: 'Sword whose edge bites like the north wind. Increases STR by 12.', + str: 12, + value: 65 + }, + 5: { + text: "Ruby Sword", + notes: 'Weapon whose forge-glow never fades. Increases STR by 15.', + str: 15, + value: 90 + }, + 6: { + text: "Golden Sword", + notes: 'Bane of creatures of darkness. Increases STR by 18.', + str: 18, + value: 120, + last: true } }, rogue: { - pickPocket: { - text: 'Pickpocket', - mana: 10, - lvl: 11, - target: 'task', - notes: "Your nimble fingers run through the task's pockets and find some treasures for yourself. You gain an increased gold bonus on the task, higher yet the 'fatter' (bluer) your task.", - cast: function(user, target) { - var bonus; - - bonus = (target.value < 0 ? 1 : target.value + 2) + (user._statsComputed.per * 0.5); - return user.stats.gp += 25 * (bonus / (bonus + 75)); - } + 0: { + text: "Dagger", + notes: 'A rogue\'s most basic weapon. Confers no benefit.', + str: 0, + value: 0 }, - backStab: { - text: 'Backstab', - mana: 15, - lvl: 12, - target: 'task', - notes: "Without a sound, you sweep behind a task and stab it in the back. You deal higher damage to the task, with a higher chance of a critical hit.", - cast: function(user, target) { - var bonus, _crit; - - _crit = user.fns.crit('per', .3); - target.value += _crit * .03; - bonus = (target.value < 0 ? 1 : target.value + 1) * _crit; - user.stats.exp += bonus; - return user.stats.gp += bonus; - } + 1: { + text: "Short Sword", + notes: 'Light, concealable blade. Increases STR by 2.', + str: 2, + value: 20 }, - toolsOfTrade: { - text: 'Tools of the Trade', - mana: 25, - lvl: 13, - target: 'party', - notes: "You share your thievery tools with the party to aid them in 'acquiring' more gold. The party's gold bonus for tasks and chance of drops is buffed for a day.", - cast: function(user, target) { - return _.each(target, function(member) { - var _base, _ref; - - if ((_ref = (_base = member.stats.buffs).per) == null) { - _base.per = 0; - } - return member.stats.buffs.per += Math.ceil(user._statsComputed.per * .03); - }); - } + 2: { + text: "Scimitar", + notes: 'Slashing sword, swift to deliver a killing blow. Increases STR by 3.', + str: 3, + value: 35 }, - stealth: { - text: 'Stealth', - mana: 45, - lvl: 14, - target: 'self', - notes: "You duck into the shadows, pulling up your hood. Many dailies won't find you this night; fewer yet the higher your Perception.", - cast: function(user, target) { - var _base, _ref; - - if ((_ref = (_base = user.stats.buffs).stealth) == null) { - _base.stealth = 0; - } - return user.stats.buffs.stealth += Math.ceil(user.dailys.length * user._statsComputed.per / 100); - } + 3: { + text: "Kukri", + notes: 'Distinctive bush knife, both survival tool and weapon. Increases STR by 4.', + str: 4, + value: 50 + }, + 4: { + text: "Nunchaku", + notes: 'Heavy batons whirled about on a length of chain. Increases STR by 6.', + str: 6, + value: 70 + }, + 5: { + text: "Ninja-to", + notes: 'Sleek and deadly as the ninja themselves. Increases STR by 8.', + str: 8, + value: 90 + }, + 6: { + text: "Hook Sword", + notes: 'Complex weapon adept at ensnaring and disarming opponents. Increases STR by 10.', + str: 10, + value: 120, + last: true + } + }, + wizard: { + 0: { + twoHanded: true, + text: "Apprentice Staff", + notes: 'Practice staff. Confers no benefit.', + value: 0 + }, + 1: { + twoHanded: true, + text: "Wooden Staff", + notes: 'Basic implement of carven wood. Increases INT by 3 and PER by 1.', + int: 3, + per: 1, + value: 30 + }, + 2: { + twoHanded: true, + text: "Jeweled Staff", + notes: 'Focuses power through a precious stone. Increases INT by 6 and PER by 2.', + int: 6, + per: 2, + value: 50 + }, + 3: { + twoHanded: true, + text: "Iron Staff", + notes: 'Plated in metal to channel heat, cold, and lightning. Increases INT by 9 and PER by 3.', + int: 9, + per: 3, + value: 80 + }, + 4: { + twoHanded: true, + text: "Brass Staff", + notes: 'As powerful as it is heavy. Increases INT by 12 and PER by 5.', + int: 12, + per: 5, + value: 120 + }, + 5: { + twoHanded: true, + text: "Archmage Staff", + notes: 'Assists in weaving the most complex of spells. Increases INT by 15 and PER by 7.', + int: 15, + per: 7, + value: 160 + }, + 6: { + twoHanded: true, + text: "Golden Staff", + notes: 'Fashioned of orichalcum, the alchemic gold, mighty and rare. Increases INT by 18 and PER by 10.', + int: 18, + per: 10, + value: 200, + last: true } }, healer: { - heal: { - text: 'Healing Light', - mana: 15, - lvl: 11, - target: 'self', - notes: 'Light covers your body, healing your wounds. You gain a boost to your health.', - cast: function(user, target) { - user.stats.hp += (user._statsComputed.con + user._statsComputed.int + 5) * .075; - if (user.stats.hp > 50) { - return user.stats.hp = 50; - } - } + 0: { + text: "Novice Rod", + notes: 'For healers in training. Confers no benefit.', + value: 0 }, - brightness: { - text: 'Searing Brightness', - mana: 15, - lvl: 12, - target: 'self', - notes: "You cast a burst of light that blinds all of your tasks. The redness of your tasks is reduced.", - cast: function(user, target) { - return _.each(user.tasks, function(target) { - if (target.type === 'reward') { - return; - } - return target.value += 1.5 * (user._statsComputed.int / (user._statsComputed.int + 40)); - }); - } + 1: { + text: "Acolyte Rod", + notes: 'Crafted during a healer\'s initiation. Increases INT by 2.', + int: 2, + value: 20 }, - protectAura: { - text: 'Protective Aura', - mana: 30, - lvl: 13, - target: 'party', - notes: "A magical aura surrounds your party members, protecting them from damage. Your party members gain a buff to their defense.", - cast: function(user, target) { - return _.each(target, function(member) { - var _base, _ref; - - if ((_ref = (_base = member.stats.buffs).con) == null) { - _base.con = 0; - } - return member.stats.buffs.con += Math.ceil(user._statsComputed.con * .15); - }); - } + 2: { + text: "Quartz Rod", + notes: 'Topped with a gem bearing curative properties. Increases INT by 3.', + int: 3, + value: 30 }, - heallAll: { - text: 'Blessing', - mana: 25, - lvl: 14, - target: 'party', - notes: "Soothing light envelops your party and heals them of their injuries. Your party members gain a boost to their health.", - cast: function(user, target) { - return _.each(target, function(member) { - member.stats.hp += (user._statsComputed.con + user._statsComputed.int + 5) * .04; - if (member.stats.hp > 50) { - return member.stats.hp = 50; - } - }); - } + 3: { + text: "Amethyst Rod", + notes: 'Purifies poison at a touch. Increases INT by 5.', + int: 5, + value: 45 + }, + 4: { + text: "Physician Rod", + notes: 'As much a badge of office as a healing tool. Increases INT by 7.', + int: 7, + value: 65 + }, + 5: { + text: "Royal Scepter", + notes: 'Fit to grace the hand of a monarch, or of one who stands at a monarch\'s right hand. Increases INT by 9.', + int: 9, + value: 90 + }, + 6: { + text: "Golden Scepter", + notes: 'Soothes the pain of all who look upon it. Increases INT by 11.', + int: 11, + value: 120, + last: true } }, special: { - snowball: { - text: 'Snowball', - mana: 0, - value: 1, - target: 'user', - notes: "Throw a snowball at a party member, what could possibly go wrong? Lasts until member's new day.", - cast: function(user, target) { - var _base, _ref; - - target.stats.buffs.snowball = true; - if ((_ref = (_base = target.achievements).snowball) == null) { - _base.snowball = 0; - } - target.achievements.snowball++; - return user.items.special.snowball--; - } + 0: { + text: "Dark Souls Blade", + notes: 'Feasts upon foes\' life essence to power its wicked strokes. Increases STR by 20.', + str: 20, + value: 150, + canOwn: (function(u) { + var _ref; + return +((_ref = u.backer) != null ? _ref.tier : void 0) >= 70; + }) }, - salt: { - text: 'Salt', - mana: 0, - value: 5, - target: 'self', - notes: 'Someone has snowballed you. Ha ha, very funny. Now get this snow off me!', - cast: function(user, target) { - user.stats.buffs.snowball = false; - return user.stats.gp -= 5; - } + 1: { + text: "Crystal Blade", + notes: 'Its glittering facets tell the tale of a hero. Increases all attributes by 6.', + str: 6, + per: 6, + con: 6, + int: 6, + value: 170, + canOwn: (function(u) { + var _ref; + return +((_ref = u.contributor) != null ? _ref.level : void 0) >= 4; + }) + }, + 2: { + text: "Stephen Weber's Shaft of the Dragon", + notes: 'Feel the potency of the dragon surge from within! Increases STR and PER by 25 each.', + str: 25, + per: 25, + value: 200, + canOwn: (function(u) { + var _ref; + return +((_ref = u.backer) != null ? _ref.tier : void 0) >= 300; + }) + }, + 3: { + text: "Mustaine's Milestone Mashing Morning Star", + notes: "Meetings, monsters, malaise: managed! Mash! Increases STR, INT, and CON by 17 each.", + str: 17, + int: 17, + con: 17, + value: 200, + canOwn: (function(u) { + var _ref; + return +((_ref = u.backer) != null ? _ref.tier : void 0) >= 300; + }) + }, + critical: { + text: "Critical Hammer of Bug-Crushing", + notes: "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 STR and PER by 40 each.", + str: 40, + per: 40, + value: 200, + canOwn: (function(u) { + var _ref; + return !!((_ref = u.contributor) != null ? _ref.critical : void 0); + }) + }, + yeti: { + event: events.winter, + canOwn: (function(u) { + return u.stats["class"] === 'warrior'; + }), + text: "Yeti-Tamer Spear", + notes: 'Limited Edition 2013 Winter Gear! This spear allows its user to command any yeti. Increases STR by 15.', + str: 15, + value: 90 + }, + ski: { + event: events.winter, + canOwn: (function(u) { + return u.stats["class"] === 'rogue'; + }), + text: "Ski-sassin Pole", + notes: 'Limited Edition 2013 Winter Gear! A weapon capable of destroying hordes of enemies! It also helps the user make very nice parallel turns. Increases STR by 8.', + str: 8, + value: 90 + }, + candycane: { + event: events.winter, + canOwn: (function(u) { + return u.stats["class"] === 'wizard'; + }), + twoHanded: true, + text: "Candy Cane Staff", + notes: "Limited Edition 2013 Winter Gear! A powerful mage's staff. Powerfully DELICIOUS, we mean! Two-handed weapon. Increases INT by 15 and PER by 7.", + int: 15, + per: 7, + value: 160 + }, + snowflake: { + event: events.winter, + canOwn: (function(u) { + return u.stats["class"] === 'healer'; + }), + text: "Snowflake Wand", + notes: 'Limited Edition 2013 Winter Gear! This wand sparkles with unlimited healing power. Increases INT by 9.', + int: 9, + value: 90 } } - }; - - _.each(api.spells, function(spellClass) { - return _.each(spellClass, function(spell, key) { - var _cast; - - spell.key = key; - _cast = spell.cast; - return spell.cast = function(user, target) { - _cast(user, target); - return user.stats.mp -= spell.mana; - }; - }); - }); - - api.special = api.spells.special; - - /* - --------------------------------------------------------------- - Drops - --------------------------------------------------------------- - */ - - - api.dropEggs = { - Wolf: { - text: 'Wolf', - adjective: 'loyal' - }, - TigerCub: { - text: 'Tiger Cub', - mountText: 'Tiger', - adjective: 'fierce' - }, - PandaCub: { - text: 'Panda Cub', - mountText: 'Panda', - adjective: 'gentle' - }, - LionCub: { - text: 'Lion Cub', - mountText: 'Lion', - adjective: 'regal' - }, - Fox: { - text: 'Fox', - adjective: 'wily' - }, - FlyingPig: { - text: 'Flying Pig', - adjective: 'whimsical' - }, - Dragon: { - text: 'Dragon', - adjective: 'mighty' - }, - Cactus: { - text: 'Cactus', - adjective: 'prickly' - }, - BearCub: { - text: 'Bear Cub', - mountText: 'Bear', - adjective: 'cuddly' - } - }; - - _.each(api.dropEggs, function(egg, key) { - return _.defaults(egg, { - canBuy: true, - value: 3, - key: key, - notes: "Find a hatching potion to pour on this egg, and it will hatch into a " + egg.adjective + " " + egg.text + ".", - mountText: egg.text - }); - }); - - api.questEggs = { - Gryphon: { - text: 'Gryphon', - adjective: 'regal', - canBuy: false - } - }; - - _.each(api.questEggs, function(egg, key) { - return _.defaults(egg, { - canBuy: false, - value: 3, - key: key, - notes: "Find a hatching potion to pour on this egg, and it will hatch into a " + egg.adjective + " " + egg.text + ".", - mountText: egg.text - }); - }); - - api.eggs = _.assign(_.cloneDeep(api.dropEggs), api.questEggs); - - api.specialPets = { - 'Wolf-Veteran': true, - 'Wolf-Cerberus': true, - 'Dragon-Hydra': true, - 'Turkey-Base': true, - 'BearCub-Polar': true - }; - - api.specialMounts = { - 'BearCub-Polar': true, - 'LionCub-Ethereal': true - }; - - api.hatchingPotions = { - Base: { - value: 2, - text: 'Base' - }, - White: { - value: 2, - text: 'White' - }, - Desert: { - value: 2, - text: 'Desert' - }, - Red: { - value: 3, - text: 'Red' - }, - Shade: { - value: 3, - text: 'Shade' - }, - Skeleton: { - value: 3, - text: 'Skeleton' - }, - Zombie: { - value: 4, - text: 'Zombie' - }, - CottonCandyPink: { - value: 4, - text: 'Cotton Candy Pink' - }, - CottonCandyBlue: { - value: 4, - text: 'Cotton Candy Blue' - }, - Golden: { - value: 5, - text: 'Golden' - } - }; - - _.each(api.hatchingPotions, function(pot, key) { - return _.defaults(pot, { - key: key, - value: 2, - notes: "Pour this on an egg, and it will hatch as a " + pot.text + " pet." - }); - }); - - api.pets = _.transform(api.dropEggs, function(m, egg) { - return _.defaults(m, _.transform(api.hatchingPotions, function(m2, pot) { - return m2[egg.key + "-" + pot.key] = true; - })); - }); - - api.questPets = _.transform(api.questEggs, function(m, egg) { - return _.defaults(m, _.transform(api.hatchingPotions, function(m2, pot) { - return m2[egg.key + "-" + pot.key] = true; - })); - }); - - api.food = { - Meat: { - text: 'Meat', - target: 'Base', - article: '' - }, - Milk: { - text: 'Milk', - target: 'White', - article: '' - }, - Potatoe: { - text: 'Potato', - target: 'Desert', - article: 'a ' - }, - Strawberry: { - text: 'Strawberry', - target: 'Red', - article: 'a ' - }, - Chocolate: { - text: 'Chocolate', - target: 'Shade', - article: '' - }, - Fish: { - text: 'Fish', - target: 'Skeleton', - article: 'a ' - }, - RottenMeat: { - text: 'Rotten Meat', - target: 'Zombie', - article: '' - }, - CottonCandyPink: { - text: 'Pink Cotton Candy', - target: 'CottonCandyPink', - article: '' - }, - CottonCandyBlue: { - text: 'Blue Cotton Candy', - target: 'CottonCandyBlue', - article: '' - }, - Cake_Skeleton: { - canBuy: false, - text: 'Bare Bones Cake', - target: 'Skeleton', - article: '' - }, - Cake_Base: { - canBuy: false, - text: 'Basic Cake', - target: 'Base', - article: '' - }, - Cake_CottonCandyBlue: { - canBuy: false, - text: 'Candy Blue Cake', - target: 'CottonCandyBlue', - article: '' - }, - Cake_CottonCandyPink: { - canBuy: false, - text: 'Candy Pink Cake', - target: 'CottonCandyPink', - article: '' - }, - Cake_Shade: { - canBuy: false, - text: 'Chocolate Cake', - target: 'Shade', - article: '' - }, - Cake_White: { - canBuy: false, - text: 'Cream Cake', - target: 'White', - article: '' - }, - Cake_Golden: { - canBuy: false, - text: 'Honey Cake', - target: 'Golden', - article: '' - }, - Cake_Zombie: { - canBuy: false, - text: 'Rotten Cake', - target: 'Zombie', - article: '' - }, - Cake_Desert: { - canBuy: false, - text: 'Sand Cake', - target: 'Desert', - article: '' - }, - Cake_Red: { - canBuy: false, - text: 'Strawberry Cake', - target: 'Red', - article: '' - }, - Honey: { - text: 'Honey', - target: 'Golden', - article: '' - }, - Saddle: { - text: 'Saddle', - value: 5, - notes: 'Instantly raises one of your pets into a mount.' - } - }; - - _.each(api.food, function(food, key) { - return _.defaults(food, { - value: 1, - key: key, - notes: "Feed this to a pet and it may grow into a sturdy steed.", - canBuy: true - }); - }); - - api.quests = { - evilsanta: { - canBuy: false, - text: "Trapper Santa", - notes: "You hear bemoaned roars deep in the icefields. You follow the roars and growls - punctuated by another voice's cackling - to a clearing in the woods where you see a fully-grown polar bear. She's caged and shackled, roaring for life. Dancing atop the the cage is a malicious little imp wearing castaway Christmas costumes. Vanquish Trapper Santa, and save the beast!", - completion: "Trapper Santa squeals in anger, and bounces off into the night. A grateful she-bear, through roars and growls, tries to tell you something. You take her back to the stables, where Matt Boch the whisperer listens to her tale with a gasp of horror. She has a cub! He ran off into the icefields when mama bear was captured. Help her find her baby!", - value: 4, - boss: { - name: "Trapper Santa", - hp: 300, - str: 1 - }, - drop: { - items: [ - { - type: 'mounts', - key: 'BearCub-Polar', - text: "Polar Bear (Mount)" - } - ], - gp: 20, - exp: 100 + }, + armor: { + base: { + 0: { + text: "Plain Clothing", + notes: 'Ordinary clothing. Confers no benefit.', + value: 0 } }, - evilsanta2: { - canBuy: false, - text: "Find The Cub", - notes: "Mama bear's cub had run off into the icefields when she was captured by the trapper. At the edge of the woods, she sniffs the air. You hear twig-snaps and snow crunch through the crystaline sound of the forest. Paw prints! You both start racing to follow the trail. Find all the prints and broken twigs, and retrieve her cub!", - completion: "You've found the cub! Mama and baby bear couldn't be more grateful. As a token, they've decided to keep you company till the end of days.", - value: 4, - previous: 'evilsanta', - collect: { - tracks: { - text: 'Tracks', - count: 20 - }, - branches: { - text: 'Broken Twigs', - count: 10 - } + warrior: { + 1: { + text: "Leather Armor", + notes: 'Jerkin of sturdy boiled hide. Increases CON by 3.', + con: 3, + value: 30 }, - drop: { - items: [ - { - type: 'pets', - key: 'BearCub-Polar', - text: "Polar Bear (Pet)" - } - ], - gp: 20, - exp: 100 + 2: { + text: "Chain Mail", + notes: 'Armor of interlocked metal rings. Increases CON by 5.', + con: 5, + value: 45 + }, + 3: { + text: "Plate Armor", + notes: 'Suit of all-encasing steel, the pride of knights. Increases CON by 7.', + con: 7, + value: 65 + }, + 4: { + text: "Red Armor", + notes: 'Heavy plate glowing with defensive enchantments. Increases CON by 9.', + con: 9, + value: 90 + }, + 5: { + text: "Golden Armor", + notes: 'Looks ceremonial, but no known blade can pierce it. Increases CON by 11.', + con: 11, + value: 120, + last: true } }, - gryphon: { - text: "The Fiery Gryphon", - notes: 'The grand beastmaster, @baconsaur, has come to your party seeking help. "Please, adventurers, you must help me! My prized gryphon has broken free and is terrorizing Habit City! If you can stop her, I could reward you with some of her eggs!"', - value: 4, - boss: { - name: "Fiery Gryphon", - hp: 300, - str: 1.5 + rogue: { + 1: { + text: "Oiled Leather", + notes: 'Leather armor treated to reduce noise. Increases PER by 6.', + per: 6, + value: 30 }, - drop: { - items: [ - { - type: 'eggs', - key: 'Gryphon', - text: "Gryphon (Egg)" - }, { - type: 'eggs', - key: 'Gryphon', - text: "Gryphon (Egg)" - } - ], - gp: 25, - exp: 125 + 2: { + text: "Black Leather", + notes: 'Colored with dark dye to blend into shadows. Increases PER by 9', + per: 9, + value: 45 + }, + 3: { + text: "Camouflage Vest", + notes: 'Equally discreet in dungeon or wilderness. Increases PER by 12.', + per: 12, + value: 65 + }, + 4: { + text: "Penumbral Armor", + notes: 'Wraps the wearer in a veil of twilight. Increases PER by 15.', + per: 15, + value: 90 + }, + 5: { + text: "Umbral Armor", + notes: 'Allows stealth in the open in broad daylight. Increases PER by 18.', + per: 18, + value: 120, + last: true } }, - vice1: { - text: "Free Yourself of the Dragon's Influence", - notes: "

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.

Vice Part 1:

How can you expect to the 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!

", - value: 4, - lvl: 30, - boss: { - name: "Vice's Shade", - hp: 750, - str: 1.5 + wizard: { + 1: { + text: "Magician Robe", + notes: 'Hedge-mage\'s outfit. Increases INT by 2.', + int: 2, + value: 30 }, - drop: { - items: [ - { - type: 'quests', - key: "vice2", - text: "Vice Part 2 (Scroll)" - } - ], - gp: 20, - exp: 100 + 2: { + text: "Wizard Robe", + notes: 'Clothes for a wandering wonder-worker. Increases INT by 4.', + int: 4, + value: 45 + }, + 3: { + text: "Robe of Mysteries", + notes: 'Denotes initiation into elite secrets. Increases INT by 6.', + int: 6, + value: 65 + }, + 4: { + text: "Archmage Robe", + notes: 'Spirits and elementals bow before it. Increases INT by 9.', + int: 9, + value: 90 + }, + 5: { + text: "Royal Magus Robe", + notes: 'Symbol of the power behind the throne. Increases INT by 12.', + int: 12, + value: 120, + last: true } }, - vice2: { - text: "Find the Lair of the Wyrm", - notes: "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 it's 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.", - value: 4, - lvl: 35, - previous: 'vice1', - collect: { - lightCrystal: { - text: 'Light Crystal', - count: 45 - } + healer: { + 1: { + text: "Acolyte Robe", + notes: 'Garment showing humility and purpose. Increases CON by 6.', + con: 6, + value: 30 }, - drop: { - items: [ - { - type: 'quests', - key: 'vice3', - text: "Vice Part 3 (Scroll)" - } - ], - gp: 20, - exp: 75 + 2: { + text: "Medic Robe", + notes: 'Worn by those dedicated to tending the wounded in battle. Increases CON by 9.', + con: 9, + value: 45 + }, + 3: { + text: "Defender Mantle", + notes: 'Turns the healer\'s own magics inward to fend off harm. Increases CON by 12.', + con: 12, + value: 65 + }, + 4: { + text: "Physician Mantle", + notes: 'Projects authority and dissipates curses. Increases CON by 15.', + con: 15, + value: 90 + }, + 5: { + text: "Royal Mantle", + notes: 'Attire of those who have saved the lives of kings. Increases CON by 18.', + con: 18, + value: 120, + last: true } }, - vice3: { - text: "Vice Awakens", - notes: "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!", - completion: "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!", - previous: 'vice2', - value: 4, - lvl: 40, - boss: { - name: "Vice, the Shadow Wyrm", - hp: 1500, - str: 3 + special: { + 0: { + text: "Shade Armor", + notes: 'Screams when struck, for it feels pain in its wearer\'s place. Increases CON by 20.', + con: 20, + value: 150, + canOwn: (function(u) { + var _ref; + return +((_ref = u.backer) != null ? _ref.tier : void 0) >= 45; + }) }, - drop: { - items: [ - { - type: 'gear', - key: "weapon_special_2", - text: "Stephen Weber's Shaft of the Dragon" - }, { - type: 'eggs', - key: 'Dragon', - text: "Dragon (Egg)" - }, { - type: 'eggs', - key: 'Dragon', - text: "Dragon (Egg)" - }, { - type: 'hatchingPotions', - key: 'Shade', - text: "Shade Hatching Potion" - }, { - type: 'hatchingPotions', - key: 'Shade', - text: "Shade Hatching Potion" - } - ], - gp: 100, - exp: 1000 + 1: { + text: "Crystal Armor", + notes: 'Its tireless power inures the wearer to mundane discomfort. Increases all attributes by 6.', + con: 6, + str: 6, + per: 6, + int: 6, + value: 170, + canOwn: (function(u) { + var _ref; + return +((_ref = u.contributor) != null ? _ref.level : void 0) >= 2; + }) + }, + 2: { + text: "Jean Chalard's Noble Tunic", + notes: 'Makes you extra fluffy! Increases CON and INT by 25 each.', + int: 25, + con: 25, + value: 200, + canOwn: (function(u) { + var _ref; + return +((_ref = u.backer) != null ? _ref.tier : void 0) >= 300; + }) + }, + yeti: { + event: events.winter, + canOwn: (function(u) { + return u.stats["class"] === 'warrior'; + }), + text: "Yeti-Tamer Robe", + notes: 'Limited Edition 2013 Winter Gear! Fuzzy and fierce. Increases CON by 9.', + con: 9, + value: 90 + }, + ski: { + event: events.winter, + canOwn: (function(u) { + return u.stats["class"] === 'rogue'; + }), + text: "Ski-sassin Parka", + notes: 'Limited Edition 2013 Winter Gear! Full of secret daggers and ski trail maps. Increases PER by 15.', + per: 15, + value: 90 + }, + candycane: { + event: events.winter, + canOwn: (function(u) { + return u.stats["class"] === 'wizard'; + }), + text: "Candy Cane Robe", + notes: 'Limited Edition 2013 Winter Gear! Spun from sugar and silk. Increases INT by 9.', + int: 9, + value: 90 + }, + snowflake: { + event: events.winter, + canOwn: (function(u) { + return u.stats["class"] === 'healer'; + }), + text: "Snowflake Robe", + notes: 'Limited Edition 2013 Winter Gear! A robe to keep you warm, even in a blizzard. Increases CON by 15.', + con: 15, + value: 90 + }, + birthday: { + event: events.birthday, + text: "Absurd Party Robes", + notes: "As part of the festivities, Absurd Party Robes are available free of charge in the Item Store! Swath yourself in those silly garbs and don your matching hats to celebrate this momentous day.", + value: 0 } } - }; - - _.each(api.quests, function(v, key) { - return _.defaults(v, { - key: key, - canBuy: true - }); - }); - - repeat = { - m: true, - t: true, - w: true, - th: true, - f: true, - s: true, - su: true - }; - - api.userDefaults = { - habits: [ - { - type: 'habit', - text: '1h Productive Work', - notes: 'When you create a new Habit, you can click the Edit icon and choose for it to represent a positive habit, a negative habit, or both. For some Habits, like this one, it only makes sense to gain points.', - value: 0, - up: true, - down: false, - attribute: 'per' - }, { - type: 'habit', - text: 'Eat Junk Food', - notes: 'For others, it only makes sense to *lose* points.', - value: 0, - up: false, - down: true, - attribute: 'con' - }, { - type: 'habit', - text: 'Take The Stairs', - notes: 'For the rest, both + and - make sense (stairs = gain, elevator = lose).', - value: 0, - up: true, - down: true, - attribute: 'str' + }, + head: { + base: { + 0: { + text: "No Helm", + notes: 'No headgear.', + value: 0 } - ], - dailys: [ - { - type: 'daily', - text: '1h Personal Project', - notes: 'All tasks default to yellow when they are created. This means you will take only moderate damage when they are missed and will gain only a moderate reward when they are completed.', - value: 0, - completed: false, - repeat: repeat, - attribute: 'per' - }, { - type: 'daily', - text: 'Exercise', - notes: 'Dailies you complete consistently will turn from yellow to green to blue, helping you track your progress. The higher you move up the ladder, the less damage you take for missing and less reward you receive for completing the goal.', - value: 3, - completed: false, - repeat: repeat, - attribute: 'str' - }, { - type: 'daily', - text: '45m Reading', - notes: 'If you miss a daily frequently, it will turn darker shades of orange and red. The redder the task is, the more experience and gold it grants for success and the more damage you take for failure. This encourages you to focus on your shortcomings, the reds.', - value: -10, - completed: false, - repeat: repeat, - attribute: 'int' + }, + warrior: { + 1: { + text: "Leather Helm", + notes: 'Cap of sturdy boiled hide. Increases STR by 2.', + str: 2, + value: 15 + }, + 2: { + text: "Chain Coif", + notes: 'Hood of interlocked metal rings. Increases STR by 4.', + str: 4, + value: 25 + }, + 3: { + text: "Plate Helm", + notes: 'Thick steel helmet, proof against any blow. Increases STR by 6.', + str: 6, + value: 40 + }, + 4: { + text: "Red Helm", + notes: 'Set with rubies for power, and glows when the wearer is angered. Increases STR by 9.', + str: 9, + value: 60 + }, + 5: { + text: "Golden Helm", + notes: 'Regal crown bound to shining armor. Increases STR by 12.', + str: 12, + value: 80, + last: true } - ], - todos: [ - { - type: 'todo', - text: 'Call Mom', - notes: 'While not completing a to-do in a set period of time will not hurt you, they will gradually change from yellow to red, thus becoming more valuable. This will encourage you to wrap up stale To-Dos.', - value: -3, - completed: false, - attribute: 'per' + }, + rogue: { + 1: { + text: "Leather Hood", + notes: 'Basic protective cowl. Increases PER by 2.', + per: 2, + value: 15 + }, + 2: { + text: "Black Leather Hood", + notes: 'Useful for both defense and disguise. Increases PER by 4.', + per: 4, + value: 25 + }, + 3: { + text: "Camouflage Hood", + notes: 'Rugged, but doesn\'t impede hearing. Increases PER by 6.', + per: 6, + value: 40 + }, + 4: { + text: "Penumbral Hood", + notes: 'Grants perfect vision in darkness. Increases PER by 9.', + per: 9, + value: 60 + }, + 5: { + text: "Umbral Hood", + notes: 'Conceals even thoughts from those who would probe them. Increases PER by 12.', + per: 12, + value: 80, + last: true } - ], - rewards: [ - { - type: 'reward', - text: '1 Episode of Game of Thrones', - notes: 'Custom rewards can come in many forms. Some people will hold off watching their favorite show unless they have the gold to pay for it.', + }, + wizard: { + 1: { + text: "Magician Hat", + notes: 'Simple, comfortable, and fashionable. Increases PER by 2.', + per: 2, + value: 15 + }, + 2: { + text: "Cornuthaum", + notes: 'Traditional headgear of the itinerant wizard. Increases PER by 3.', + per: 3, + value: 25 + }, + 3: { + text: "Astrologer Hat", + notes: 'Adorned with the rings of Saturn. Increases PER by 5.', + per: 5, + value: 40 + }, + 4: { + text: "Archmage Hat", + notes: 'Focuses the mind for intensive spellcasting. Increases PER by 7.', + per: 7, + value: 60 + }, + 5: { + text: "Royal Magus Hat", + notes: 'Shows authority over fortune, weather, and lesser mages. Increases PER by 10.', + per: 10, + value: 80, + last: true + } + }, + healer: { + 1: { + text: "Quartz Circlet", + notes: 'Jeweled headpiece, for focus on the task at hand. Increases INT by 2.', + int: 2, + value: 15 + }, + 2: { + text: "Amethyst Circlet", + notes: 'A taste of luxury for a humble profession. Increases INT by 3.', + int: 3, + value: 25 + }, + 3: { + text: "Sapphire Circlet", + notes: 'Shines to let sufferers know their salvation is at hand. Increases INT by 5.', + int: 5, + value: 40 + }, + 4: { + text: "Emerald Diadem", + notes: 'Emits an aura of life and growth. Increases INT by 7.', + int: 7, + value: 60 + }, + 5: { + text: "Royal Diadem", + notes: 'For king, queen, or miracle-worker. Increases INT by 9.', + int: 9, + value: 80, + last: true + } + }, + special: { + 0: { + text: "Shade Helm", + notes: 'Blood and ash, lava and obsidian give this helm its imagery and power. Increases INT by 20.', + int: 20, + value: 150, + canOwn: (function(u) { + var _ref; + return +((_ref = u.backer) != null ? _ref.tier : void 0) >= 45; + }) + }, + 1: { + text: "Crystal Helm", + notes: 'The favored crown of those who lead by example. Increases all attributes by 6.', + con: 6, + str: 6, + per: 6, + int: 6, + value: 170, + canOwn: (function(u) { + var _ref; + return +((_ref = u.contributor) != null ? _ref.level : void 0) >= 3; + }) + }, + 2: { + text: "Nameless Helm", + notes: 'A testament to those who gave of themselves while asking nothing in return. Increases INT and STR by 25 each.', + int: 25, + str: 25, + value: 200, + canOwn: (function(u) { + var _ref; + return +((_ref = u.backer) != null ? _ref.tier : void 0) >= 300; + }) + }, + nye: { + event: events.winter, + text: "Absurd Party Hat", + notes: "You've received an Absurd Party Hat! Wear it with pride while ringing in the New Year!", + value: 0 + }, + yeti: { + event: events.winter, + canOwn: (function(u) { + return u.stats["class"] === 'warrior'; + }), + text: "Yeti-Tamer Helm", + notes: 'Limited Edition 2013 Winter Gear! An adorably fearsome hat. Increases STR by 9.', + str: 9, + value: 60 + }, + ski: { + event: events.winter, + canOwn: (function(u) { + return u.stats["class"] === 'rogue'; + }), + text: "Ski-sassin Helm", + notes: "Limited Edition 2013 Winter Gear! Keeps the wearer's identity secret... and their face toasty. Increases PER by 9.", + per: 9, + value: 60 + }, + candycane: { + event: events.winter, + canOwn: (function(u) { + return u.stats["class"] === 'wizard'; + }), + text: "Candy Cane Hat", + notes: "Limited Edition 2013 Winter Gear! This is the most delicious hat in the world. It's also known to appear and disappear mysteriously. Increases PER by 7.", + per: 7, + value: 60 + }, + snowflake: { + event: events.winter, + canOwn: (function(u) { + return u.stats["class"] === 'healer'; + }), + text: "Snowflake Crown", + notes: 'Limited Edition 2013 Winter Gear! The wearer of this crown is never cold. Increases INT by 7.', + int: 7, + value: 60 + } + } + }, + shield: { + base: { + 0: { + text: "No Off-Hand Equipment", + notes: 'No shield or second weapon.', + value: 0 + } + }, + warrior: { + 1: { + text: "Wooden Shield", + notes: 'Round shield of thick wood. Increases CON by 2.', + con: 2, value: 20 - }, { - type: 'reward', - text: 'Cake', - notes: 'Other people just want to enjoy a nice piece of cake. Try to create rewards that will motivate you best.', - value: 10 + }, + 2: { + text: "Buckler", + notes: 'Light and sturdy, quick to bring to the defense. Increases CON by 3.', + con: 3, + value: 35 + }, + 3: { + text: "Reinforced Shield", + notes: 'Made of wood but bolstered with metal bands. Increases CON by 5.', + con: 5, + value: 50 + }, + 4: { + text: "Red Shield", + notes: 'Rebukes blows with a burst of flame. Increases CON by 7.', + con: 7, + value: 70 + }, + 5: { + text: "Golden Shield", + notes: 'Shining badge of the vanguard. Increases CON by 9.', + con: 9, + value: 90, + last: true } - ], - tags: [ - { - name: 'morning' - }, { - name: 'afternoon' - }, { - name: 'evening' + }, + rogue: { + 0: { + text: "Dagger", + notes: 'A rogue\'s most basic weapon. Confers no benefit.', + str: 0, + value: 0 + }, + 1: { + text: "Short Sword", + notes: 'Light, concealable blade. Increases STR by 2.', + str: 2, + value: 20 + }, + 2: { + text: "Scimitar", + notes: 'Slashing sword, swift to deliver a killing blow. Increases STR by 3.', + str: 3, + value: 35 + }, + 3: { + text: "Kukri", + notes: 'Distinctive bush knife, both survival tool and weapon. Increases STR by 4.', + str: 4, + value: 50 + }, + 4: { + text: "Nunchaku", + notes: 'Heavy batons whirled about on a length of chain. Increases STR by 6.', + str: 6, + value: 70 + }, + 5: { + text: "Ninja-to", + notes: 'Sleek and deadly as the ninja themselves. Increases STR by 8.', + str: 8, + value: 90 + }, + 6: { + text: "Hook Sword", + notes: 'Complex weapon adept at ensnaring and disarming opponents. Increases STR by 10.', + str: 10, + value: 120, + last: true } - ] - }; + }, + wizard: {}, + healer: { + 1: { + text: "Medic Buckler", + notes: 'Easy to disengage, freeing a hand for bandaging. Increases CON by 2.', + con: 2, + value: 20 + }, + 2: { + text: "Kite Shield", + notes: 'Tapered shield with the symbol of healing. Increases CON by 4.', + con: 4, + value: 35 + }, + 3: { + text: "Protector Shield", + notes: 'Traditional shield of defender knights. Increases CON by 6.', + con: 6, + value: 50 + }, + 4: { + text: "Savior Shield", + notes: 'Stops blows aimed at nearby innocents as well as those aimed at you. Increases CON by 9.', + con: 9, + value: 70 + }, + 5: { + text: "Royal Shield", + notes: 'Bestowed upon those most dedicated to the kingdom\'s defense. Increases CON by 12.', + con: 12, + value: 90, + last: true + } + }, + special: { + 0: { + text: "Tormented Skull", + notes: 'Sees beyond the veil of death, and displays what it finds there for enemies to fear. Increases PER by 20.', + per: 20, + value: 150, + canOwn: (function(u) { + var _ref; + return +((_ref = u.backer) != null ? _ref.tier : void 0) >= 45; + }) + }, + 1: { + text: "Crystal Shield", + notes: 'Shatters arrows and deflects the words of naysayers. Increases all attributes by 6.', + con: 6, + str: 6, + per: 6, + int: 6, + value: 170, + canOwn: (function(u) { + var _ref; + return +((_ref = u.contributor) != null ? _ref.level : void 0) >= 5; + }) + }, + yeti: { + event: events.winter, + canOwn: (function(u) { + return u.stats["class"] === 'warrior'; + }), + text: "Yeti-Tamer Shield", + notes: 'Limited Edition 2013 Winter Gear! This shield reflects light from the snow. Increases CON by 7.', + con: 7, + value: 70 + }, + ski: { + event: events.winter, + canOwn: (function(u) { + return u.stats["class"] === 'rogue'; + }), + text: "Ski-sassin Pole", + notes: 'Limited Edition 2013 Winter Gear! A weapon capable of destroying hordes of enemies! It also helps the user make very nice parallel turns. Increases STR by 8.', + str: 8, + value: 90 + }, + snowflake: { + event: events.winter, + canOwn: (function(u) { + return u.stats["class"] === 'healer'; + }), + text: "Snowflake Shield", + notes: 'Limited Edition 2013 Winter Gear! Every shield is unique. Increases CON by 9.', + con: 9, + value: 70 + } + } + } +}; -}).call(this); + +/* + The gear is exported as a tree (defined above), and a flat list (eg, {weapon_healer_1: .., shield_special_0: ...}) since + they are needed in different froms at different points in the app + */ + +api.gear = { + tree: gear, + flat: {} +}; + +_.each(gearTypes, function(type) { + return _.each(classes.concat(['base', 'special']), function(klass) { + return _.each(gear[type][klass], function(item, i) { + var key, _canOwn; + key = "" + type + "_" + klass + "_" + i; + _.defaults(item, { + type: type, + key: key, + klass: klass, + index: i, + str: 0, + int: 0, + per: 0, + con: 0 + }); + if (item.event) { + _canOwn = item.canOwn || (function() { + return true; + }); + item.canOwn = function(u) { + return _canOwn(u) && ((u.items.gear.owned[key] != null) || (moment().isAfter(item.event.start) && moment().isBefore(item.event.end))); + }; + } + return api.gear.flat[key] = item; + }); + }); +}); + + +/* + --------------------------------------------------------------- + Potion + --------------------------------------------------------------- + */ + +api.potion = { + type: 'potion', + text: "Health Potion", + notes: "Recover 15 Health (Instant Use)", + value: 25, + key: 'potion' +}; + + +/* + --------------------------------------------------------------- + Classes + --------------------------------------------------------------- + */ + +api.classes = classes; + + +/* + --------------------------------------------------------------- + Gear Types + --------------------------------------------------------------- + */ + +api.gearTypes = gearTypes; + + +/* + --------------------------------------------------------------- + Spells + --------------------------------------------------------------- + Text, notes, and mana are obvious. The rest: + + * {target}: one of [task, self, party, user]. This is very important, because if the cast() function is expecting one + thing and receives another, it will cause errors. `self` is used for self buffs, multi-task debuffs, AOEs (eg, meteor-shower), + etc. Basically, use self for anything that's not [task, party, user] and is an instant-cast + + * {cast}: the function that's run to perform the ability's action. This is pretty slick - because this is exported to the + web, this function can be performed on the client and on the server. `user` param is self (needed for determining your + own stats for effectiveness of cast), and `target` param is one of [task, party, user]. In the case of `self` spells, + you act on `user` instead of `target`. You can trust these are the correct objects, as long as the `target` attr of the + spell is correct. Take a look at habitrpg/src/models/user.js and habitrpg/src/models/task.js for what attributes are + available on each model. Note `task.value` is its "redness". If party is passed in, it's an array of users, + so you'll want to iterate over them like: `_.each(target,function(member){...})` + + Note, user.stats.mp is docked after automatically (it's appended to functions automatically down below in an _.each) + */ + +diminishingReturns = function(bonus, max, halfway) { + if (halfway == null) { + halfway = max / 2; + } + return max * (bonus / (bonus + halfway)); +}; + +api.spells = { + wizard: { + fireball: { + text: 'Burst of Flames', + mana: 10, + lvl: 11, + target: 'task', + notes: 'With a crack, flames burst from your staff, scorching a task. You deal high damage to the task, and gain additional experience (more experience for greens).', + cast: function(user, target) { + var bonus; + bonus = user._statsComputed.int * user.fns.crit('per'); + target.value += diminishingReturns(bonus * .02, 4); + bonus *= Math.ceil((target.value < 0 ? 1 : target.value + 1) * .075); + user.stats.exp += diminishingReturns(bonus, 75); + if (user.party.quest.key) { + return user.party.quest.progress.up += diminishingReturns(bonus * .1, 50, 30); + } + } + }, + mpheal: { + text: 'Ethereal Surge', + mana: 30, + lvl: 12, + target: 'party', + notes: "A flow of magical energy rushes from your hands and recharges your party. Your party recovers MP.", + cast: function(user, target) { + return _.each(target, function(member) { + var bonus; + bonus = Math.ceil(user._statsComputed.int * .1); + if (bonus > 25) { + bonus = 25; + } + return member.stats.mp += bonus; + }); + } + }, + earth: { + text: 'Earthquake', + mana: 35, + lvl: 13, + target: 'party', + notes: "The ground below your party's tasks cracks and shakes with extreme intensity, slowing them down and opening them up to more attacks. Your party gains a buff to experience.", + cast: function(user, target) { + return _.each(target, function(member) { + var _base; + if ((_base = member.stats.buffs).int == null) { + _base.int = 0; + } + return member.stats.buffs.int += Math.ceil(user._statsComputed.int * .05); + }); + } + }, + frost: { + text: 'Chilling Frost', + mana: 40, + lvl: 14, + target: 'self', + notes: "Ice erupts from every surface, swallowing your tasks and freezing them in place. Your dailies' streaks won't reset at the end of the day.", + cast: function(user, target) { + return user.stats.buffs.streaks = true; + } + } + }, + warrior: { + smash: { + text: 'Brutal Smash', + mana: 10, + lvl: 11, + target: 'task', + notes: "You savagely hit a single task with all of your might, beating it into submission. The task's redness decreases.", + cast: function(user, target) { + target.value += 2.5 * (user._statsComputed.str / (user._statsComputed.str + 50)) * user.fns.crit('per'); + if (user.party.quest.key) { + return user.party.quest.progress.up += Math.ceil(user._statsComputed.str * .2); + } + } + }, + defensiveStance: { + text: 'Defensive Stance', + mana: 25, + lvl: 12, + target: 'self', + notes: "You take a moment to relax your body and enter a defensive stance to ready yourself for the tasks' next onslaught. Reduces damage from dailies at the end of the day.", + cast: function(user, target) { + var _base; + if ((_base = user.stats.buffs).con == null) { + _base.con = 0; + } + return user.stats.buffs.con += Math.ceil(user._statsComputed.con * .05); + } + }, + valorousPresence: { + text: 'Valorous Presence', + mana: 20, + lvl: 13, + target: 'party', + notes: "Your presence emboldens the party. Their newfound courage gives them a boost of strength. Party members gain a buff to their STR.", + cast: function(user, target) { + return _.each(target, function(member) { + var _base; + if ((_base = member.stats.buffs).str == null) { + _base.str = 0; + } + return member.stats.buffs.str += Math.ceil(user._statsComputed.str * .05); + }); + } + }, + intimidate: { + text: 'Intimidating Gaze', + mana: 15, + lvl: 14, + target: 'party', + notes: "Your gaze strikes fear into the hearts of your party's enemies. The party gains a moderate boost to defense.", + cast: function(user, target) { + return _.each(target, function(member) { + var _base; + if ((_base = member.stats.buffs).con == null) { + _base.con = 0; + } + return member.stats.buffs.con += Math.ceil(user._statsComputed.con * .03); + }); + } + } + }, + rogue: { + pickPocket: { + text: 'Pickpocket', + mana: 10, + lvl: 11, + target: 'task', + notes: "Your nimble fingers run through the task's pockets and find some treasures for yourself. You gain an increased gold bonus on the task, higher yet the 'fatter' (bluer) your task.", + cast: function(user, target) { + var bonus; + bonus = (target.value < 0 ? 1 : target.value + 2) + (user._statsComputed.per * 0.5); + return user.stats.gp += 25 * (bonus / (bonus + 75)); + } + }, + backStab: { + text: 'Backstab', + mana: 15, + lvl: 12, + target: 'task', + notes: "Without a sound, you sweep behind a task and stab it in the back. You deal higher damage to the task, with a higher chance of a critical hit.", + cast: function(user, target) { + var bonus, _crit; + _crit = user.fns.crit('per', .3); + target.value += _crit * .03; + bonus = (target.value < 0 ? 1 : target.value + 1) * _crit; + user.stats.exp += bonus; + return user.stats.gp += bonus; + } + }, + toolsOfTrade: { + text: 'Tools of the Trade', + mana: 25, + lvl: 13, + target: 'party', + notes: "You share your thievery tools with the party to aid them in 'acquiring' more gold. The party's gold bonus for tasks and chance of drops is buffed for a day.", + cast: function(user, target) { + return _.each(target, function(member) { + var _base; + if ((_base = member.stats.buffs).per == null) { + _base.per = 0; + } + return member.stats.buffs.per += Math.ceil(user._statsComputed.per * .03); + }); + } + }, + stealth: { + text: 'Stealth', + mana: 45, + lvl: 14, + target: 'self', + notes: "You duck into the shadows, pulling up your hood. Many dailies won't find you this night; fewer yet the higher your Perception.", + cast: function(user, target) { + var _base; + if ((_base = user.stats.buffs).stealth == null) { + _base.stealth = 0; + } + return user.stats.buffs.stealth += Math.ceil(user.dailys.length * user._statsComputed.per / 100); + } + } + }, + healer: { + heal: { + text: 'Healing Light', + mana: 15, + lvl: 11, + target: 'self', + notes: 'Light covers your body, healing your wounds. You gain a boost to your health.', + cast: function(user, target) { + user.stats.hp += (user._statsComputed.con + user._statsComputed.int + 5) * .075; + if (user.stats.hp > 50) { + return user.stats.hp = 50; + } + } + }, + brightness: { + text: 'Searing Brightness', + mana: 15, + lvl: 12, + target: 'self', + notes: "You cast a burst of light that blinds all of your tasks. The redness of your tasks is reduced.", + cast: function(user, target) { + return _.each(user.tasks, function(target) { + if (target.type === 'reward') { + return; + } + return target.value += 1.5 * (user._statsComputed.int / (user._statsComputed.int + 40)); + }); + } + }, + protectAura: { + text: 'Protective Aura', + mana: 30, + lvl: 13, + target: 'party', + notes: "A magical aura surrounds your party members, protecting them from damage. Your party members gain a buff to their defense.", + cast: function(user, target) { + return _.each(target, function(member) { + var _base; + if ((_base = member.stats.buffs).con == null) { + _base.con = 0; + } + return member.stats.buffs.con += Math.ceil(user._statsComputed.con * .15); + }); + } + }, + heallAll: { + text: 'Blessing', + mana: 25, + lvl: 14, + target: 'party', + notes: "Soothing light envelops your party and heals them of their injuries. Your party members gain a boost to their health.", + cast: function(user, target) { + return _.each(target, function(member) { + member.stats.hp += (user._statsComputed.con + user._statsComputed.int + 5) * .04; + if (member.stats.hp > 50) { + return member.stats.hp = 50; + } + }); + } + } + }, + special: { + snowball: { + text: 'Snowball', + mana: 0, + value: 1, + target: 'user', + notes: "Throw a snowball at a party member, what could possibly go wrong? Lasts until member's new day.", + cast: function(user, target) { + var _base; + target.stats.buffs.snowball = true; + if ((_base = target.achievements).snowball == null) { + _base.snowball = 0; + } + target.achievements.snowball++; + return user.items.special.snowball--; + } + }, + salt: { + text: 'Salt', + mana: 0, + value: 5, + target: 'self', + notes: 'Someone has snowballed you. Ha ha, very funny. Now get this snow off me!', + cast: function(user, target) { + user.stats.buffs.snowball = false; + return user.stats.gp -= 5; + } + } + } +}; + +_.each(api.spells, function(spellClass) { + return _.each(spellClass, function(spell, key) { + var _cast; + spell.key = key; + _cast = spell.cast; + return spell.cast = function(user, target) { + _cast(user, target); + return user.stats.mp -= spell.mana; + }; + }); +}); + +api.special = api.spells.special; + + +/* + --------------------------------------------------------------- + Drops + --------------------------------------------------------------- + */ + +api.dropEggs = { + Wolf: { + text: 'Wolf', + adjective: 'loyal' + }, + TigerCub: { + text: 'Tiger Cub', + mountText: 'Tiger', + adjective: 'fierce' + }, + PandaCub: { + text: 'Panda Cub', + mountText: 'Panda', + adjective: 'gentle' + }, + LionCub: { + text: 'Lion Cub', + mountText: 'Lion', + adjective: 'regal' + }, + Fox: { + text: 'Fox', + adjective: 'wily' + }, + FlyingPig: { + text: 'Flying Pig', + adjective: 'whimsical' + }, + Dragon: { + text: 'Dragon', + adjective: 'mighty' + }, + Cactus: { + text: 'Cactus', + adjective: 'prickly' + }, + BearCub: { + text: 'Bear Cub', + mountText: 'Bear', + adjective: 'cuddly' + } +}; + +_.each(api.dropEggs, function(egg, key) { + return _.defaults(egg, { + canBuy: true, + value: 3, + key: key, + notes: "Find a hatching potion to pour on this egg, and it will hatch into a " + egg.adjective + " " + egg.text + ".", + mountText: egg.text + }); +}); + +api.questEggs = { + Gryphon: { + text: 'Gryphon', + adjective: 'regal', + canBuy: false + } +}; + +_.each(api.questEggs, function(egg, key) { + return _.defaults(egg, { + canBuy: false, + value: 3, + key: key, + notes: "Find a hatching potion to pour on this egg, and it will hatch into a " + egg.adjective + " " + egg.text + ".", + mountText: egg.text + }); +}); + +api.eggs = _.assign(_.cloneDeep(api.dropEggs), api.questEggs); + +api.specialPets = { + 'Wolf-Veteran': true, + 'Wolf-Cerberus': true, + 'Dragon-Hydra': true, + 'Turkey-Base': true, + 'BearCub-Polar': true +}; + +api.specialMounts = { + 'BearCub-Polar': true, + 'LionCub-Ethereal': true +}; + +api.hatchingPotions = { + Base: { + value: 2, + text: 'Base' + }, + White: { + value: 2, + text: 'White' + }, + Desert: { + value: 2, + text: 'Desert' + }, + Red: { + value: 3, + text: 'Red' + }, + Shade: { + value: 3, + text: 'Shade' + }, + Skeleton: { + value: 3, + text: 'Skeleton' + }, + Zombie: { + value: 4, + text: 'Zombie' + }, + CottonCandyPink: { + value: 4, + text: 'Cotton Candy Pink' + }, + CottonCandyBlue: { + value: 4, + text: 'Cotton Candy Blue' + }, + Golden: { + value: 5, + text: 'Golden' + } +}; + +_.each(api.hatchingPotions, function(pot, key) { + return _.defaults(pot, { + key: key, + value: 2, + notes: "Pour this on an egg, and it will hatch as a " + pot.text + " pet." + }); +}); + +api.pets = _.transform(api.dropEggs, function(m, egg) { + return _.defaults(m, _.transform(api.hatchingPotions, function(m2, pot) { + return m2[egg.key + "-" + pot.key] = true; + })); +}); + +api.questPets = _.transform(api.questEggs, function(m, egg) { + return _.defaults(m, _.transform(api.hatchingPotions, function(m2, pot) { + return m2[egg.key + "-" + pot.key] = true; + })); +}); + +api.food = { + Meat: { + text: 'Meat', + target: 'Base', + article: '' + }, + Milk: { + text: 'Milk', + target: 'White', + article: '' + }, + Potatoe: { + text: 'Potato', + target: 'Desert', + article: 'a ' + }, + Strawberry: { + text: 'Strawberry', + target: 'Red', + article: 'a ' + }, + Chocolate: { + text: 'Chocolate', + target: 'Shade', + article: '' + }, + Fish: { + text: 'Fish', + target: 'Skeleton', + article: 'a ' + }, + RottenMeat: { + text: 'Rotten Meat', + target: 'Zombie', + article: '' + }, + CottonCandyPink: { + text: 'Pink Cotton Candy', + target: 'CottonCandyPink', + article: '' + }, + CottonCandyBlue: { + text: 'Blue Cotton Candy', + target: 'CottonCandyBlue', + article: '' + }, + Cake_Skeleton: { + canBuy: false, + text: 'Bare Bones Cake', + target: 'Skeleton', + article: '' + }, + Cake_Base: { + canBuy: false, + text: 'Basic Cake', + target: 'Base', + article: '' + }, + Cake_CottonCandyBlue: { + canBuy: false, + text: 'Candy Blue Cake', + target: 'CottonCandyBlue', + article: '' + }, + Cake_CottonCandyPink: { + canBuy: false, + text: 'Candy Pink Cake', + target: 'CottonCandyPink', + article: '' + }, + Cake_Shade: { + canBuy: false, + text: 'Chocolate Cake', + target: 'Shade', + article: '' + }, + Cake_White: { + canBuy: false, + text: 'Cream Cake', + target: 'White', + article: '' + }, + Cake_Golden: { + canBuy: false, + text: 'Honey Cake', + target: 'Golden', + article: '' + }, + Cake_Zombie: { + canBuy: false, + text: 'Rotten Cake', + target: 'Zombie', + article: '' + }, + Cake_Desert: { + canBuy: false, + text: 'Sand Cake', + target: 'Desert', + article: '' + }, + Cake_Red: { + canBuy: false, + text: 'Strawberry Cake', + target: 'Red', + article: '' + }, + Honey: { + text: 'Honey', + target: 'Golden', + article: '' + }, + Saddle: { + text: 'Saddle', + value: 5, + notes: 'Instantly raises one of your pets into a mount.' + } +}; + +_.each(api.food, function(food, key) { + return _.defaults(food, { + value: 1, + key: key, + notes: "Feed this to a pet and it may grow into a sturdy steed.", + canBuy: true + }); +}); + +api.quests = { + evilsanta: { + canBuy: false, + text: "Trapper Santa", + notes: "You hear bemoaned roars deep in the icefields. You follow the roars and growls - punctuated by another voice's cackling - to a clearing in the woods where you see a fully-grown polar bear. She's caged and shackled, roaring for life. Dancing atop the the cage is a malicious little imp wearing castaway Christmas costumes. Vanquish Trapper Santa, and save the beast!", + completion: "Trapper Santa squeals in anger, and bounces off into the night. A grateful she-bear, through roars and growls, tries to tell you something. You take her back to the stables, where Matt Boch the whisperer listens to her tale with a gasp of horror. She has a cub! He ran off into the icefields when mama bear was captured. Help her find her baby!", + value: 4, + boss: { + name: "Trapper Santa", + hp: 300, + str: 1 + }, + drop: { + items: [ + { + type: 'mounts', + key: 'BearCub-Polar', + text: "Polar Bear (Mount)" + } + ], + gp: 20, + exp: 100 + } + }, + evilsanta2: { + canBuy: false, + text: "Find The Cub", + notes: "Mama bear's cub had run off into the icefields when she was captured by the trapper. At the edge of the woods, she sniffs the air. You hear twig-snaps and snow crunch through the crystaline sound of the forest. Paw prints! You both start racing to follow the trail. Find all the prints and broken twigs, and retrieve her cub!", + completion: "You've found the cub! Mama and baby bear couldn't be more grateful. As a token, they've decided to keep you company till the end of days.", + value: 4, + previous: 'evilsanta', + collect: { + tracks: { + text: 'Tracks', + count: 20 + }, + branches: { + text: 'Broken Twigs', + count: 10 + } + }, + drop: { + items: [ + { + type: 'pets', + key: 'BearCub-Polar', + text: "Polar Bear (Pet)" + } + ], + gp: 20, + exp: 100 + } + }, + gryphon: { + text: "The Fiery Gryphon", + notes: 'The grand beastmaster, @baconsaur, has come to your party seeking help. "Please, adventurers, you must help me! My prized gryphon has broken free and is terrorizing Habit City! If you can stop her, I could reward you with some of her eggs!"', + value: 4, + boss: { + name: "Fiery Gryphon", + hp: 300, + str: 1.5 + }, + drop: { + items: [ + { + type: 'eggs', + key: 'Gryphon', + text: "Gryphon (Egg)" + }, { + type: 'eggs', + key: 'Gryphon', + text: "Gryphon (Egg)" + } + ], + gp: 25, + exp: 125 + } + }, + vice1: { + text: "Free Yourself of the Dragon's Influence", + notes: "

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.

Vice Part 1:

How can you expect to the 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!

", + value: 4, + lvl: 30, + boss: { + name: "Vice's Shade", + hp: 750, + str: 1.5 + }, + drop: { + items: [ + { + type: 'quests', + key: "vice2", + text: "Vice Part 2 (Scroll)" + } + ], + gp: 20, + exp: 100 + } + }, + vice2: { + text: "Find the Lair of the Wyrm", + notes: "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 it's 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.", + value: 4, + lvl: 35, + previous: 'vice1', + collect: { + lightCrystal: { + text: 'Light Crystal', + count: 45 + } + }, + drop: { + items: [ + { + type: 'quests', + key: 'vice3', + text: "Vice Part 3 (Scroll)" + } + ], + gp: 20, + exp: 75 + } + }, + vice3: { + text: "Vice Awakens", + notes: "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!", + completion: "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!", + previous: 'vice2', + value: 4, + lvl: 40, + boss: { + name: "Vice, the Shadow Wyrm", + hp: 1500, + str: 3 + }, + drop: { + items: [ + { + type: 'gear', + key: "weapon_special_2", + text: "Stephen Weber's Shaft of the Dragon" + }, { + type: 'eggs', + key: 'Dragon', + text: "Dragon (Egg)" + }, { + type: 'eggs', + key: 'Dragon', + text: "Dragon (Egg)" + }, { + type: 'hatchingPotions', + key: 'Shade', + text: "Shade Hatching Potion" + }, { + type: 'hatchingPotions', + key: 'Shade', + text: "Shade Hatching Potion" + } + ], + gp: 100, + exp: 1000 + } + } +}; + +_.each(api.quests, function(v, key) { + return _.defaults(v, { + key: key, + canBuy: true + }); +}); + +repeat = { + m: true, + t: true, + w: true, + th: true, + f: true, + s: true, + su: true +}; + +api.userDefaults = { + habits: [ + { + type: 'habit', + text: '1h Productive Work', + notes: 'When you create a new Habit, you can click the Edit icon and choose for it to represent a positive habit, a negative habit, or both. For some Habits, like this one, it only makes sense to gain points.', + value: 0, + up: true, + down: false, + attribute: 'per' + }, { + type: 'habit', + text: 'Eat Junk Food', + notes: 'For others, it only makes sense to *lose* points.', + value: 0, + up: false, + down: true, + attribute: 'con' + }, { + type: 'habit', + text: 'Take The Stairs', + notes: 'For the rest, both + and - make sense (stairs = gain, elevator = lose).', + value: 0, + up: true, + down: true, + attribute: 'str' + } + ], + dailys: [ + { + type: 'daily', + text: '1h Personal Project', + notes: 'All tasks default to yellow when they are created. This means you will take only moderate damage when they are missed and will gain only a moderate reward when they are completed.', + value: 0, + completed: false, + repeat: repeat, + attribute: 'per' + }, { + type: 'daily', + text: 'Exercise', + notes: 'Dailies you complete consistently will turn from yellow to green to blue, helping you track your progress. The higher you move up the ladder, the less damage you take for missing and less reward you receive for completing the goal.', + value: 3, + completed: false, + repeat: repeat, + attribute: 'str' + }, { + type: 'daily', + text: '45m Reading', + notes: 'If you miss a daily frequently, it will turn darker shades of orange and red. The redder the task is, the more experience and gold it grants for success and the more damage you take for failure. This encourages you to focus on your shortcomings, the reds.', + value: -10, + completed: false, + repeat: repeat, + attribute: 'int' + } + ], + todos: [ + { + type: 'todo', + text: 'Call Mom', + notes: 'While not completing a to-do in a set period of time will not hurt you, they will gradually change from yellow to red, thus becoming more valuable. This will encourage you to wrap up stale To-Dos.', + value: -3, + completed: false, + attribute: 'per' + } + ], + rewards: [ + { + type: 'reward', + text: '1 Episode of Game of Thrones', + notes: 'Custom rewards can come in many forms. Some people will hold off watching their favorite show unless they have the gold to pay for it.', + value: 20 + }, { + type: 'reward', + text: 'Cake', + notes: 'Other people just want to enjoy a nice piece of cake. Try to create rewards that will motivate you best.', + value: 10 + } + ], + tags: [ + { + name: 'morning' + }, { + name: 'afternoon' + }, { + name: 'evening' + } + ] +}; },{"lodash":3,"moment":4}],6:[function(require,module,exports){ -var process=require("__browserify_process");(function() { - var $w, api, content, moment, preenHistory, sanitizeOptions, _, - __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; +(function (process){ +var $w, api, content, moment, preenHistory, sanitizeOptions, _, + __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; - moment = require('moment'); +moment = require('moment'); - _ = require('lodash'); +_ = require('lodash'); - content = require('./content.coffee'); +content = require('./content.coffee'); - api = module.exports = {}; +api = module.exports = {}; - $w = function(s) { - return s.split(' '); +$w = function(s) { + return s.split(' '); +}; + + +/* + ------------------------------------------------------ + Time / Day + ------------------------------------------------------ + */ + + +/* + Each time we're performing date math (cron, task-due-days, etc), we need to take user preferences into consideration. + Specifically {dayStart} (custom day start) and {timezoneOffset}. This function sanitizes / defaults those values. + {now} is also passed in for various purposes, one example being the test scripts scripts testing different "now" times + */ + +sanitizeOptions = function(o) { + var dayStart, now, timezoneOffset, _ref; + dayStart = !_.isNaN(+o.dayStart) && (0 <= (_ref = +o.dayStart) && _ref <= 24) ? +o.dayStart : 0; + timezoneOffset = o.timezoneOffset ? +o.timezoneOffset : +moment().zone(); + now = o.now ? moment(o.now).zone(timezoneOffset) : moment(+(new Date)).zone(timezoneOffset); + return { + dayStart: dayStart, + timezoneOffset: timezoneOffset, + now: now }; +}; - /* - ------------------------------------------------------ - Time / Day - ------------------------------------------------------ - */ +api.startOfWeek = api.startOfWeek = function(options) { + var o; + if (options == null) { + options = {}; + } + o = sanitizeOptions(options); + return moment(o.now).startOf('week'); +}; + +api.startOfDay = function(options) { + var o; + if (options == null) { + options = {}; + } + o = sanitizeOptions(options); + return moment(o.now).startOf('day').add('h', o.dayStart); +}; + +api.dayMapping = { + 0: 'su', + 1: 'm', + 2: 't', + 3: 'w', + 4: 'th', + 5: 'f', + 6: 's' +}; - /* - Each time we're performing date math (cron, task-due-days, etc), we need to take user preferences into consideration. - Specifically {dayStart} (custom day start) and {timezoneOffset}. This function sanitizes / defaults those values. - {now} is also passed in for various purposes, one example being the test scripts scripts testing different "now" times - */ +/* + Absolute diff from "yesterday" till now + */ + +api.daysSince = function(yesterday, options) { + var o; + if (options == null) { + options = {}; + } + o = sanitizeOptions(options); + return Math.abs(api.startOfDay(_.defaults({ + now: yesterday + }, o)).diff(o.now, 'days')); +}; - sanitizeOptions = function(o) { - var dayStart, now, timezoneOffset, _ref; +/* + Should the user do this taks on this date, given the task's repeat options and user.preferences.dayStart? + */ - dayStart = !_.isNaN(+o.dayStart) && (0 <= (_ref = +o.dayStart) && _ref <= 24) ? +o.dayStart : 0; - timezoneOffset = o.timezoneOffset ? +o.timezoneOffset : +moment().zone(); - now = o.now ? moment(o.now).zone(timezoneOffset) : moment(+(new Date)).zone(timezoneOffset); - return { - dayStart: dayStart, - timezoneOffset: timezoneOffset, - now: now - }; - }; - - api.startOfWeek = api.startOfWeek = function(options) { - var o; - - if (options == null) { - options = {}; - } - o = sanitizeOptions(options); - return moment(o.now).startOf('week'); - }; - - api.startOfDay = function(options) { - var o; - - if (options == null) { - options = {}; - } - o = sanitizeOptions(options); - return moment(o.now).startOf('day').add('h', o.dayStart); - }; - - api.dayMapping = { - 0: 'su', - 1: 'm', - 2: 't', - 3: 'w', - 4: 'th', - 5: 'f', - 6: 's' - }; - - /* - Absolute diff from "yesterday" till now - */ +api.shouldDo = function(day, repeat, options) { + var o, selected, yesterday; + if (options == null) { + options = {}; + } + if (!repeat) { + return false; + } + o = sanitizeOptions(options); + selected = repeat[api.dayMapping[api.startOfDay(_.defaults({ + now: day + }, o)).day()]]; + if (!moment(day).zone(o.timezoneOffset).isSame(o.now, 'd')) { + return selected; + } + if (options.dayStart <= o.now.hour()) { + return selected; + } else { + yesterday = moment(o.now).subtract(1, 'd').day(); + return repeat[api.dayMapping[yesterday]]; + } +}; - api.daysSince = function(yesterday, options) { - var o; +/* + ------------------------------------------------------ + Scoring + ------------------------------------------------------ + */ - if (options == null) { - options = {}; - } - o = sanitizeOptions(options); - return Math.abs(api.startOfDay(_.defaults({ - now: yesterday - }, o)).diff(o.now, 'days')); - }; - - /* - Should the user do this taks on this date, given the task's repeat options and user.preferences.dayStart? - */ +api.tnl = function(lvl) { + if (lvl >= 100) { + return 0; + } else { + return Math.round(((Math.pow(lvl, 2) * 0.25) + (10 * lvl) + 139.75) / 10) * 10; + } +}; - api.shouldDo = function(day, repeat, options) { - var o, selected, yesterday; +/* + A hyperbola function that creates diminishing returns, so you can't go to infinite (eg, with Exp gain). + {max} The asymptote + {bonus} All the numbers combined for your point bonus (eg, task.value * user.stats.int * critChance, etc) + {halfway} (optional) the point at which the graph starts bending + */ - if (options == null) { - options = {}; - } - if (!repeat) { - return false; - } - o = sanitizeOptions(options); - selected = repeat[api.dayMapping[api.startOfDay(_.defaults({ - now: day - }, o)).day()]]; - if (!moment(day).zone(o.timezoneOffset).isSame(o.now, 'd')) { - return selected; - } - if (options.dayStart <= o.now.hour()) { - return selected; - } else { - yesterday = moment(o.now).subtract(1, 'd').day(); - return repeat[api.dayMapping[yesterday]]; - } - }; +api.diminishingReturns = function(bonus, max, halfway) { + if (halfway == null) { + halfway = max / 2; + } + return max * (bonus / (bonus + halfway)); +}; - /* - ------------------------------------------------------ - Scoring - ------------------------------------------------------ - */ +api.monod = function(bonus, rateOfIncrease, max) { + return rateOfIncrease * max * bonus / (rateOfIncrease * bonus + max); +}; - api.tnl = function(lvl) { - if (lvl >= 100) { - return 0; - } else { - return Math.round(((Math.pow(lvl, 2) * 0.25) + (10 * lvl) + 139.75) / 10) * 10; - } - }; +/* +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] + */ - /* - A hyperbola function that creates diminishing returns, so you can't go to infinite (eg, with Exp gain). - {max} The asymptote - {bonus} All the numbers combined for your point bonus (eg, task.value * user.stats.int * critChance, etc) - {halfway} (optional) the point at which the graph starts bending - */ - - - api.diminishingReturns = function(bonus, max, halfway) { - if (halfway == null) { - halfway = max / 2; - } - return max * (bonus / (bonus + halfway)); - }; - - api.monod = function(bonus, rateOfIncrease, max) { - return rateOfIncrease * max * bonus / (rateOfIncrease * bonus + max); - }; - - /* - 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] - */ - - - preenHistory = 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; +preenHistory = 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 }); - }; - 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; - }; - - /* - Update the in-browser store with new gear. FIXME this was in user.fns, but it was causing strange issues there - */ - - - api.updateStore = function(user) { - var changes; - - if (!user) { - return; - } - changes = []; - _.each(['weapon', 'armor', 'shield', 'head'], function(type) { - var found; - - found = _.find(content.gear.tree[type][user.stats["class"]], function(item) { - return !user.items.gear.owned[item.key]; - }); - if (found) { - changes.push(found); - } return true; }); - changes = changes.concat(_.filter(content.gear.flat, function(v) { - return v.klass === 'special' && !user.items.gear.owned[v.key] && (typeof v.canOwn === "function" ? v.canOwn(user) : void 0); - })); - changes.push(content.potion); - return _.sortBy(changes, function(item) { - switch (item.type) { - case 'weapon': - return 1; - case 'armor': - return 2; - case 'head': - return 3; - case 'shield': - return 4; - case 'potion': - return 5; - default: - return 6; - } + }; + 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; +}; + + +/* + Update the in-browser store with new gear. FIXME this was in user.fns, but it was causing strange issues there + */ + +api.updateStore = function(user) { + var changes; + if (!user) { + return; + } + changes = []; + _.each(['weapon', 'armor', 'shield', 'head'], function(type) { + var found; + found = _.find(content.gear.tree[type][user.stats["class"]], function(item) { + return !user.items.gear.owned[item.key]; }); - }; - - /* - ------------------------------------------------------ - Content - ------------------------------------------------------ - */ - - - api.content = content; - - /* - ------------------------------------------------------ - Misc Helpers - ------------------------------------------------------ - */ - - - api.uuid = function() { - return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(c) { - var r, v; - - r = Math.random() * 16 | 0; - v = (c === "x" ? r : r & 0x3 | 0x8); - return v.toString(16); - }); - }; - - api.countExists = function(items) { - return _.reduce(items, (function(m, v) { - return m + (v ? 1 : 0); - }), 0); - }; - - /* - Even though Mongoose handles task defaults, we want to make sure defaults are set on the client-side before - sending up to the server for performance - */ - - - api.taskDefaults = function(task) { - var defaults, _ref, _ref1, _ref2, _ref3; - - if (task == null) { - task = {}; + if (found) { + changes.push(found); } - if (!(task.type && ((_ref = task.type) === 'habit' || _ref === 'daily' || _ref === 'todo' || _ref === 'reward'))) { - task.type = 'habit'; - } - defaults = { - id: api.uuid(), - text: task.id != null ? task.id : '', - notes: '', - priority: 1, - challenge: {}, - attribute: 'str', - dateCreated: new Date() - }; - _.defaults(task, defaults); - if (task.type === 'habit') { - _.defaults(task, { - up: true, - down: true - }); - } - if ((_ref1 = task.type) === 'habit' || _ref1 === 'daily') { - _.defaults(task, { - history: [] - }); - } - if ((_ref2 = task.type) === 'daily' || _ref2 === 'todo') { - _.defaults(task, { - completed: false - }); - } - if (task.type === 'daily') { - _.defaults(task, { - streak: 0, - repeat: { - su: 1, - m: 1, - t: 1, - w: 1, - th: 1, - f: 1, - s: 1 - } - }); - } - task._id = task.id; - if ((_ref3 = task.value) == null) { - task.value = task.type === 'reward' ? 10 : 0; - } - if (!_.isNumber(task.priority)) { - task.priority = 1; - } - return task; - }; - - api.percent = function(x, y, dir) { - var roundFn; - - switch (dir) { - case "up": - roundFn = Math.ceil; - break; - case "down": - roundFn = Math.floor; - break; + return true; + }); + changes = changes.concat(_.filter(content.gear.flat, function(v) { + return v.klass === 'special' && !user.items.gear.owned[v.key] && (typeof v.canOwn === "function" ? v.canOwn(user) : void 0); + })); + changes.push(content.potion); + return _.sortBy(changes, function(item) { + switch (item.type) { + case 'weapon': + return 1; + case 'armor': + return 2; + case 'head': + return 3; + case 'shield': + return 4; + case 'potion': + return 5; default: - roundFn = Math.round; + return 6; } - if (x === 0) { - x = 1; - } - return roundFn(x / y * 100); + }); +}; + + +/* +------------------------------------------------------ +Content +------------------------------------------------------ + */ + +api.content = content; + + +/* +------------------------------------------------------ +Misc Helpers +------------------------------------------------------ + */ + +api.uuid = function() { + return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(c) { + var r, v; + r = Math.random() * 16 | 0; + v = (c === "x" ? r : r & 0x3 | 0x8); + return v.toString(16); + }); +}; + +api.countExists = function(items) { + return _.reduce(items, (function(m, v) { + return m + (v ? 1 : 0); + }), 0); +}; + + +/* +Even though Mongoose handles task defaults, we want to make sure defaults are set on the client-side before +sending up to the server for performance + */ + +api.taskDefaults = function(task) { + var defaults, _ref, _ref1, _ref2; + if (task == null) { + task = {}; + } + if (!(task.type && ((_ref = task.type) === 'habit' || _ref === 'daily' || _ref === 'todo' || _ref === 'reward'))) { + task.type = 'habit'; + } + defaults = { + id: api.uuid(), + text: task.id != null ? task.id : '', + notes: '', + priority: 1, + challenge: {}, + attribute: 'str', + dateCreated: new Date() }; - - /* - Remove whitespace #FIXME are we using this anywwhere? Should we be? - */ - - - api.removeWhitespace = function(str) { - if (!str) { - return ''; - } - return str.replace(/\s/g, ''); - }; - - /* - Encode the download link for .ics iCal file - */ - - - api.encodeiCalLink = 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); - }; - - /* - Gold amount from their money - */ - - - api.gold = function(num) { - if (num) { - return Math.floor(num); - } else { - return "0"; - } - }; - - /* - Silver amount from their money - */ - - - api.silver = function(num) { - if (num) { - return ("0" + Math.floor((num - Math.floor(num)) * 100)).slice(-2); - } else { - return "00"; - } - }; - - /* - Task classes given everything about the class - */ - - - api.taskClasses = function(task, filters, dayStart, lastCron, showCompleted, main) { - var classes, completed, enabled, filter, repeat, type, value, _ref; - - if (filters == null) { - filters = []; - } - if (dayStart == null) { - dayStart = 0; - } - if (lastCron == null) { - lastCron = +(new Date); - } - if (showCompleted == null) { - showCompleted = false; - } - if (main == null) { - main = false; - } - if (!task) { - return; - } - type = task.type, completed = task.completed, value = task.value, repeat = task.repeat; - if ((type === 'todo' && completed !== showCompleted) && main) { - return 'hidden'; - } - if (main) { - for (filter in filters) { - enabled = filters[filter]; - if (enabled && !((_ref = task.tags) != null ? _ref[filter] : void 0)) { - return 'hidden'; - } - } - } - classes = type; - if (type === 'todo' || type === 'daily') { - if (completed || (type === 'daily' && !api.shouldDo(+(new Date), task.repeat, { - dayStart: dayStart - }))) { - classes += " completed"; - } else { - classes += " uncompleted"; - } - } else if (type === 'habit') { - if (task.down && task.up) { - classes += ' habit-wide'; - } - } - if (value < -20) { - classes += ' color-worst'; - } else if (value < -10) { - classes += ' color-worse'; - } else if (value < -1) { - classes += ' color-bad'; - } else if (value < 1) { - classes += ' color-neutral'; - } else if (value < 5) { - classes += ' color-good'; - } else if (value < 10) { - classes += ' color-better'; - } else { - classes += ' color-best'; - } - return classes; - }; - - /* - Friendly timestamp - */ - - - api.friendlyTimestamp = function(timestamp) { - return moment(timestamp).format('MM/DD h:mm:ss a'); - }; - - /* - Does user have new chat messages? - */ - - - api.newChatMessages = function(messages, lastMessageSeen) { - if (!((messages != null ? messages.length : void 0) > 0)) { - return false; - } - return (messages != null ? messages[0] : void 0) && (messages[0].id !== lastMessageSeen); - }; - - /* - are any tags active? - */ - - - api.noTags = function(tags) { - return _.isEmpty(tags) || _.isEmpty(_.filter(tags, function(t) { - return t; - })); - }; - - /* - Are there tags applied? - */ - - - api.appliedTags = 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); + _.defaults(task, defaults); + if (task.type === 'habit') { + _.defaults(task, { + up: true, + down: true + }); + } + if ((_ref1 = task.type) === 'habit' || _ref1 === 'daily') { + _.defaults(task, { + history: [] + }); + } + if ((_ref2 = task.type) === 'daily' || _ref2 === 'todo') { + _.defaults(task, { + completed: false + }); + } + if (task.type === 'daily') { + _.defaults(task, { + streak: 0, + repeat: { + su: 1, + m: 1, + t: 1, + w: 1, + th: 1, + f: 1, + s: 1 } }); - return arr.join(', '); - }; + } + task._id = task.id; + if (task.value == null) { + task.value = task.type === 'reward' ? 10 : 0; + } + if (!_.isNumber(task.priority)) { + task.priority = 1; + } + return task; +}; - api.countPets = function(originalCount, pets) { - var count, pet; +api.percent = 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 roundFn(x / y * 100); +}; - count = originalCount != null ? originalCount : _.size(pets); - for (pet in content.questPets) { - if (pets[pet]) { - count--; + +/* +Remove whitespace #FIXME are we using this anywwhere? Should we be? + */ + +api.removeWhitespace = function(str) { + if (!str) { + return ''; + } + return str.replace(/\s/g, ''); +}; + + +/* +Encode the download link for .ics iCal file + */ + +api.encodeiCalLink = 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); +}; + + +/* +Gold amount from their money + */ + +api.gold = function(num) { + if (num) { + return Math.floor(num); + } else { + return "0"; + } +}; + + +/* +Silver amount from their money + */ + +api.silver = function(num) { + if (num) { + return ("0" + Math.floor((num - Math.floor(num)) * 100)).slice(-2); + } else { + return "00"; + } +}; + + +/* +Task classes given everything about the class + */ + +api.taskClasses = function(task, filters, dayStart, lastCron, showCompleted, main) { + var classes, completed, enabled, filter, repeat, type, value, _ref; + if (filters == null) { + filters = []; + } + if (dayStart == null) { + dayStart = 0; + } + if (lastCron == null) { + lastCron = +(new Date); + } + if (showCompleted == null) { + showCompleted = false; + } + if (main == null) { + main = false; + } + if (!task) { + return; + } + type = task.type, completed = task.completed, value = task.value, repeat = task.repeat; + if ((type === 'todo' && completed !== showCompleted) && main) { + return 'hidden'; + } + if (main) { + for (filter in filters) { + enabled = filters[filter]; + if (enabled && !((_ref = task.tags) != null ? _ref[filter] : void 0)) { + return 'hidden'; } } - for (pet in content.specialPets) { - if (pets[pet]) { - count--; - } + } + classes = type; + if (type === 'todo' || type === 'daily') { + if (completed || (type === 'daily' && !api.shouldDo(+(new Date), task.repeat, { + dayStart: dayStart + }))) { + classes += " completed"; + } else { + classes += " uncompleted"; } - return count; - }; - - api.countMounts = function(originalCount, mounts) { - var count, mount; - - count = originalCount != null ? originalCount : _.size(mounts); - for (mount in content.specialMounts) { - if (mounts[mount]) { - count--; - } + } else if (type === 'habit') { + if (task.down && task.up) { + classes += ' habit-wide'; } - return count; - }; - - /* - ------------------------------------------------------ - User (prototype wrapper to give it ops, helper funcs, and virtuals - ------------------------------------------------------ - */ + } + if (value < -20) { + classes += ' color-worst'; + } else if (value < -10) { + classes += ' color-worse'; + } else if (value < -1) { + classes += ' color-bad'; + } else if (value < 1) { + classes += ' color-neutral'; + } else if (value < 5) { + classes += ' color-good'; + } else if (value < 10) { + classes += ' color-better'; + } else { + classes += ' color-best'; + } + return classes; +}; - /* - User is now wrapped (both on client and server), adding a few new properties: - * getters (_statsComputed, tasks, etc) - * user.fns, which is a bunch of helper functions - These were originally up above, but they make more sense belonging to the user object so we don't have to pass - the user object all over the place. In fact, we should pull in more functions such as cron(), updateStats(), etc. - * user.ops, which is super important: - - If a function is inside user.ops, it has magical properties. If you call it on the client it updates the user object in - the browser and when it's done it automatically POSTs to the server, calling src/controllers/user.js#OP_NAME (the exact same name - of the op function). The first argument req is {query, body, params}, it's what the express controller function - expects. This means we call our functions as if we were calling an Express route. Eg, instead of score(task, direction), - we call score({params:{id:task.id,direction:direction}}). This also forces us to think about our routes (whether to use - params, query, or body for variables). see http://stackoverflow.com/questions/4024271/rest-api-best-practices-where-to-put-parameters - - If `src/controllers/user.js#OP_NAME` doesn't exist on the server, it's automatically added. It runs the code in user.ops.OP_NAME - to update the user model server-side, then performs `user.save()`. You can see this in action for `user.ops.buy`. That - function doesn't exist on the server - so the client calls it, it updates user in the browser, auto-POSTs to server, server - handles it by calling `user.ops.buy` again (to update user on the server), and then saves. We can do this for - everything that doesn't need any code difference from what's in user.ops.OP_NAME for special-handling server-side. If we - *do* need special handling, just add `src/controllers/user.js#OP_NAME` to override the user.ops.OP_NAME, and be - sure to call user.ops.OP_NAME at some point within the overridden function. - - TODO - * Is this the best way to wrap the user object? I thought of using user.prototype, but user is an object not a Function. - user on the server is a Mongoose model, so we can use prototype - but to do it on the client, we'd probably have to - move to $resource for user - * Move to $resource! - */ +/* +Friendly timestamp + */ + +api.friendlyTimestamp = function(timestamp) { + return moment(timestamp).format('MM/DD h:mm:ss a'); +}; - api.wrap = function(user, main) { - if (main == null) { - main = true; - } - if (user._wrapped) { +/* +Does user have new chat messages? + */ + +api.newChatMessages = function(messages, lastMessageSeen) { + if (!((messages != null ? messages.length : void 0) > 0)) { + return false; + } + return (messages != null ? messages[0] : void 0) && (messages[0].id !== lastMessageSeen); +}; + + +/* +are any tags active? + */ + +api.noTags = function(tags) { + return _.isEmpty(tags) || _.isEmpty(_.filter(tags, function(t) { + return t; + })); +}; + + +/* +Are there tags applied? + */ + +api.appliedTags = function(userTags, taskTags) { + var arr; + arr = []; + _.each(userTags, function(t) { + if (t == null) { return; } - user._wrapped = true; - if (main) { - user.ops = { - update: function(req, cb) { - _.each(req.body, function(v, k) { - user.fns.dotSet(k, v); - return true; - }); - return typeof cb === "function" ? cb(null, user) : void 0; - }, - sleep: function(req, cb) { - user.preferences.sleep = !user.preferences.sleep; - return typeof cb === "function" ? cb(null, {}) : void 0; - }, - revive: function(req, cb) { - var item, lostItem, lostStat; - - _.merge(user.stats, { - hp: 50, - exp: 0, - gp: 0 - }); - if (user.stats.lvl > 1) { - user.stats.lvl--; - } - lostStat = user.fns.randomVal(_.reduce(['str', 'con', 'per', 'int'], (function(m, k) { - if (user.stats[k]) { - m[k] = k; - } - return m; - }), {})); - if (lostStat) { - user.stats[lostStat]--; - } - lostItem = user.fns.randomVal(_.reduce(user.items.gear.owned, (function(m, v, k) { - if (v) { - m['' + k] = '' + k; - } - return m; - }), {})); - if (item = content.gear.flat[lostItem]) { - user.items.gear.owned[lostItem] = false; - if (user.items.gear.equipped[item.type] === lostItem) { - user.items.gear.equipped[item.type] = "" + item.type + "_base_0"; - } - if (user.items.gear.costume[item.type] === lostItem) { - user.items.gear.costume[item.type] = "" + item.type + "_base_0"; - } - } - if (typeof user.markModified === "function") { - user.markModified('items.gear'); - } - return typeof cb === "function" ? cb((item ? { - code: 200, - message: "Your " + item.text + " broke." - } : null), user) : void 0; - }, - reset: function(req, cb) { - var gear; - - user.habits = []; - user.dailys = []; - user.todos = []; - user.rewards = []; - user.stats.hp = 50; - user.stats.lvl = 1; - user.stats.gp = 0; - user.stats.exp = 0; - gear = user.items.gear; - _.each(['equipped', 'costume'], function(type) { - gear[type].armor = 'armor_base_0'; - gear[type].weapon = 'weapon_base_0'; - gear[type].head = 'head_base_0'; - return gear[type].shield = 'shield_base_0'; - }); - user.items.gear.owned = { - weapon_warrior_0: true - }; - if (typeof user.markModified === "function") { - user.markModified('items.gear.owned'); - } - user.preferences.costume = false; - return typeof cb === "function" ? cb(null, user) : void 0; - }, - reroll: function(req, cb, ga) { - if (user.balance < 1) { - return typeof cb === "function" ? cb({ - code: 401, - message: "Not enough gems." - }) : void 0; - } - user.balance--; - _.each(user.tasks, function(task) { - if (task.type !== 'reward') { - return task.value = 0; - } - }); - user.stats.hp = 50; - if (typeof cb === "function") { - cb(null, user); - } - return ga != null ? ga.event('purchase', 'reroll').send() : void 0; - }, - rebirth: function(req, cb, ga) { - var flags, gear, lvl, stats; - - if (user.balance < 2) { - return typeof cb === "function" ? cb({ - code: 401, - message: "Not enough gems." - }) : void 0; - } - user.balance -= 2; - lvl = user.stats.lvl; - _.each(user.tasks, function(task) { - if (task.type !== 'reward') { - task.value = 0; - } - if (task.type === 'daily') { - return task.streak = 0; - } - }); - stats = user.stats; - stats.buffs = {}; - stats.hp = 50; - stats.lvl = 1; - stats["class"] = 'warrior'; - _.each(['per', 'int', 'con', 'str', 'points', 'gp', 'exp', 'mp'], function(value) { - return stats[value] = 0; - }); - gear = user.items.gear; - _.each(['equipped', 'costume'], function(type) { - gear[type].armor = 'armor_base_0'; - gear[type].weapon = 'weapon_warrior_0'; - gear[type].head = 'head_base_0'; - return gear[type].shield = 'shield_base_0'; - }); - if (user.items.currentPet) { - user.ops.equip({ - params: { - type: 'pet', - key: user.items.currentPet - } - }); - } - if (user.items.currentMount) { - user.ops.equip({ - params: { - type: 'mount', - key: user.items.currentMount - } - }); - } - _.each(gear.owned, function(v, k) { - if (gear.owned[k]) { - gear.owned[k] = false; - return true; - } - }); - gear.owned.weapon_warrior_0 = true; - if (typeof user.markModified === "function") { - user.markModified('items.gear.owned'); - } - user.preferences.costume = false; - flags = user.flags; - if (!(user.achievements.ultimateGear || user.achievements.beastMaster)) { - flags.rebirthEnabled = false; - } - flags.itemsEnabled = false; - flags.dropsEnabled = false; - flags.classSelected = false; - if (!user.achievements.rebirths) { - user.achievements.rebirths = 1; - user.achievements.rebirthLevel = lvl; - } else if (lvl > user.achievements.rebirthLevel || lvl === 100) { - user.achievements.rebirths++; - user.achievements.rebirthLevel = lvl; - } - if (typeof cb === "function") { - cb(null, user); - } - return ga != null ? ga.event('purchase', 'Rebirth').send() : void 0; - }, - allocateNow: function(req, cb) { - _.times(user.stats.points, user.fns.autoAllocate); - user.stats.points = 0; - if (typeof user.markModified === "function") { - user.markModified('stats'); - } - return typeof cb === "function" ? cb(null, user.stats) : void 0; - }, - clearCompleted: function(req, cb) { - _.remove(user.todos, function(t) { - var _ref; - - return t.completed && !((_ref = t.challenge) != null ? _ref.id : void 0); - }); - if (typeof user.markModified === "function") { - user.markModified('todos'); - } - return typeof cb === "function" ? cb(null, user.todos) : void 0; - }, - sortTask: function(req, cb) { - var from, id, task, tasks, to, _ref; - - id = req.params.id; - _ref = req.query, to = _ref.to, from = _ref.from; - task = user.tasks[id]; - if (!task) { - return typeof cb === "function" ? cb({ - code: 404, - message: "Task not found." - }) : void 0; - } - if (!((to != null) && (from != null))) { - return typeof cb === "function" ? cb('?to=__&from=__ are required') : void 0; - } - tasks = user["" + task.type + "s"]; - tasks.splice(to, 0, tasks.splice(from, 1)[0]); - return typeof cb === "function" ? cb(null, tasks) : void 0; - }, - updateTask: function(req, cb) { - var task, _ref; - - if (!(task = user.tasks[(_ref = req.params) != null ? _ref.id : void 0])) { - return typeof cb === "function" ? cb({ - code: 404, - message: "Task not found" - }) : void 0; - } - _.merge(task, _.omit(req.body, 'checklist')); - if (req.body.checklist) { - task.checklist = req.body.checklist; - } - if (typeof task.markModified === "function") { - task.markModified('tags'); - } - return typeof cb === "function" ? cb(null, task) : void 0; - }, - deleteTask: function(req, cb) { - var i, task, _ref; - - task = user.tasks[(_ref = req.params) != null ? _ref.id : void 0]; - if (!task) { - return typeof cb === "function" ? cb({ - code: 404, - message: 'Task not found' - }) : void 0; - } - i = user[task.type + "s"].indexOf(task); - if (~i) { - user[task.type + "s"].splice(i, 1); - } - return typeof cb === "function" ? cb(null, {}) : void 0; - }, - addTask: function(req, cb) { - var task; - - task = api.taskDefaults(req.body); - user["" + task.type + "s"].unshift(task); - if (user.preferences.newTaskEdit) { - task._editing = true; - } - if (user.preferences.tagsCollapsed) { - task._tags = true; - } - if (user.preferences.advancedCollapsed) { - task._advanced = true; - } - if (typeof cb === "function") { - cb(null, task); - } - return task; - }, - addTag: function(req, cb) { - var _ref; - - if ((_ref = user.tags) == null) { - user.tags = []; - } - user.tags.push({ - name: req.body.name, - id: req.body.id || api.uuid() - }); - return typeof cb === "function" ? cb(null, user.tags) : void 0; - }, - updateTag: function(req, cb) { - var i, tid; - - tid = req.params.id; - i = _.findIndex(user.tags, { - id: tid - }); - if (!~i) { - return typeof cb === "function" ? cb({ - code: 404, - message: 'Tag not found' - }) : void 0; - } - user.tags[i].name = req.body.name; - return typeof cb === "function" ? cb(null, user.tags[i]) : void 0; - }, - deleteTag: function(req, cb) { - var i, tag, tid; - - tid = req.params.id; - i = _.findIndex(user.tags, { - id: tid - }); - if (!~i) { - return typeof cb === "function" ? cb({ - code: 404, - message: 'Tag not found' - }) : void 0; - } - tag = user.tags[i]; - delete user.filters[tag.id]; - user.tags.splice(i, 1); - _.each(user.tasks, function(task) { - return delete task.tags[tag.id]; - }); - _.each(['habits', 'dailys', 'todos', 'rewards'], function(type) { - return typeof user.markModified === "function" ? user.markModified(type) : void 0; - }); - return typeof cb === "function" ? cb(null, user.tags) : void 0; - }, - feed: function(req, cb) { - var egg, evolve, food, message, pet, potion, userPets, _ref, _ref1, _ref2; - - _ref = req.params, pet = _ref.pet, food = _ref.food; - food = content.food[food]; - _ref1 = pet.split('-'), egg = _ref1[0], potion = _ref1[1]; - userPets = user.items.pets; - if (!userPets[pet]) { - return typeof cb === "function" ? cb({ - code: 404, - message: ":pet not found in user.items.pets" - }) : void 0; - } - if (!((_ref2 = user.items.food) != null ? _ref2[food.key] : void 0)) { - return typeof cb === "function" ? cb({ - code: 404, - message: ":food not found in user.items.food" - }) : void 0; - } - if (content.specialPets[pet]) { - return typeof cb === "function" ? cb({ - code: 401, - message: "Can't feed this pet." - }) : void 0; - } - if (user.items.mounts[pet]) { - return typeof cb === "function" ? cb({ - code: 401, - message: "You already have that mount. Try feeding another pet." - }) : void 0; - } - message = ''; - evolve = function() { - userPets[pet] = -1; - user.items.mounts[pet] = true; - if (pet === user.items.currentPet) { - user.items.currentPet = ""; - } - return message = "You have tamed " + egg + ", let's go for a ride!"; - }; - if (food.key === 'Saddle') { - evolve(); - } else { - if (food.target === potion) { - userPets[pet] += 5; - message = "" + egg + " really likes the " + food.text + "!"; - } else { - userPets[pet] += 2; - message = "" + egg + " eats the " + food.text + " but doesn't seem to enjoy it."; - } - if (userPets[pet] >= 50 && !user.items.mounts[pet]) { - evolve(); - } - } - user.items.food[food.key]--; - return typeof cb === "function" ? cb({ - code: 200, - message: message - }, userPets[pet]) : void 0; - }, - purchase: function(req, cb, ga) { - var item, key, type, _ref; - - _ref = req.params, type = _ref.type, key = _ref.key; - if (type !== 'eggs' && type !== 'hatchingPotions' && type !== 'food' && type !== 'quests' && type !== 'special') { - return typeof cb === "function" ? cb({ - code: 404, - message: ":type must be in [hatchingPotions,eggs,food,quests,special]" - }, req) : void 0; - } - item = content[type][key]; - if (!item) { - return typeof cb === "function" ? cb({ - code: 404, - message: ":key not found for Content." + type - }, req) : void 0; - } - if (user.balance < (item.value / 4)) { - return typeof cb === "function" ? cb({ - code: 401, - message: 'Not enough gems.' - }) : void 0; - } - if (!user.items[type][key]) { - user.items[type][key] = 0; - } - user.items[type][key]++; - user.balance -= item.value / 4; - if (typeof cb === "function") { - cb(null, _.pick(user, $w('items balance'))); - } - return ga != null ? ga.event('purchase', key).send() : void 0; - }, - buy: function(req, cb) { - var item, key, message; - - key = req.params.key; - item = key === 'potion' ? content.potion : content.gear.flat[key]; - if (!item) { - return typeof cb === "function" ? cb({ - code: 404, - message: "Item '" + key + " not found (see https://github.com/HabitRPG/habitrpg-shared/blob/develop/script/content.coffee)" - }) : void 0; - } - if (user.stats.gp < item.value) { - return typeof cb === "function" ? cb({ - code: 401, - message: 'Not enough gold.' - }) : void 0; - } - if (item.key === 'potion') { - user.stats.hp += 15; - if (user.stats.hp > 50) { - user.stats.hp = 50; - } - } else { - user.items.gear.equipped[item.type] = item.key; - user.items.gear.owned[item.key] = true; - message = user.fns.handleTwoHanded(item); - if (message == null) { - message = "Bought " + item.text + "."; - } - if (!user.achievements.ultimateGear && item.last) { - user.fns.ultimateGear(); - } - } - user.stats.gp -= item.value; - return typeof cb === "function" ? cb({ - code: 200, - message: message - }, _.pick(user, $w('items achievements stats'))) : void 0; - }, - sell: function(req, cb) { - var key, type, _ref; - - _ref = req.params, key = _ref.key, type = _ref.type; - if (type !== 'eggs' && type !== 'hatchingPotions' && type !== 'food') { - return typeof cb === "function" ? cb({ - code: 404, - message: ":type not found. Must bes in [eggs, hatchingPotions, food]" - }) : void 0; - } - if (!user.items[type][key]) { - return typeof cb === "function" ? cb({ - code: 404, - message: ":key not found for user.items." + type - }) : void 0; - } - user.items[type][key]--; - user.stats.gp += content[type][key].value; - return typeof cb === "function" ? cb(null, _.pick(user, $w('stats items'))) : void 0; - }, - equip: function(req, cb) { - var item, key, message, type, _ref; - - _ref = [req.params.type || 'equipped', req.params.key], type = _ref[0], key = _ref[1]; - switch (type) { - case 'mount': - user.items.currentMount = user.items.currentMount === key ? '' : key; - break; - case 'pet': - user.items.currentPet = user.items.currentPet === key ? '' : key; - break; - case 'costume': - case 'equipped': - item = content.gear.flat[key]; - user.items.gear[type][item.type] = item.key; - message = user.fns.handleTwoHanded(item, type); - } - return typeof cb === "function" ? cb((message ? { - code: 200, - message: message - } : null), user.items) : void 0; - }, - hatch: function(req, cb) { - var egg, hatchingPotion, pet, _ref; - - _ref = req.params, egg = _ref.egg, hatchingPotion = _ref.hatchingPotion; - if (!(egg && hatchingPotion)) { - return typeof cb === "function" ? cb({ - code: 404, - message: "Please specify query.egg & query.hatchingPotion" - }) : void 0; - } - if (!(user.items.eggs[egg] > 0 && user.items.hatchingPotions[hatchingPotion] > 0)) { - return typeof cb === "function" ? cb({ - code: 401, - message: "You're missing either that egg or that potion" - }) : void 0; - } - pet = "" + egg + "-" + hatchingPotion; - if (user.items.pets[pet] && user.items.pets[pet] > 0) { - return typeof cb === "function" ? cb({ - code: 401, - message: "You already have that pet. Try hatching a different combination!" - }) : void 0; - } - user.items.pets[pet] = 5; - user.items.eggs[egg]--; - user.items.hatchingPotions[hatchingPotion]--; - return typeof cb === "function" ? cb({ - code: 200, - message: "Your egg hatched! Visit your stable to equip your pet." - }, user.items) : void 0; - }, - unlock: function(req, cb, ga) { - var alreadyOwns, cost, fullSet, k, path, split, v; - - path = req.query.path; - fullSet = ~path.indexOf(","); - cost = fullSet ? 1.25 : 0.5; - alreadyOwns = !fullSet && user.fns.dotGet("purchased." + path) === true; - if (user.balance < cost && !alreadyOwns) { - return typeof cb === "function" ? cb({ - code: 401, - message: "Not enough gems" - }) : void 0; - } - if (fullSet) { - _.each(path.split(","), function(p) { - user.fns.dotSet("purchased." + p, true); - return true; - }); - } else { - if (alreadyOwns) { - split = path.split('.'); - v = split.pop(); - k = split.join('.'); - user.fns.dotSet("preferences." + k, v); - return typeof cb === "function" ? cb(null, req) : void 0; - } - user.fns.dotSet("purchased." + path, true); - } - user.balance -= cost; - if (typeof user.markModified === "function") { - user.markModified('purchased'); - } - if (typeof cb === "function") { - cb(null, _.pick(user, $w('purchased preferences'))); - } - return ga != null ? ga.event('purchase', path).send() : void 0; - }, - changeClass: function(req, cb, ga) { - var klass, _ref; - - klass = (_ref = req.query) != null ? _ref["class"] : void 0; - if (klass === 'warrior' || klass === 'rogue' || klass === 'wizard' || klass === 'healer') { - user.stats["class"] = klass; - user.flags.classSelected = true; - _.each(["weapon", "armor", "shield", "head"], function(type) { - var foundKey; - - foundKey = false; - _.findLast(user.items.gear.owned, function(v, k) { - if (~k.indexOf(type + "_" + klass) && v === true) { - return foundKey = k; - } - }); - user.items.gear.equipped[type] = foundKey ? foundKey : type === "weapon" ? "weapon_" + klass + "_0" : type === "shield" && klass === "rogue" ? "shield_rogue_0" : "" + type + "_base_0"; - if (type === "weapon" || (type === "shield" && klass === "rogue")) { - user.items.gear.owned["" + type + "_" + klass + "_0"] = true; - } - return true; - }); - } else { - if (user.preferences.disableClasses) { - user.preferences.disableClasses = false; - user.preferences.autoAllocate = false; - } else { - if (!(user.balance >= .75)) { - return typeof cb === "function" ? cb({ - code: 401, - message: "Not enough gems" - }) : void 0; - } - user.balance -= .75; - } - _.merge(user.stats, { - str: 0, - con: 0, - per: 0, - int: 0, - points: user.stats.lvl - }); - user.flags.classSelected = false; - if (ga != null) { - ga.event('purchase', 'changeClass').send(); - } - } - return typeof cb === "function" ? cb(null, _.pick(user, $w('stats flags items preferences'))) : void 0; - }, - disableClasses: function(req, cb) { - user.stats["class"] = 'warrior'; - user.flags.classSelected = true; - user.preferences.disableClasses = true; - user.preferences.autoAllocate = true; - user.stats.str = user.stats.lvl; - user.stats.points = 0; - return typeof cb === "function" ? cb(null, _.pick(user, $w('stats flags preferences'))) : void 0; - }, - allocate: function(req, cb) { - var stat; - - stat = req.query.stat || 'str'; - if (user.stats.points > 0) { - user.stats[stat]++; - user.stats.points--; - if (stat === 'int') { - user.stats.mp++; - } - } - return typeof cb === "function" ? cb(null, _.pick(user, $w('stats'))) : void 0; - }, - readValentine: function(req, cb) { - user.items.special.valentineReceived.shift(); - if (typeof user.markModified === "function") { - user.markModified('items.special.valentineReceived'); - } - return typeof cb === "function" ? cb(null, 'items.special') : void 0; - }, - score: function(req, cb) { - var addPoints, calculateDelta, delta, direction, id, mpDelta, multiplier, num, options, stats, subtractPoints, task, th, _ref, _ref1, _ref2; - - _ref = req.params, id = _ref.id, direction = _ref.direction; - task = user.tasks[id]; - options = req.query || {}; - _.defaults(options, { - times: 1, - cron: false - }); - user._tmp = {}; - stats = { - gp: +user.stats.gp, - hp: +user.stats.hp, - exp: +user.stats.exp - }; - task.value = +task.value; - task.streak = ~~task.streak; - if ((_ref1 = task.priority) == null) { - task.priority = 1; - } - if (task.value > stats.gp && task.type === 'reward') { - return typeof cb === "function" ? cb({ - code: 401, - message: 'Not enough Gold' - }) : void 0; - } - delta = 0; - calculateDelta = function() { - return _.times(options.times, function() { - var adjustAmt, currVal, nextDelta, _ref2, _ref3; - - currVal = task.value < -47.27 ? -47.27 : task.value > 21.27 ? 21.27 : task.value; - nextDelta = Math.pow(0.9747, currVal) * (direction === 'down' ? -1 : 1); - if (((_ref2 = task.checklist) != null ? _ref2.length : void 0) > 0) { - if (direction === 'down' && task.type === 'daily' && options.cron) { - nextDelta *= 1 - _.reduce(task.checklist, (function(m, i) { - return m + (i.completed ? 1 : 0); - }), 0) / task.checklist.length; - } - if (task.type === 'todo' && direction === 'up') { - nextDelta *= 1 + _.reduce(task.checklist, (function(m, i) { - return m + (i.completed ? 1 : 0); - }), 0); - } - } - if (task.type !== 'reward') { - if (user.preferences.automaticAllocation === true && user.preferences.allocationMode === 'taskbased' && !(task.type === 'todo' && direction === 'down')) { - user.stats.training[task.attribute] += nextDelta; - } - adjustAmt = nextDelta; - if (direction === 'up' && task.type !== 'reward' && !(task.type === 'habit' && !task.down)) { - adjustAmt = nextDelta * (1 + user._statsComputed.str * .004); - user.party.quest.progress.up = user.party.quest.progress.up || 0; - if ((_ref3 = task.type) === 'daily' || _ref3 === 'todo') { - user.party.quest.progress.up += adjustAmt; - } - } - task.value += adjustAmt; - } - return delta += nextDelta; - }); - }; - addPoints = function() { - var afterStreak, gpMod, intBonus, perBonus, streakBonus, _crit; - - _crit = user.fns.crit(); - if (_crit > 1) { - user._tmp.crit = _crit; - } - intBonus = 1 + (user._statsComputed.int * .025); - stats.exp += Math.round(delta * intBonus * task.priority * _crit * 6); - perBonus = 1 + user._statsComputed.per * .02; - gpMod = delta * task.priority * _crit * perBonus; - return stats.gp += task.streak ? (streakBonus = task.streak / 100 + 1, afterStreak = gpMod * streakBonus, gpMod > 0 ? user._tmp.streakBonus = afterStreak - gpMod : void 0, afterStreak) : gpMod; - }; - subtractPoints = function() { - var conBonus, hpMod; - - conBonus = 1 - (user._statsComputed.con / 250); - if (conBonus < .1) { - conBonus = 0.1; - } - hpMod = delta * conBonus * task.priority * 2; - return stats.hp += Math.round(hpMod * 10) / 10; - }; - switch (task.type) { - case 'habit': - calculateDelta(); - if (delta > 0) { - addPoints(); - } else { - subtractPoints(); - } - th = ((_ref2 = task.history) != null ? _ref2 : task.history = []); - if (th[th.length - 1] && moment(th[th.length - 1].date).isSame(new Date, 'day')) { - th[th.length - 1].value = task.value; - } else { - th.push({ - date: +(new Date), - value: task.value - }); - } - if (typeof user.markModified === "function") { - user.markModified("habits." + (_.findIndex(user.habits, { - id: task.id - })) + ".history"); - } - break; - case 'daily': - if (options.cron) { - calculateDelta(); - subtractPoints(); - if (!user.stats.buffs.streaks) { - task.streak = 0; - } - } else { - calculateDelta(); - addPoints(); - if (direction === 'up') { - task.streak = task.streak ? task.streak + 1 : 1; - if ((task.streak % 21) === 0) { - user.achievements.streak = user.achievements.streak ? user.achievements.streak + 1 : 1; - } - } else { - if ((task.streak % 21) === 0) { - user.achievements.streak = user.achievements.streak ? user.achievements.streak - 1 : 0; - } - task.streak = task.streak ? task.streak - 1 : 0; - } - } - break; - case 'todo': - if (options.cron) { - calculateDelta(); - } else { - task.dateCompleted = direction === 'up' ? new Date : void 0; - calculateDelta(); - addPoints(); - multiplier = _.max([ - _.reduce(task.checklist, (function(m, i) { - return m + (i.completed ? 1 : 0); - }), 1), 1 - ]); - mpDelta = _.max([multiplier, .01 * user._statsComputed.maxMP * multiplier]); - if (direction === 'down') { - mpDelta *= -1; - } - user.stats.mp += mpDelta; - if (user.stats.mp >= user._statsComputed.maxMP) { - user.stats.mp = user._statsComputed.maxMP; - } - if (user.stats.mp < 0) { - user.stats.mp = 0; - } - } - break; - case 'reward': - calculateDelta(); - stats.gp -= Math.abs(task.value); - num = parseFloat(task.value).toFixed(2); - if (stats.gp < 0) { - stats.hp += stats.gp; - stats.gp = 0; - } - } - user.fns.updateStats(stats); - if (typeof window === 'undefined') { - if (direction === 'up') { - user.fns.randomDrop({ - task: task, - delta: delta - }); - } - } - if (typeof cb === "function") { - cb(null, user); - } - return delta; - } - }; + if (taskTags != null ? taskTags[t.id] : void 0) { + return arr.push(t.name); } - user.fns = { - getItem: function(type) { - var item; + }); + return arr.join(', '); +}; - item = content.gear.flat[user.items.gear.equipped[type]]; - if (!item) { - return content.gear.flat["" + type + "_base_0"]; - } - return item; +api.countPets = function(originalCount, pets) { + var count, pet; + count = originalCount != null ? originalCount : _.size(pets); + for (pet in content.questPets) { + if (pets[pet]) { + count--; + } + } + for (pet in content.specialPets) { + if (pets[pet]) { + count--; + } + } + return count; +}; + +api.countMounts = function(originalCount, mounts) { + var count, mount; + count = originalCount != null ? originalCount : _.size(mounts); + for (mount in content.specialMounts) { + if (mounts[mount]) { + count--; + } + } + return count; +}; + + +/* +------------------------------------------------------ +User (prototype wrapper to give it ops, helper funcs, and virtuals +------------------------------------------------------ + */ + + +/* +User is now wrapped (both on client and server), adding a few new properties: + * getters (_statsComputed, tasks, etc) + * user.fns, which is a bunch of helper functions + These were originally up above, but they make more sense belonging to the user object so we don't have to pass + the user object all over the place. In fact, we should pull in more functions such as cron(), updateStats(), etc. + * user.ops, which is super important: + +If a function is inside user.ops, it has magical properties. If you call it on the client it updates the user object in +the browser and when it's done it automatically POSTs to the server, calling src/controllers/user.js#OP_NAME (the exact same name +of the op function). The first argument req is {query, body, params}, it's what the express controller function +expects. This means we call our functions as if we were calling an Express route. Eg, instead of score(task, direction), +we call score({params:{id:task.id,direction:direction}}). This also forces us to think about our routes (whether to use +params, query, or body for variables). see http://stackoverflow.com/questions/4024271/rest-api-best-practices-where-to-put-parameters + +If `src/controllers/user.js#OP_NAME` doesn't exist on the server, it's automatically added. It runs the code in user.ops.OP_NAME +to update the user model server-side, then performs `user.save()`. You can see this in action for `user.ops.buy`. That +function doesn't exist on the server - so the client calls it, it updates user in the browser, auto-POSTs to server, server +handles it by calling `user.ops.buy` again (to update user on the server), and then saves. We can do this for +everything that doesn't need any code difference from what's in user.ops.OP_NAME for special-handling server-side. If we +*do* need special handling, just add `src/controllers/user.js#OP_NAME` to override the user.ops.OP_NAME, and be +sure to call user.ops.OP_NAME at some point within the overridden function. + +TODO + * Is this the best way to wrap the user object? I thought of using user.prototype, but user is an object not a Function. + user on the server is a Mongoose model, so we can use prototype - but to do it on the client, we'd probably have to + move to $resource for user + * Move to $resource! + */ + +api.wrap = function(user, main) { + if (main == null) { + main = true; + } + if (user._wrapped) { + return; + } + user._wrapped = true; + if (main) { + user.ops = { + update: function(req, cb) { + _.each(req.body, function(v, k) { + user.fns.dotSet(k, v); + return true; + }); + return typeof cb === "function" ? cb(null, user) : void 0; }, - handleTwoHanded: function(item, type) { - var message, weapon, _ref; - - if (type == null) { - type = 'equipped'; - } - if (item.type === "shield" && ((_ref = (weapon = content.gear.flat[user.items.gear[type].weapon])) != null ? _ref.twoHanded : void 0)) { - user.items.gear[type].weapon = 'weapon_base_0'; - message = "" + weapon.text + " is two-handed"; - } - if (item.twoHanded) { - user.items.gear[type].shield = "shield_base_0"; - message = "" + item.text + " is two-handed"; - } - return message; + sleep: function(req, cb) { + user.preferences.sleep = !user.preferences.sleep; + return typeof cb === "function" ? cb(null, {}) : void 0; }, - /* - 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 - */ - - predictableRandom: function(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); + revive: function(req, cb) { + var item, lostItem, lostStat; + _.merge(user.stats, { + hp: 50, + exp: 0, + gp: 0 + }); + if (user.stats.lvl > 1) { + user.stats.lvl--; } - x = Math.sin(seed++) * 10000; - return x - Math.floor(x); - }, - crit: function(stat, chance) { - if (stat == null) { - stat = 'str'; - } - if (chance == null) { - chance = .03; - } - if (user.fns.predictableRandom() <= chance) { - return 1.5 + (.02 * user._statsComputed[stat]); - } else { - return 1; - } - }, - /* - Get a random property from an object - returns random property (the value) - */ - - randomVal: function(obj, options) { - var array, rand; - - array = (options != null ? options.key : void 0) ? _.keys(obj) : _.values(obj); - rand = user.fns.predictableRandom(typeof option !== "undefined" && option !== null ? option.seed : void 0); - return array[Math.floor(rand * array.length)]; - }, - /* - 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. - */ - - dotSet: function(path, val) { - var arr, - _this = this; - - arr = path.split('.'); - return _.reduce(arr, function(curr, next, index) { - var _ref; - - if ((arr.length - 1) === index) { - curr[next] = val; + lostStat = user.fns.randomVal(_.reduce(['str', 'con', 'per', 'int'], (function(m, k) { + if (user.stats[k]) { + m[k] = k; } - return (_ref = curr[next]) != null ? _ref : curr[next] = {}; - }, user); + return m; + }), {})); + if (lostStat) { + user.stats[lostStat]--; + } + lostItem = user.fns.randomVal(_.reduce(user.items.gear.owned, (function(m, v, k) { + if (v) { + m['' + k] = '' + k; + } + return m; + }), {})); + if (item = content.gear.flat[lostItem]) { + user.items.gear.owned[lostItem] = false; + if (user.items.gear.equipped[item.type] === lostItem) { + user.items.gear.equipped[item.type] = "" + item.type + "_base_0"; + } + if (user.items.gear.costume[item.type] === lostItem) { + user.items.gear.costume[item.type] = "" + item.type + "_base_0"; + } + } + if (typeof user.markModified === "function") { + user.markModified('items.gear'); + } + return typeof cb === "function" ? cb((item ? { + code: 200, + message: "Your " + item.text + " broke." + } : null), user) : void 0; }, - dotGet: function(path) { - var _this = this; - - return _.reduce(path.split('.'), (function(curr, next) { - return curr != null ? curr[next] : void 0; - }), user); + reset: function(req, cb) { + var gear; + user.habits = []; + user.dailys = []; + user.todos = []; + user.rewards = []; + user.stats.hp = 50; + user.stats.lvl = 1; + user.stats.gp = 0; + user.stats.exp = 0; + gear = user.items.gear; + _.each(['equipped', 'costume'], function(type) { + gear[type].armor = 'armor_base_0'; + gear[type].weapon = 'weapon_base_0'; + gear[type].head = 'head_base_0'; + return gear[type].shield = 'shield_base_0'; + }); + user.items.gear.owned = { + weapon_warrior_0: true + }; + if (typeof user.markModified === "function") { + user.markModified('items.gear.owned'); + } + user.preferences.costume = false; + return typeof cb === "function" ? cb(null, user) : void 0; }, - randomDrop: function(modifiers) { - var acceptableDrops, bonus, chance, drop, dropK, quest, rarity, task, _base, _base1, _base2, _name, _name1, _name2, _ref, _ref1, _ref2, _ref3, _ref4; - - task = modifiers.task; - bonus = Math.abs(task.value) * task.priority + (task.streak || 0) + (user._statsComputed.per * .5); - bonus /= 100; - chance = api.diminishingReturns(bonus, 1, 0.5); - 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) < bonus) { - dropK = user.fns.randomVal(quest.collect, { - key: true + reroll: function(req, cb, ga) { + if (user.balance < 1) { + return typeof cb === "function" ? cb({ + code: 401, + message: "Not enough gems." + }) : void 0; + } + user.balance--; + _.each(user.tasks, function(task) { + if (task.type !== 'reward') { + return task.value = 0; + } + }); + user.stats.hp = 50; + if (typeof cb === "function") { + cb(null, user); + } + return ga != null ? ga.event('purchase', 'reroll').send() : void 0; + }, + rebirth: function(req, cb, ga) { + var flags, gear, lvl, stats; + if (user.balance < 2) { + return typeof cb === "function" ? cb({ + code: 401, + message: "Not enough gems." + }) : void 0; + } + user.balance -= 2; + lvl = user.stats.lvl; + _.each(user.tasks, function(task) { + if (task.type !== 'reward') { + task.value = 0; + } + if (task.type === 'daily') { + return task.streak = 0; + } + }); + stats = user.stats; + stats.buffs = {}; + stats.hp = 50; + stats.lvl = 1; + stats["class"] = 'warrior'; + _.each(['per', 'int', 'con', 'str', 'points', 'gp', 'exp', 'mp'], function(value) { + return stats[value] = 0; + }); + gear = user.items.gear; + _.each(['equipped', 'costume'], function(type) { + gear[type].armor = 'armor_base_0'; + gear[type].weapon = 'weapon_warrior_0'; + gear[type].head = 'head_base_0'; + return gear[type].shield = 'shield_base_0'; + }); + if (user.items.currentPet) { + user.ops.equip({ + params: { + type: 'pet', + key: user.items.currentPet + } }); - user.party.quest.progress.collect[dropK]++; - if (typeof user.markModified === "function") { - user.markModified('party.quest.progress'); + } + if (user.items.currentMount) { + user.ops.equip({ + params: { + type: 'mount', + key: user.items.currentMount + } + }); + } + _.each(gear.owned, function(v, k) { + if (gear.owned[k]) { + gear.owned[k] = false; + return true; } + }); + gear.owned.weapon_warrior_0 = true; + if (typeof user.markModified === "function") { + user.markModified('items.gear.owned'); } - if ((api.daysSince(user.items.lastDrop.date, user.preferences) === 0) && (user.items.lastDrop.count >= 5)) { - return; + user.preferences.costume = false; + flags = user.flags; + if (!(user.achievements.ultimateGear || user.achievements.beastMaster)) { + flags.rebirthEnabled = false; } - if (((_ref1 = user.flags) != null ? _ref1.dropsEnabled : void 0) && user.fns.predictableRandom(user.stats.exp) < chance) { - rarity = user.fns.predictableRandom(user.stats.gp); - if (rarity > .6) { - drop = user.fns.randomVal(_(content.food).omit('Saddle').where({ - canBuy: true - }).value()); - if ((_ref2 = (_base = user.items.food)[_name = drop.key]) == null) { - _base[_name] = 0; - } - user.items.food[drop.key] += 1; - drop.type = 'Food'; - drop.dialog = "You've found " + drop.article + drop.text + "! " + drop.notes; - } else if (rarity > .3) { - drop = user.fns.randomVal(_.where(content.eggs, { - canBuy: true - })); - if ((_ref3 = (_base1 = user.items.eggs)[_name1 = drop.key]) == null) { - _base1[_name1] = 0; - } - user.items.eggs[drop.key]++; - drop.type = 'Egg'; - drop.dialog = "You've found a " + drop.text + " Egg! " + drop.notes; - } else { - acceptableDrops = rarity < .03 ? ['Golden'] : rarity < .09 ? ['Zombie', 'CottonCandyPink', 'CottonCandyBlue'] : rarity < .18 ? ['Red', 'Shade', 'Skeleton'] : ['Base', 'White', 'Desert']; - drop = user.fns.randomVal(_.pick(content.hatchingPotions, (function(v, k) { - return __indexOf.call(acceptableDrops, k) >= 0; - }))); - if ((_ref4 = (_base2 = user.items.hatchingPotions)[_name2 = drop.key]) == null) { - _base2[_name2] = 0; - } - user.items.hatchingPotions[drop.key]++; - drop.type = 'HatchingPotion'; - drop.dialog = "You've found a " + drop.text + " Hatching Potion! " + drop.notes; - } - user._tmp.drop = drop; - user.items.lastDrop.date = +(new Date); - return user.items.lastDrop.count++; + flags.itemsEnabled = false; + flags.dropsEnabled = false; + flags.classSelected = false; + if (!user.achievements.rebirths) { + user.achievements.rebirths = 1; + user.achievements.rebirthLevel = lvl; + } else if (lvl > user.achievements.rebirthLevel || lvl === 100) { + user.achievements.rebirths++; + user.achievements.rebirthLevel = lvl; } + if (typeof cb === "function") { + cb(null, user); + } + return ga != null ? ga.event('purchase', 'Rebirth').send() : void 0; }, - /* - 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 - */ - - autoAllocate: function() { - return user.stats[(function() { - var diff, ideal, preference, stats, suggested; - - switch (user.preferences.allocationMode) { - case "flat": - stats = _.pick(user.stats, $w('con str per int')); - return _.invert(stats)[_.min(stats)]; - case "classbased": - ideal = [user.stats.lvl / 7 * 3, user.stats.lvl / 7 * 2, user.stats.lvl / 7, user.stats.lvl / 7]; - 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"; - } - })()]++; - }, - updateStats: function(stats) { - var tnl, _base, _base1, _ref, _ref1, _ref2, _ref3; - - if (stats.hp <= 0) { - return user.stats.hp = 0; + allocateNow: function(req, cb) { + _.times(user.stats.points, user.fns.autoAllocate); + user.stats.points = 0; + if (typeof user.markModified === "function") { + user.markModified('stats'); } - user.stats.hp = stats.hp; - user.stats.gp = stats.gp >= 0 ? stats.gp : 0; - tnl = api.tnl(user.stats.lvl); - if (user.stats.lvl >= 100) { - stats.gp += stats.exp / 15; - stats.exp = 0; - user.stats.lvl = 100; + return typeof cb === "function" ? cb(null, user.stats) : void 0; + }, + clearCompleted: function(req, cb) { + _.remove(user.todos, function(t) { + var _ref; + return t.completed && !((_ref = t.challenge) != null ? _ref.id : void 0); + }); + if (typeof user.markModified === "function") { + user.markModified('todos'); + } + return typeof cb === "function" ? cb(null, user.todos) : void 0; + }, + sortTask: function(req, cb) { + var from, id, task, tasks, to, _ref; + id = req.params.id; + _ref = req.query, to = _ref.to, from = _ref.from; + task = user.tasks[id]; + if (!task) { + return typeof cb === "function" ? cb({ + code: 404, + message: "Task not found." + }) : void 0; + } + if (!((to != null) && (from != null))) { + return typeof cb === "function" ? cb('?to=__&from=__ are required') : void 0; + } + tasks = user["" + task.type + "s"]; + tasks.splice(to, 0, tasks.splice(from, 1)[0]); + return typeof cb === "function" ? cb(null, tasks) : void 0; + }, + updateTask: function(req, cb) { + var task, _ref; + if (!(task = user.tasks[(_ref = req.params) != null ? _ref.id : void 0])) { + return typeof cb === "function" ? cb({ + code: 404, + message: "Task not found" + }) : void 0; + } + _.merge(task, _.omit(req.body, 'checklist')); + if (req.body.checklist) { + task.checklist = req.body.checklist; + } + if (typeof task.markModified === "function") { + task.markModified('tags'); + } + return typeof cb === "function" ? cb(null, task) : void 0; + }, + deleteTask: function(req, cb) { + var i, task, _ref; + task = user.tasks[(_ref = req.params) != null ? _ref.id : void 0]; + if (!task) { + return typeof cb === "function" ? cb({ + code: 404, + message: 'Task not found' + }) : void 0; + } + i = user[task.type + "s"].indexOf(task); + if (~i) { + user[task.type + "s"].splice(i, 1); + } + return typeof cb === "function" ? cb(null, {}) : void 0; + }, + addTask: function(req, cb) { + var task; + task = api.taskDefaults(req.body); + user["" + task.type + "s"].unshift(task); + if (user.preferences.newTaskEdit) { + task._editing = true; + } + if (user.preferences.tagsCollapsed) { + task._tags = true; + } + if (user.preferences.advancedCollapsed) { + task._advanced = true; + } + if (typeof cb === "function") { + cb(null, task); + } + return task; + }, + addTag: function(req, cb) { + if (user.tags == null) { + user.tags = []; + } + user.tags.push({ + name: req.body.name, + id: req.body.id || api.uuid() + }); + return typeof cb === "function" ? cb(null, user.tags) : void 0; + }, + updateTag: function(req, cb) { + var i, tid; + tid = req.params.id; + i = _.findIndex(user.tags, { + id: tid + }); + if (!~i) { + return typeof cb === "function" ? cb({ + code: 404, + message: 'Tag not found' + }) : void 0; + } + user.tags[i].name = req.body.name; + return typeof cb === "function" ? cb(null, user.tags[i]) : void 0; + }, + deleteTag: function(req, cb) { + var i, tag, tid; + tid = req.params.id; + i = _.findIndex(user.tags, { + id: tid + }); + if (!~i) { + return typeof cb === "function" ? cb({ + code: 404, + message: 'Tag not found' + }) : void 0; + } + tag = user.tags[i]; + delete user.filters[tag.id]; + user.tags.splice(i, 1); + _.each(user.tasks, function(task) { + return delete task.tags[tag.id]; + }); + _.each(['habits', 'dailys', 'todos', 'rewards'], function(type) { + return typeof user.markModified === "function" ? user.markModified(type) : void 0; + }); + return typeof cb === "function" ? cb(null, user.tags) : void 0; + }, + feed: function(req, cb) { + var egg, evolve, food, message, pet, potion, userPets, _ref, _ref1, _ref2; + _ref = req.params, pet = _ref.pet, food = _ref.food; + food = content.food[food]; + _ref1 = pet.split('-'), egg = _ref1[0], potion = _ref1[1]; + userPets = user.items.pets; + if (!userPets[pet]) { + return typeof cb === "function" ? cb({ + code: 404, + message: ":pet not found in user.items.pets" + }) : void 0; + } + if (!((_ref2 = user.items.food) != null ? _ref2[food.key] : void 0)) { + return typeof cb === "function" ? cb({ + code: 404, + message: ":food not found in user.items.food" + }) : void 0; + } + if (content.specialPets[pet]) { + return typeof cb === "function" ? cb({ + code: 401, + message: "Can't feed this pet." + }) : void 0; + } + if (user.items.mounts[pet]) { + return typeof cb === "function" ? cb({ + code: 401, + message: "You already have that mount. Try feeding another pet." + }) : void 0; + } + message = ''; + evolve = function() { + userPets[pet] = -1; + user.items.mounts[pet] = true; + if (pet === user.items.currentPet) { + user.items.currentPet = ""; + } + return message = "You have tamed " + egg + ", let's go for a ride!"; + }; + if (food.key === 'Saddle') { + evolve(); } else { - if (stats.exp >= tnl) { - user.stats.exp = stats.exp; - while (stats.exp >= tnl && user.stats.lvl < 100) { - stats.exp -= tnl; - user.stats.lvl++; - tnl = api.tnl(user.stats.lvl); - if (user.preferences.automaticAllocation) { - user.fns.autoAllocate(); - } else { - user.stats.points = user.stats.lvl - (user.stats.con + user.stats.str + user.stats.per + user.stats.int); - } - } - if (user.stats.lvl === 100) { - stats.exp = 0; - } + if (food.target === potion) { + userPets[pet] += 5; + message = "" + egg + " really likes the " + food.text + "!"; + } else { + userPets[pet] += 2; + message = "" + egg + " eats the " + food.text + " but doesn't seem to enjoy it."; + } + if (userPets[pet] >= 50 && !user.items.mounts[pet]) { + evolve(); + } + } + user.items.food[food.key]--; + return typeof cb === "function" ? cb({ + code: 200, + message: message + }, userPets[pet]) : void 0; + }, + purchase: function(req, cb, ga) { + var item, key, type, _ref; + _ref = req.params, type = _ref.type, key = _ref.key; + if (type !== 'eggs' && type !== 'hatchingPotions' && type !== 'food' && type !== 'quests' && type !== 'special') { + return typeof cb === "function" ? cb({ + code: 404, + message: ":type must be in [hatchingPotions,eggs,food,quests,special]" + }, req) : void 0; + } + item = content[type][key]; + if (!item) { + return typeof cb === "function" ? cb({ + code: 404, + message: ":key not found for Content." + type + }, req) : void 0; + } + if (user.balance < (item.value / 4)) { + return typeof cb === "function" ? cb({ + code: 401, + message: 'Not enough gems.' + }) : void 0; + } + if (!user.items[type][key]) { + user.items[type][key] = 0; + } + user.items[type][key]++; + user.balance -= item.value / 4; + if (typeof cb === "function") { + cb(null, _.pick(user, $w('items balance'))); + } + return ga != null ? ga.event('purchase', key).send() : void 0; + }, + buy: function(req, cb) { + var item, key, message; + key = req.params.key; + item = key === 'potion' ? content.potion : content.gear.flat[key]; + if (!item) { + return typeof cb === "function" ? cb({ + code: 404, + message: "Item '" + key + " not found (see https://github.com/HabitRPG/habitrpg-shared/blob/develop/script/content.coffee)" + }) : void 0; + } + if (user.stats.gp < item.value) { + return typeof cb === "function" ? cb({ + code: 401, + message: 'Not enough gold.' + }) : void 0; + } + if (item.key === 'potion') { + user.stats.hp += 15; + if (user.stats.hp > 50) { user.stats.hp = 50; } - } - user.stats.exp = stats.exp; - if ((_ref = user.flags) == null) { - user.flags = {}; - } - if (!user.flags.customizationsNotification && (user.stats.exp > 10 || user.stats.lvl > 1)) { - user.flags.customizationsNotification = true; - } - if (!user.flags.itemsEnabled && user.stats.lvl >= 2) { - user.flags.itemsEnabled = true; - } - if (!user.flags.partyEnabled && user.stats.lvl >= 3) { - user.flags.partyEnabled = true; - } - if (!user.flags.dropsEnabled && user.stats.lvl >= 4) { - user.flags.dropsEnabled = true; - if (user.items.eggs["Wolf"] > 0) { - user.items.eggs["Wolf"]++; - } else { - user.items.eggs["Wolf"] = 1; + } else { + user.items.gear.equipped[item.type] = item.key; + user.items.gear.owned[item.key] = true; + message = user.fns.handleTwoHanded(item); + if (message == null) { + message = "Bought " + item.text + "."; + } + if (!user.achievements.ultimateGear && item.last) { + user.fns.ultimateGear(); } } - if (!user.flags.classSelected && user.stats.lvl >= 10) { - user.flags.classSelected; - } - if (!((_ref1 = user.flags.levelDrops) != null ? _ref1.vice1 : void 0) && user.stats.lvl >= 30) { - if ((_ref2 = (_base = user.items.quests).vice1) == null) { - _base.vice1 = 0; - } - user.items.quests.vice1++; - ((_ref3 = (_base1 = user.flags).levelDrops) != null ? _ref3 : _base1.levelDrops = {}).vice1 = true; - if (typeof user.markModified === "function") { - user.markModified('flags.levelDrops'); - } - user._tmp.drop = _.defaults(content.quests.vice1, { - type: 'Quest', - dialog: "You've found the quest \"" + content.quests.vice1.text + "\"!" - }); - } - if (!user.flags.rebirthEnabled && (user.stats.lvl >= 50 || user.achievements.ultimateGear || user.achievements.beastMaster)) { - return user.flags.rebirthEnabled = true; - } + user.stats.gp -= item.value; + return typeof cb === "function" ? cb({ + code: 200, + message: message + }, _.pick(user, $w('items achievements stats'))) : void 0; }, - /* - ------------------------------------------------------ - 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} - */ - - cron: function(options) { - var clearBuffs, daysMissed, expTally, lvl, lvlDiv2, now, perfect, progress, todoTally, _base, _base1, _base2, _base3, _progress, _ref, _ref1, _ref2, _ref3, _ref4; - - if (options == null) { - options = {}; + sell: function(req, cb) { + var key, type, _ref; + _ref = req.params, key = _ref.key, type = _ref.type; + if (type !== 'eggs' && type !== 'hatchingPotions' && type !== 'food') { + return typeof cb === "function" ? cb({ + code: 404, + message: ":type not found. Must bes in [eggs, hatchingPotions, food]" + }) : void 0; } - now = +options.now || +(new Date); - daysMissed = api.daysSince(user.lastCron, _.defaults({ - now: now - }, user.preferences)); - if (!(daysMissed > 0)) { - return; + if (!user.items[type][key]) { + return typeof cb === "function" ? cb({ + code: 404, + message: ":key not found for user.items." + type + }) : void 0; } - user.auth.timestamps.loggedin = new Date(); - user.lastCron = now; - if (user.items.lastDrop.count > 0) { - user.items.lastDrop.count = 0; + user.items[type][key]--; + user.stats.gp += content[type][key].value; + return typeof cb === "function" ? cb(null, _.pick(user, $w('stats items'))) : void 0; + }, + equip: function(req, cb) { + var item, key, message, type, _ref; + _ref = [req.params.type || 'equipped', req.params.key], type = _ref[0], key = _ref[1]; + switch (type) { + case 'mount': + user.items.currentMount = user.items.currentMount === key ? '' : key; + break; + case 'pet': + user.items.currentPet = user.items.currentPet === key ? '' : key; + break; + case 'costume': + case 'equipped': + item = content.gear.flat[key]; + user.items.gear[type][item.type] = item.key; + message = user.fns.handleTwoHanded(item, type); } - user.stats.mp += _.max([10, .1 * user._statsComputed.maxMP]); - if (user.stats.mp > user._statsComputed.maxMP) { - user.stats.mp = user._statsComputed.maxMP; + return typeof cb === "function" ? cb((message ? { + code: 200, + message: message + } : null), user.items) : void 0; + }, + hatch: function(req, cb) { + var egg, hatchingPotion, pet, _ref; + _ref = req.params, egg = _ref.egg, hatchingPotion = _ref.hatchingPotion; + if (!(egg && hatchingPotion)) { + return typeof cb === "function" ? cb({ + code: 404, + message: "Please specify query.egg & query.hatchingPotion" + }) : void 0; } - perfect = true; - clearBuffs = { - str: 0, - int: 0, - per: 0, - con: 0, - stealth: 0, - streaks: false + if (!(user.items.eggs[egg] > 0 && user.items.hatchingPotions[hatchingPotion] > 0)) { + return typeof cb === "function" ? cb({ + code: 401, + message: "You're missing either that egg or that potion" + }) : void 0; + } + pet = "" + egg + "-" + hatchingPotion; + if (user.items.pets[pet] && user.items.pets[pet] > 0) { + return typeof cb === "function" ? cb({ + code: 401, + message: "You already have that pet. Try hatching a different combination!" + }) : void 0; + } + user.items.pets[pet] = 5; + user.items.eggs[egg]--; + user.items.hatchingPotions[hatchingPotion]--; + return typeof cb === "function" ? cb({ + code: 200, + message: "Your egg hatched! Visit your stable to equip your pet." + }, user.items) : void 0; + }, + unlock: function(req, cb, ga) { + var alreadyOwns, cost, fullSet, k, path, split, v; + path = req.query.path; + fullSet = ~path.indexOf(","); + cost = fullSet ? 1.25 : 0.5; + alreadyOwns = !fullSet && user.fns.dotGet("purchased." + path) === true; + if (user.balance < cost && !alreadyOwns) { + return typeof cb === "function" ? cb({ + code: 401, + message: "Not enough gems" + }) : void 0; + } + if (fullSet) { + _.each(path.split(","), function(p) { + user.fns.dotSet("purchased." + p, true); + return true; + }); + } else { + if (alreadyOwns) { + split = path.split('.'); + v = split.pop(); + k = split.join('.'); + user.fns.dotSet("preferences." + k, v); + return typeof cb === "function" ? cb(null, req) : void 0; + } + user.fns.dotSet("purchased." + path, true); + } + user.balance -= cost; + if (typeof user.markModified === "function") { + user.markModified('purchased'); + } + if (typeof cb === "function") { + cb(null, _.pick(user, $w('purchased preferences'))); + } + return ga != null ? ga.event('purchase', path).send() : void 0; + }, + changeClass: function(req, cb, ga) { + var klass, _ref; + klass = (_ref = req.query) != null ? _ref["class"] : void 0; + if (klass === 'warrior' || klass === 'rogue' || klass === 'wizard' || klass === 'healer') { + user.stats["class"] = klass; + user.flags.classSelected = true; + _.each(["weapon", "armor", "shield", "head"], function(type) { + var foundKey; + foundKey = false; + _.findLast(user.items.gear.owned, function(v, k) { + if (~k.indexOf(type + "_" + klass) && v === true) { + return foundKey = k; + } + }); + user.items.gear.equipped[type] = foundKey ? foundKey : type === "weapon" ? "weapon_" + klass + "_0" : type === "shield" && klass === "rogue" ? "shield_rogue_0" : "" + type + "_base_0"; + if (type === "weapon" || (type === "shield" && klass === "rogue")) { + user.items.gear.owned["" + type + "_" + klass + "_0"] = true; + } + return true; + }); + } else { + if (user.preferences.disableClasses) { + user.preferences.disableClasses = false; + user.preferences.autoAllocate = false; + } else { + if (!(user.balance >= .75)) { + return typeof cb === "function" ? cb({ + code: 401, + message: "Not enough gems" + }) : void 0; + } + user.balance -= .75; + } + _.merge(user.stats, { + str: 0, + con: 0, + per: 0, + int: 0, + points: user.stats.lvl + }); + user.flags.classSelected = false; + if (ga != null) { + ga.event('purchase', 'changeClass').send(); + } + } + return typeof cb === "function" ? cb(null, _.pick(user, $w('stats flags items preferences'))) : void 0; + }, + disableClasses: function(req, cb) { + user.stats["class"] = 'warrior'; + user.flags.classSelected = true; + user.preferences.disableClasses = true; + user.preferences.autoAllocate = true; + user.stats.str = user.stats.lvl; + user.stats.points = 0; + return typeof cb === "function" ? cb(null, _.pick(user, $w('stats flags preferences'))) : void 0; + }, + allocate: function(req, cb) { + var stat; + stat = req.query.stat || 'str'; + if (user.stats.points > 0) { + user.stats[stat]++; + user.stats.points--; + if (stat === 'int') { + user.stats.mp++; + } + } + return typeof cb === "function" ? cb(null, _.pick(user, $w('stats'))) : void 0; + }, + readValentine: function(req, cb) { + user.items.special.valentineReceived.shift(); + if (typeof user.markModified === "function") { + user.markModified('items.special.valentineReceived'); + } + return typeof cb === "function" ? cb(null, 'items.special') : void 0; + }, + score: function(req, cb) { + var addPoints, calculateDelta, delta, direction, id, mpDelta, multiplier, num, options, stats, subtractPoints, task, th, _ref; + _ref = req.params, id = _ref.id, direction = _ref.direction; + task = user.tasks[id]; + options = req.query || {}; + _.defaults(options, { + times: 1, + cron: false + }); + user._tmp = {}; + stats = { + gp: +user.stats.gp, + hp: +user.stats.hp, + exp: +user.stats.exp }; - if (user.preferences.sleep === true) { - user.stats.buffs = clearBuffs; - return; + task.value = +task.value; + task.streak = ~~task.streak; + if (task.priority == null) { + task.priority = 1; } - todoTally = 0; - if ((_ref = (_base = user.party.quest.progress).down) == null) { - _base.down = 0; + if (task.value > stats.gp && task.type === 'reward') { + return typeof cb === "function" ? cb({ + code: 401, + message: 'Not enough Gold' + }) : void 0; } - user.todos.concat(user.dailys).forEach(function(task) { - var absVal, completed, delta, id, repeat, scheduleMisses, type, _ref1; - - if (!task) { - return; - } - id = task.id, type = task.type, completed = task.completed, repeat = task.repeat; - if ((type === 'daily') && !completed && user.stats.buffs.stealth && user.stats.buffs.stealth--) { - return; - } - if (!completed) { - scheduleMisses = daysMissed; - if ((type === 'daily') && repeat) { - scheduleMisses = 0; - _.times(daysMissed, function(n) { - var thatDay; - - thatDay = moment(now).subtract('days', n + 1); - if (api.shouldDo(thatDay, repeat, user.preferences)) { - return scheduleMisses++; - } - }); - } - if (scheduleMisses > 0) { - if (type === 'daily') { - perfect = false; + delta = 0; + calculateDelta = function() { + return _.times(options.times, function() { + var adjustAmt, currVal, nextDelta, _ref1, _ref2; + currVal = task.value < -47.27 ? -47.27 : task.value > 21.27 ? 21.27 : task.value; + nextDelta = Math.pow(0.9747, currVal) * (direction === 'down' ? -1 : 1); + if (((_ref1 = task.checklist) != null ? _ref1.length : void 0) > 0) { + if (direction === 'down' && task.type === 'daily' && options.cron) { + nextDelta *= 1 - _.reduce(task.checklist, (function(m, i) { + return m + (i.completed ? 1 : 0); + }), 0) / task.checklist.length; } - delta = user.ops.score({ - params: { - id: task.id, - direction: 'down' - }, - query: { - times: scheduleMisses, - cron: true - } - }); - if (type === 'daily') { - user.party.quest.progress.down += delta; + if (task.type === 'todo' && direction === 'up') { + nextDelta *= 1 + _.reduce(task.checklist, (function(m, i) { + return m + (i.completed ? 1 : 0); + }), 0); } } + if (task.type !== 'reward') { + if (user.preferences.automaticAllocation === true && user.preferences.allocationMode === 'taskbased' && !(task.type === 'todo' && direction === 'down')) { + user.stats.training[task.attribute] += nextDelta; + } + adjustAmt = nextDelta; + if (direction === 'up' && task.type !== 'reward' && !(task.type === 'habit' && !task.down)) { + adjustAmt = nextDelta * (1 + user._statsComputed.str * .004); + user.party.quest.progress.up = user.party.quest.progress.up || 0; + if ((_ref2 = task.type) === 'daily' || _ref2 === 'todo') { + user.party.quest.progress.up += adjustAmt; + } + } + task.value += adjustAmt; + } + return delta += nextDelta; + }); + }; + addPoints = function() { + var afterStreak, gpMod, intBonus, perBonus, streakBonus, _crit; + _crit = user.fns.crit(); + if (_crit > 1) { + user._tmp.crit = _crit; } - switch (type) { - case 'daily': - ((_ref1 = task.history) != null ? _ref1 : task.history = []).push({ + intBonus = 1 + (user._statsComputed.int * .025); + stats.exp += Math.round(delta * intBonus * task.priority * _crit * 6); + perBonus = 1 + user._statsComputed.per * .02; + gpMod = delta * task.priority * _crit * perBonus; + return stats.gp += task.streak ? (streakBonus = task.streak / 100 + 1, afterStreak = gpMod * streakBonus, gpMod > 0 ? user._tmp.streakBonus = afterStreak - gpMod : void 0, afterStreak) : gpMod; + }; + subtractPoints = function() { + var conBonus, hpMod; + conBonus = 1 - (user._statsComputed.con / 250); + if (conBonus < .1) { + conBonus = 0.1; + } + hpMod = delta * conBonus * task.priority * 2; + return stats.hp += Math.round(hpMod * 10) / 10; + }; + switch (task.type) { + case 'habit': + calculateDelta(); + if (delta > 0) { + addPoints(); + } else { + subtractPoints(); + } + th = (task.history != null ? task.history : task.history = []); + if (th[th.length - 1] && moment(th[th.length - 1].date).isSame(new Date, 'day')) { + th[th.length - 1].value = task.value; + } else { + th.push({ date: +(new Date), value: task.value }); - task.completed = false; - return _.each(task.checklist, (function(i) { - i.completed = false; - return true; - })); - case 'todo': - absVal = completed ? Math.abs(task.value) : task.value; - return todoTally += absVal; - } - }); - 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; } + if (typeof user.markModified === "function") { + user.markModified("habits." + (_.findIndex(user.habits, { + id: task.id + })) + ".history"); + } + break; + case 'daily': + if (options.cron) { + calculateDelta(); + subtractPoints(); + if (!user.stats.buffs.streaks) { + task.streak = 0; + } + } else { + calculateDelta(); + addPoints(); + if (direction === 'up') { + task.streak = task.streak ? task.streak + 1 : 1; + if ((task.streak % 21) === 0) { + user.achievements.streak = user.achievements.streak ? user.achievements.streak + 1 : 1; + } + } else { + if ((task.streak % 21) === 0) { + user.achievements.streak = user.achievements.streak ? user.achievements.streak - 1 : 0; + } + task.streak = task.streak ? task.streak - 1 : 0; + } + } + break; + case 'todo': + if (options.cron) { + calculateDelta(); + } else { + task.dateCompleted = direction === 'up' ? new Date : void 0; + calculateDelta(); + addPoints(); + multiplier = _.max([ + _.reduce(task.checklist, (function(m, i) { + return m + (i.completed ? 1 : 0); + }), 1), 1 + ]); + mpDelta = _.max([multiplier, .01 * user._statsComputed.maxMP * multiplier]); + if (direction === 'down') { + mpDelta *= -1; + } + user.stats.mp += mpDelta; + if (user.stats.mp >= user._statsComputed.maxMP) { + user.stats.mp = user._statsComputed.maxMP; + } + if (user.stats.mp < 0) { + user.stats.mp = 0; + } + } + break; + case 'reward': + calculateDelta(); + stats.gp -= Math.abs(task.value); + num = parseFloat(task.value).toFixed(2); + if (stats.gp < 0) { + stats.hp += stats.gp; + stats.gp = 0; + } + } + user.fns.updateStats(stats); + if (typeof window === 'undefined') { + if (direction === 'up') { + user.fns.randomDrop({ + task: task, + delta: delta + }); } - }); - ((_ref1 = (_base1 = ((_ref2 = user.history) != null ? _ref2 : user.history = {})).todos) != null ? _ref1 : _base1.todos = []).push({ - date: now, - value: todoTally - }); - expTally = user.stats.exp; - lvl = 0; - while (lvl < (user.stats.lvl - 1)) { - lvl++; - expTally += api.tnl(lvl); } - ((_ref3 = (_base2 = user.history).exp) != null ? _ref3 : _base2.exp = []).push({ - date: now, - value: expTally - }); - user.fns.preenUserHistory(); - if (typeof user.markModified === "function") { - user.markModified('history'); + if (typeof cb === "function") { + cb(null, user); } - if (typeof user.markModified === "function") { - user.markModified('dailys'); - } - user.stats.buffs = perfect ? ((_ref4 = (_base3 = user.achievements).perfect) != null ? _ref4 : _base3.perfect = 0, user.achievements.perfect++, lvlDiv2 = Math.ceil(user.stats.lvl / 2), { - str: lvlDiv2, - int: lvlDiv2, - per: lvlDiv2, - con: lvlDiv2, - stealth: 0, - streaks: false - }) : clearBuffs; - 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; - })); - return _progress; - }, - preenUserHistory: function(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); - } - }, - ultimateGear: function() { - var gear, lastGearClassTypeMatrix, ownedLastGear, shouldGrant; - - gear = typeof window !== "undefined" && window !== null ? user.items.gear.owned : user.items.gear.owned.toObject(); - ownedLastGear = _.chain(content.gear.flat).pick(_.keys(gear)).values().filter(function(gear) { - return gear.last; - }); - lastGearClassTypeMatrix = {}; - _.each(content.classes, function(klass) { - lastGearClassTypeMatrix[klass] = {}; - return _.each(content.gearTypes, function(type) { - lastGearClassTypeMatrix[klass][type] = false; - return true; - }); - }); - ownedLastGear.each(function(gear) { - if (gear.twoHanded) { - lastGearClassTypeMatrix[gear.klass]["shield"] = true; - } - return lastGearClassTypeMatrix[gear.klass][gear.type] = true; - }); - shouldGrant = _(lastGearClassTypeMatrix).values().reduce((function(ans, klass) { - return ans || _(klass).values().reduce((function(ans, gearType) { - return ans && gearType; - }), true); - }), false).valueOf(); - return user.achievements.ultimateGear = shouldGrant; + return delta; } }; - Object.defineProperty(user, '_statsComputed', { - get: function() { - var computed, - _this = this; + } + user.fns = { + getItem: function(type) { + var item; + item = content.gear.flat[user.items.gear.equipped[type]]; + if (!item) { + return content.gear.flat["" + type + "_base_0"]; + } + return item; + }, + handleTwoHanded: function(item, type) { + var message, weapon, _ref; + if (type == null) { + type = 'equipped'; + } + if (item.type === "shield" && ((_ref = (weapon = content.gear.flat[user.items.gear[type].weapon])) != null ? _ref.twoHanded : void 0)) { + user.items.gear[type].weapon = 'weapon_base_0'; + message = "" + weapon.text + " is two-handed"; + } + if (item.twoHanded) { + user.items.gear[type].shield = "shield_base_0"; + message = "" + item.text + " is two-handed"; + } + return message; + }, - computed = _.reduce(['per', 'con', 'str', 'int'], function(m, stat) { + /* + 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 + */ + predictableRandom: function(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); + }, + crit: function(stat, chance) { + if (stat == null) { + stat = 'str'; + } + if (chance == null) { + chance = .03; + } + if (user.fns.predictableRandom() <= chance) { + return 1.5 + (.02 * user._statsComputed[stat]); + } else { + return 1; + } + }, + + /* + Get a random property from an object + returns random property (the value) + */ + randomVal: function(obj, options) { + var array, rand; + array = (options != null ? options.key : void 0) ? _.keys(obj) : _.values(obj); + rand = user.fns.predictableRandom(typeof option !== "undefined" && option !== null ? option.seed : void 0); + return array[Math.floor(rand * array.length)]; + }, + + /* + 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. + */ + dotSet: function(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), user); + }, + dotGet: function(path) { + return _.reduce(path.split('.'), ((function(_this) { + return function(curr, next) { + return curr != null ? curr[next] : void 0; + }; + })(this)), user); + }, + randomDrop: function(modifiers) { + var acceptableDrops, bonus, chance, drop, dropK, quest, rarity, task, _base, _base1, _base2, _name, _name1, _name2, _ref, _ref1; + task = modifiers.task; + bonus = Math.abs(task.value) * task.priority + (task.streak || 0) + (user._statsComputed.per * .5); + bonus /= 100; + chance = api.diminishingReturns(bonus, 1, 0.5); + 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) < bonus) { + dropK = user.fns.randomVal(quest.collect, { + key: true + }); + user.party.quest.progress.collect[dropK]++; + if (typeof user.markModified === "function") { + user.markModified('party.quest.progress'); + } + } + if ((api.daysSince(user.items.lastDrop.date, user.preferences) === 0) && (user.items.lastDrop.count >= 5)) { + return; + } + if (((_ref1 = user.flags) != null ? _ref1.dropsEnabled : void 0) && user.fns.predictableRandom(user.stats.exp) < chance) { + rarity = user.fns.predictableRandom(user.stats.gp); + if (rarity > .6) { + drop = user.fns.randomVal(_(content.food).omit('Saddle').where({ + canBuy: true + }).value()); + if ((_base = user.items.food)[_name = drop.key] == null) { + _base[_name] = 0; + } + user.items.food[drop.key] += 1; + drop.type = 'Food'; + drop.dialog = "You've found " + drop.article + drop.text + "! " + drop.notes; + } else if (rarity > .3) { + drop = user.fns.randomVal(_.where(content.eggs, { + canBuy: true + })); + if ((_base1 = user.items.eggs)[_name1 = drop.key] == null) { + _base1[_name1] = 0; + } + user.items.eggs[drop.key]++; + drop.type = 'Egg'; + drop.dialog = "You've found a " + drop.text + " Egg! " + drop.notes; + } else { + acceptableDrops = rarity < .03 ? ['Golden'] : rarity < .09 ? ['Zombie', 'CottonCandyPink', 'CottonCandyBlue'] : rarity < .18 ? ['Red', 'Shade', 'Skeleton'] : ['Base', 'White', 'Desert']; + drop = user.fns.randomVal(_.pick(content.hatchingPotions, (function(v, k) { + return __indexOf.call(acceptableDrops, k) >= 0; + }))); + if ((_base2 = user.items.hatchingPotions)[_name2 = drop.key] == null) { + _base2[_name2] = 0; + } + user.items.hatchingPotions[drop.key]++; + drop.type = 'HatchingPotion'; + drop.dialog = "You've found a " + drop.text + " Hatching Potion! " + drop.notes; + } + user._tmp.drop = drop; + user.items.lastDrop.date = +(new Date); + return user.items.lastDrop.count++; + } + }, + + /* + 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 + */ + autoAllocate: function() { + return user.stats[(function() { + var diff, ideal, preference, stats, suggested; + switch (user.preferences.allocationMode) { + case "flat": + stats = _.pick(user.stats, $w('con str per int')); + return _.invert(stats)[_.min(stats)]; + case "classbased": + ideal = [user.stats.lvl / 7 * 3, user.stats.lvl / 7 * 2, user.stats.lvl / 7, user.stats.lvl / 7]; + 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"; + } + })()]++; + }, + updateStats: function(stats) { + var tnl, _base, _base1, _ref; + if (stats.hp <= 0) { + return user.stats.hp = 0; + } + user.stats.hp = stats.hp; + user.stats.gp = stats.gp >= 0 ? stats.gp : 0; + tnl = api.tnl(user.stats.lvl); + if (user.stats.lvl >= 100) { + stats.gp += stats.exp / 15; + stats.exp = 0; + user.stats.lvl = 100; + } else { + if (stats.exp >= tnl) { + user.stats.exp = stats.exp; + while (stats.exp >= tnl && user.stats.lvl < 100) { + stats.exp -= tnl; + user.stats.lvl++; + tnl = api.tnl(user.stats.lvl); + if (user.preferences.automaticAllocation) { + user.fns.autoAllocate(); + } else { + user.stats.points = user.stats.lvl - (user.stats.con + user.stats.str + user.stats.per + user.stats.int); + } + } + if (user.stats.lvl === 100) { + stats.exp = 0; + } + user.stats.hp = 50; + } + } + user.stats.exp = stats.exp; + if (user.flags == null) { + user.flags = {}; + } + if (!user.flags.customizationsNotification && (user.stats.exp > 10 || user.stats.lvl > 1)) { + user.flags.customizationsNotification = true; + } + if (!user.flags.itemsEnabled && user.stats.lvl >= 2) { + user.flags.itemsEnabled = true; + } + if (!user.flags.partyEnabled && user.stats.lvl >= 3) { + user.flags.partyEnabled = true; + } + if (!user.flags.dropsEnabled && user.stats.lvl >= 4) { + 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; + } + if (!((_ref = user.flags.levelDrops) != null ? _ref.vice1 : void 0) && user.stats.lvl >= 30) { + if ((_base = user.items.quests).vice1 == null) { + _base.vice1 = 0; + } + user.items.quests.vice1++; + ((_base1 = user.flags).levelDrops != null ? _base1.levelDrops : _base1.levelDrops = {}).vice1 = true; + if (typeof user.markModified === "function") { + user.markModified('flags.levelDrops'); + } + user._tmp.drop = _.defaults(content.quests.vice1, { + type: 'Quest', + dialog: "You've found the quest \"" + content.quests.vice1.text + "\"!" + }); + } + if (!user.flags.rebirthEnabled && (user.stats.lvl >= 50 || user.achievements.ultimateGear || user.achievements.beastMaster)) { + return user.flags.rebirthEnabled = true; + } + }, + + /* + ------------------------------------------------------ + 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} + */ + cron: function(options) { + var clearBuffs, daysMissed, expTally, lvl, lvlDiv2, now, perfect, progress, todoTally, _base, _base1, _base2, _base3, _progress; + if (options == null) { + options = {}; + } + now = +options.now || +(new Date); + daysMissed = api.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; + } + user.stats.mp += _.max([10, .1 * user._statsComputed.maxMP]); + if (user.stats.mp > user._statsComputed.maxMP) { + user.stats.mp = user._statsComputed.maxMP; + } + perfect = true; + clearBuffs = { + str: 0, + int: 0, + per: 0, + con: 0, + stealth: 0, + streaks: false + }; + if (user.preferences.sleep === true) { + user.stats.buffs = clearBuffs; + return; + } + todoTally = 0; + if ((_base = user.party.quest.progress).down == null) { + _base.down = 0; + } + user.todos.concat(user.dailys).forEach(function(task) { + var absVal, completed, delta, id, repeat, scheduleMisses, type; + if (!task) { + return; + } + id = task.id, type = task.type, completed = task.completed, repeat = task.repeat; + if ((type === 'daily') && !completed && user.stats.buffs.stealth && user.stats.buffs.stealth--) { + return; + } + if (!completed) { + scheduleMisses = daysMissed; + if ((type === 'daily') && repeat) { + scheduleMisses = 0; + _.times(daysMissed, function(n) { + var thatDay; + thatDay = moment(now).subtract('days', n + 1); + if (api.shouldDo(thatDay, repeat, user.preferences)) { + return scheduleMisses++; + } + }); + } + if (scheduleMisses > 0) { + if (type === 'daily') { + perfect = false; + } + delta = user.ops.score({ + params: { + id: task.id, + direction: 'down' + }, + query: { + times: scheduleMisses, + cron: true + } + }); + if (type === 'daily') { + user.party.quest.progress.down += delta; + } + } + } + switch (type) { + case 'daily': + (task.history != null ? task.history : task.history = []).push({ + date: +(new Date), + value: task.value + }); + task.completed = false; + return _.each(task.checklist, (function(i) { + i.completed = false; + return true; + })); + case 'todo': + absVal = completed ? Math.abs(task.value) : task.value; + return todoTally += absVal; + } + }); + 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 += api.tnl(lvl); + } + ((_base2 = user.history).exp != null ? _base2.exp : _base2.exp = []).push({ + date: now, + value: expTally + }); + 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(user.stats.lvl / 2), { + str: lvlDiv2, + int: lvlDiv2, + per: lvlDiv2, + con: lvlDiv2, + stealth: 0, + streaks: false + }) : clearBuffs; + 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; + })); + return _progress; + }, + preenUserHistory: function(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); + } + }, + ultimateGear: function() { + var gear, lastGearClassTypeMatrix, ownedLastGear, shouldGrant; + gear = typeof window !== "undefined" && window !== null ? user.items.gear.owned : user.items.gear.owned.toObject(); + ownedLastGear = _.chain(content.gear.flat).pick(_.keys(gear)).values().filter(function(gear) { + return gear.last; + }); + lastGearClassTypeMatrix = {}; + _.each(content.classes, function(klass) { + lastGearClassTypeMatrix[klass] = {}; + return _.each(content.gearTypes, function(type) { + lastGearClassTypeMatrix[klass][type] = false; + return true; + }); + }); + ownedLastGear.each(function(gear) { + if (gear.twoHanded) { + lastGearClassTypeMatrix[gear.klass]["shield"] = true; + } + return lastGearClassTypeMatrix[gear.klass][gear.type] = true; + }); + shouldGrant = _(lastGearClassTypeMatrix).values().reduce((function(ans, klass) { + return ans || _(klass).values().reduce((function(ans, gearType) { + return ans && gearType; + }), true); + }), false).valueOf(); + return user.achievements.ultimateGear = shouldGrant; + } + }; + Object.defineProperty(user, '_statsComputed', { + get: function() { + var computed; + computed = _.reduce(['per', 'con', 'str', 'int'], (function(_this) { + return function(m, stat) { m[stat] = _.reduce($w('stats stats.buffs items.gear.equipped.weapon items.gear.equipped.armor items.gear.equipped.head items.gear.equipped.shield'), function(m2, path) { var item, val; - val = user.fns.dotGet(path); return m2 + (~path.indexOf('items.gear') ? (item = content.gear.flat[val], (+(item != null ? item[stat] : void 0) || 0) * ((item != null ? item.klass : void 0) === user.stats["class"] ? 1.5 : 1)) : +val[stat] || 0); }, 0); m[stat] += (user.stats.lvl - 1) / 2; return m; - }, {}); - computed.maxMP = computed.int * 2 + 30; - return computed; - } - }); - return Object.defineProperty(user, 'tasks', { - get: function() { - var tasks; - - tasks = user.habits.concat(user.dailys).concat(user.todos).concat(user.rewards); - return _.object(_.pluck(tasks, "id"), tasks); - } - }); - }; - -}).call(this); + }; + })(this), {}); + computed.maxMP = computed.int * 2 + 30; + return computed; + } + }); + return Object.defineProperty(user, 'tasks', { + get: function() { + var tasks; + tasks = user.habits.concat(user.dailys).concat(user.todos).concat(user.rewards); + return _.object(_.pluck(tasks, "id"), tasks); + } + }); +}; -},{"./content.coffee":5,"__browserify_process":2,"lodash":3,"moment":4}]},{},[1]) -; \ No newline at end of file +}).call(this,require("/home/matteo/Dropbox/Development/habitrpg-shared/node_modules/browserify/node_modules/insert-module-globals/node_modules/process/browser.js")) +},{"./content.coffee":5,"/home/matteo/Dropbox/Development/habitrpg-shared/node_modules/browserify/node_modules/insert-module-globals/node_modules/process/browser.js":2,"lodash":3,"moment":4}]},{},[1]) \ No newline at end of file diff --git a/package.json b/package.json index c5427d5807..e5bff27561 100644 --- a/package.json +++ b/package.json @@ -2,23 +2,23 @@ "name": "habitrpg-shared", "version": "0.0.0", "dependencies": { - "browserify": "~2.35", - "coffeeify": "0.4.0", - "coffee-script": "1.6.2", + "browserify": "~3.30.2", + "coffeeify": "0.6.0", + "coffee-script": "1.7.1", "moment": "~2.4.0", "lodash": "~2.4.1", - "grunt-spritesmith": "~1.21.0" + "grunt-spritesmith": "~1.22.0" }, "devDependencies": { "mocha": "*", "expect.js": "*", - "sinon": "~1.7.3", + "sinon": "~1.8.2", "grunt": "~0.4.1", - "grunt-contrib-cssmin": "~0.6.2", - "grunt-browserify": "~1.2.4", + "grunt-contrib-cssmin": "~0.8.0", + "grunt-browserify": "~1.3.1", "grunt-contrib-clean": "~0.5.0" }, "scripts": { - "test": "mocha --compilers coffee:coffee-script tests/algos.mocha.coffee" + "test": "mocha" } } diff --git a/tests/algos.mocha.coffee b/test/algos.mocha.coffee similarity index 100% rename from tests/algos.mocha.coffee rename to test/algos.mocha.coffee diff --git a/test/mocha.opts b/test/mocha.opts new file mode 100644 index 0000000000..70308aadd7 --- /dev/null +++ b/test/mocha.opts @@ -0,0 +1,8 @@ +--colors +--reporter spec +--timeout 8000 +--check-leaks +--growl +--debug +--compilers coffee:coffee-script/register +--globals io diff --git a/tests/simulations/autoAllocate.coffee b/test/simulations/autoAllocate.coffee similarity index 100% rename from tests/simulations/autoAllocate.coffee rename to test/simulations/autoAllocate.coffee diff --git a/tests/simulations/passive_active_attrs.coffee b/test/simulations/passive_active_attrs.coffee similarity index 100% rename from tests/simulations/passive_active_attrs.coffee rename to test/simulations/passive_active_attrs.coffee diff --git a/tests/mocha.opts b/tests/mocha.opts deleted file mode 100644 index bb9481b7d4..0000000000 --- a/tests/mocha.opts +++ /dev/null @@ -1,6 +0,0 @@ ---colors ---reporter spec ---growl ---debug ---compilers coffee:coffee-script ---globals io \ No newline at end of file