diff --git a/.eslintignore b/.eslintignore index 17ddc90a01..93a77392f1 100644 --- a/.eslintignore +++ b/.eslintignore @@ -12,13 +12,13 @@ website/public/ # Temporarilly disabled. These should be removed when the linting errors are fixed common/script/content/index.js -common/script/fns/randomDrop.js common/script/public/**/*.js website/src/**/api-v2/**/*.js website/src/routes/payments.js website/src/routes/pages.js -website/src/middlewares/ +website/src/middlewares/apiThrottle.js +website/src/middlewares/forceRefresh.js website/src/controllers/payments/ debug-scripts/* diff --git a/common/dist/sprites/spritesmith-main-10.css b/common/dist/sprites/spritesmith-main-10.css index d377c9054e..76144331ce 100644 --- a/common/dist/sprites/spritesmith-main-10.css +++ b/common/dist/sprites/spritesmith-main-10.css @@ -1,687 +1,705 @@ -.Mount_Icon_BearCub-Red { - background-image: url(spritesmith-main-10.png); - background-position: 0px -945px; - width: 81px; - height: 99px; -} -.Mount_Icon_BearCub-Shade { - background-image: url(spritesmith-main-10.png); - background-position: -1244px -100px; - width: 81px; - height: 99px; -} -.Mount_Icon_BearCub-Skeleton { - background-image: url(spritesmith-main-10.png); - background-position: -82px -945px; - width: 81px; - height: 99px; -} -.Mount_Icon_BearCub-Spooky { - background-image: url(spritesmith-main-10.png); - background-position: -164px -945px; - width: 81px; - height: 99px; -} -.Mount_Icon_BearCub-White { +.Mount_Icon_BearCub-Golden { background-image: url(spritesmith-main-10.png); background-position: -246px -945px; width: 81px; height: 99px; } -.Mount_Icon_BearCub-Zombie { +.Mount_Icon_BearCub-Peppermint { + background-image: url(spritesmith-main-10.png); + background-position: -1244px -100px; + width: 81px; + height: 99px; +} +.Mount_Icon_BearCub-Polar { background-image: url(spritesmith-main-10.png); background-position: -328px -945px; width: 81px; height: 99px; } -.Mount_Icon_Bunny-Base { +.Mount_Icon_BearCub-Red { background-image: url(spritesmith-main-10.png); background-position: -410px -945px; width: 81px; height: 99px; } -.Mount_Icon_Bunny-CottonCandyBlue { +.Mount_Icon_BearCub-Shade { background-image: url(spritesmith-main-10.png); background-position: -492px -945px; width: 81px; height: 99px; } -.Mount_Icon_Bunny-CottonCandyPink { +.Mount_Icon_BearCub-Skeleton { background-image: url(spritesmith-main-10.png); background-position: -574px -945px; width: 81px; height: 99px; } -.Mount_Icon_Bunny-Desert { +.Mount_Icon_BearCub-Spooky { background-image: url(spritesmith-main-10.png); background-position: -656px -945px; width: 81px; height: 99px; } -.Mount_Icon_Bunny-Golden { +.Mount_Icon_BearCub-White { background-image: url(spritesmith-main-10.png); background-position: -738px -945px; width: 81px; height: 99px; } -.Mount_Icon_Bunny-Red { +.Mount_Icon_BearCub-Zombie { background-image: url(spritesmith-main-10.png); - background-position: -1162px -400px; + background-position: -820px -945px; width: 81px; height: 99px; } -.Mount_Icon_Bunny-Shade { +.Mount_Icon_Bunny-Base { background-image: url(spritesmith-main-10.png); - background-position: -246px -1345px; + background-position: -902px -945px; width: 81px; height: 99px; } -.Mount_Icon_Bunny-Skeleton { +.Mount_Icon_Bunny-CottonCandyBlue { + background-image: url(spritesmith-main-10.png); + background-position: -984px -945px; + width: 81px; + height: 99px; +} +.Mount_Icon_Bunny-CottonCandyPink { + background-image: url(spritesmith-main-10.png); + background-position: -1162px -700px; + width: 81px; + height: 99px; +} +.Mount_Icon_Bunny-Desert { + background-image: url(spritesmith-main-10.png); + background-position: -492px -1345px; + width: 81px; + height: 99px; +} +.Mount_Icon_Bunny-Golden { background-image: url(spritesmith-main-10.png); background-position: -424px -100px; width: 81px; height: 99px; } -.Mount_Icon_Bunny-White { +.Mount_Icon_Bunny-Red { background-image: url(spritesmith-main-10.png); background-position: -424px -200px; width: 81px; height: 99px; } -.Mount_Icon_Bunny-Zombie { +.Mount_Icon_Bunny-Shade { background-image: url(spritesmith-main-10.png); background-position: 0px -345px; width: 81px; height: 99px; } -.Mount_Icon_Cactus-Base { +.Mount_Icon_Bunny-Skeleton { background-image: url(spritesmith-main-10.png); background-position: -82px -345px; width: 81px; height: 99px; } -.Mount_Icon_Cactus-CottonCandyBlue { +.Mount_Icon_Bunny-White { background-image: url(spritesmith-main-10.png); background-position: -164px -345px; width: 81px; height: 99px; } -.Mount_Icon_Cactus-CottonCandyPink { +.Mount_Icon_Bunny-Zombie { background-image: url(spritesmith-main-10.png); background-position: -246px -345px; width: 81px; height: 99px; } -.Mount_Icon_Cactus-Desert { +.Mount_Icon_Cactus-Base { background-image: url(spritesmith-main-10.png); background-position: -328px -345px; width: 81px; height: 99px; } -.Mount_Icon_Cactus-Golden { +.Mount_Icon_Cactus-CottonCandyBlue { background-image: url(spritesmith-main-10.png); background-position: -410px -345px; width: 81px; height: 99px; } -.Mount_Icon_Cactus-Peppermint { +.Mount_Icon_Cactus-CottonCandyPink { background-image: url(spritesmith-main-10.png); background-position: -506px 0px; width: 81px; height: 99px; } -.Mount_Icon_Cactus-Red { +.Mount_Icon_Cactus-Desert { background-image: url(spritesmith-main-10.png); background-position: -506px -100px; width: 81px; height: 99px; } -.Mount_Icon_Cactus-Shade { +.Mount_Icon_Cactus-Golden { background-image: url(spritesmith-main-10.png); background-position: -506px -200px; width: 81px; height: 99px; } -.Mount_Icon_Cactus-Skeleton { +.Mount_Icon_Cactus-Peppermint { background-image: url(spritesmith-main-10.png); background-position: -506px -300px; width: 81px; height: 99px; } -.Mount_Icon_Cactus-Spooky { +.Mount_Icon_Cactus-Red { background-image: url(spritesmith-main-10.png); background-position: 0px -445px; width: 81px; height: 99px; } -.Mount_Icon_Cactus-White { +.Mount_Icon_Cactus-Shade { background-image: url(spritesmith-main-10.png); background-position: -82px -445px; width: 81px; height: 99px; } -.Mount_Icon_Cactus-Zombie { +.Mount_Icon_Cactus-Skeleton { background-image: url(spritesmith-main-10.png); background-position: -164px -445px; width: 81px; height: 99px; } -.Mount_Icon_Cheetah-Base { +.Mount_Icon_Cactus-Spooky { background-image: url(spritesmith-main-10.png); background-position: -246px -445px; width: 81px; height: 99px; } -.Mount_Icon_Cheetah-CottonCandyBlue { +.Mount_Icon_Cactus-White { background-image: url(spritesmith-main-10.png); background-position: -328px -445px; width: 81px; height: 99px; } -.Mount_Icon_Cheetah-CottonCandyPink { +.Mount_Icon_Cactus-Zombie { background-image: url(spritesmith-main-10.png); background-position: -410px -445px; width: 81px; height: 99px; } -.Mount_Icon_Cheetah-Desert { +.Mount_Icon_Cheetah-Base { background-image: url(spritesmith-main-10.png); background-position: -492px -445px; width: 81px; height: 99px; } -.Mount_Icon_Cheetah-Golden { +.Mount_Icon_Cheetah-CottonCandyBlue { background-image: url(spritesmith-main-10.png); background-position: -588px 0px; width: 81px; height: 99px; } -.Mount_Icon_Cheetah-Red { +.Mount_Icon_Cheetah-CottonCandyPink { background-image: url(spritesmith-main-10.png); background-position: -588px -100px; width: 81px; height: 99px; } -.Mount_Icon_Cheetah-Shade { +.Mount_Icon_Cheetah-Desert { background-image: url(spritesmith-main-10.png); background-position: -588px -200px; width: 81px; height: 99px; } -.Mount_Icon_Cheetah-Skeleton { +.Mount_Icon_Cheetah-Golden { background-image: url(spritesmith-main-10.png); background-position: -588px -300px; width: 81px; height: 99px; } -.Mount_Icon_Cheetah-White { +.Mount_Icon_Cheetah-Red { background-image: url(spritesmith-main-10.png); background-position: -588px -400px; width: 81px; height: 99px; } -.Mount_Icon_Cheetah-Zombie { +.Mount_Icon_Cheetah-Shade { background-image: url(spritesmith-main-10.png); background-position: 0px -545px; width: 81px; height: 99px; } -.Mount_Icon_Cuttlefish-Base { +.Mount_Icon_Cheetah-Skeleton { background-image: url(spritesmith-main-10.png); background-position: -82px -545px; width: 81px; height: 99px; } -.Mount_Icon_Cuttlefish-CottonCandyBlue { +.Mount_Icon_Cheetah-White { background-image: url(spritesmith-main-10.png); background-position: -164px -545px; width: 81px; height: 99px; } -.Mount_Icon_Cuttlefish-CottonCandyPink { +.Mount_Icon_Cheetah-Zombie { background-image: url(spritesmith-main-10.png); background-position: -246px -545px; width: 81px; height: 99px; } -.Mount_Icon_Cuttlefish-Desert { +.Mount_Icon_Cuttlefish-Base { background-image: url(spritesmith-main-10.png); background-position: -328px -545px; width: 81px; height: 99px; } -.Mount_Icon_Cuttlefish-Golden { +.Mount_Icon_Cuttlefish-CottonCandyBlue { background-image: url(spritesmith-main-10.png); background-position: -410px -545px; width: 81px; height: 99px; } -.Mount_Icon_Cuttlefish-Red { +.Mount_Icon_Cuttlefish-CottonCandyPink { background-image: url(spritesmith-main-10.png); background-position: -492px -545px; width: 81px; height: 99px; } -.Mount_Icon_Cuttlefish-Shade { +.Mount_Icon_Cuttlefish-Desert { background-image: url(spritesmith-main-10.png); background-position: -574px -545px; width: 81px; height: 99px; } -.Mount_Icon_Cuttlefish-Skeleton { +.Mount_Icon_Cuttlefish-Golden { background-image: url(spritesmith-main-10.png); background-position: -670px 0px; width: 81px; height: 99px; } -.Mount_Icon_Cuttlefish-White { +.Mount_Icon_Cuttlefish-Red { background-image: url(spritesmith-main-10.png); background-position: -670px -100px; width: 81px; height: 99px; } -.Mount_Icon_Cuttlefish-Zombie { +.Mount_Icon_Cuttlefish-Shade { background-image: url(spritesmith-main-10.png); background-position: -670px -200px; width: 81px; height: 99px; } -.Mount_Icon_Deer-Base { +.Mount_Icon_Cuttlefish-Skeleton { background-image: url(spritesmith-main-10.png); background-position: -670px -300px; width: 81px; height: 99px; } -.Mount_Icon_Deer-CottonCandyBlue { +.Mount_Icon_Cuttlefish-White { background-image: url(spritesmith-main-10.png); background-position: -670px -400px; width: 81px; height: 99px; } -.Mount_Icon_Deer-CottonCandyPink { +.Mount_Icon_Cuttlefish-Zombie { background-image: url(spritesmith-main-10.png); background-position: -670px -500px; width: 81px; height: 99px; } -.Mount_Icon_Deer-Desert { +.Mount_Icon_Deer-Base { background-image: url(spritesmith-main-10.png); background-position: 0px -645px; width: 81px; height: 99px; } -.Mount_Icon_Deer-Golden { +.Mount_Icon_Deer-CottonCandyBlue { background-image: url(spritesmith-main-10.png); background-position: -82px -645px; width: 81px; height: 99px; } -.Mount_Icon_Deer-Red { +.Mount_Icon_Deer-CottonCandyPink { background-image: url(spritesmith-main-10.png); background-position: -164px -645px; width: 81px; height: 99px; } -.Mount_Icon_Deer-Shade { +.Mount_Icon_Deer-Desert { background-image: url(spritesmith-main-10.png); background-position: -246px -645px; width: 81px; height: 99px; } -.Mount_Icon_Deer-Skeleton { +.Mount_Icon_Deer-Golden { background-image: url(spritesmith-main-10.png); background-position: -328px -645px; width: 81px; height: 99px; } -.Mount_Icon_Deer-White { +.Mount_Icon_Deer-Red { background-image: url(spritesmith-main-10.png); background-position: -410px -645px; width: 81px; height: 99px; } -.Mount_Icon_Deer-Zombie { +.Mount_Icon_Deer-Shade { background-image: url(spritesmith-main-10.png); background-position: -492px -645px; width: 81px; height: 99px; } -.Mount_Icon_Dragon-Base { +.Mount_Icon_Deer-Skeleton { background-image: url(spritesmith-main-10.png); background-position: -574px -645px; width: 81px; height: 99px; } -.Mount_Icon_Dragon-CottonCandyBlue { +.Mount_Icon_Deer-White { background-image: url(spritesmith-main-10.png); background-position: -656px -645px; width: 81px; height: 99px; } -.Mount_Icon_Dragon-CottonCandyPink { +.Mount_Icon_Deer-Zombie { background-image: url(spritesmith-main-10.png); background-position: -752px 0px; width: 81px; height: 99px; } -.Mount_Icon_Dragon-Desert { +.Mount_Icon_Dragon-Base { background-image: url(spritesmith-main-10.png); background-position: -752px -100px; width: 81px; height: 99px; } -.Mount_Icon_Dragon-Golden { +.Mount_Icon_Dragon-CottonCandyBlue { background-image: url(spritesmith-main-10.png); background-position: -752px -200px; width: 81px; height: 99px; } -.Mount_Icon_Dragon-Peppermint { +.Mount_Icon_Dragon-CottonCandyPink { background-image: url(spritesmith-main-10.png); background-position: -752px -300px; width: 81px; height: 99px; } -.Mount_Icon_Dragon-Red { +.Mount_Icon_Dragon-Desert { background-image: url(spritesmith-main-10.png); background-position: -752px -400px; width: 81px; height: 99px; } -.Mount_Icon_Dragon-Shade { +.Mount_Icon_Dragon-Golden { background-image: url(spritesmith-main-10.png); background-position: -752px -500px; width: 81px; height: 99px; } -.Mount_Icon_Dragon-Skeleton { +.Mount_Icon_Dragon-Peppermint { background-image: url(spritesmith-main-10.png); background-position: -752px -600px; width: 81px; height: 99px; } -.Mount_Icon_Dragon-Spooky { +.Mount_Icon_Dragon-Red { background-image: url(spritesmith-main-10.png); background-position: -834px 0px; width: 81px; height: 99px; } -.Mount_Icon_Dragon-White { +.Mount_Icon_Dragon-Shade { background-image: url(spritesmith-main-10.png); background-position: -834px -100px; width: 81px; height: 99px; } -.Mount_Icon_Dragon-Zombie { +.Mount_Icon_Dragon-Skeleton { background-image: url(spritesmith-main-10.png); background-position: -834px -200px; width: 81px; height: 99px; } -.Mount_Icon_Egg-Base { +.Mount_Icon_Dragon-Spooky { background-image: url(spritesmith-main-10.png); background-position: -834px -300px; width: 81px; height: 99px; } -.Mount_Icon_Egg-CottonCandyBlue { +.Mount_Icon_Dragon-White { background-image: url(spritesmith-main-10.png); background-position: -834px -400px; width: 81px; height: 99px; } -.Mount_Icon_Egg-CottonCandyPink { +.Mount_Icon_Dragon-Zombie { background-image: url(spritesmith-main-10.png); background-position: -834px -500px; width: 81px; height: 99px; } -.Mount_Icon_Egg-Desert { +.Mount_Icon_Egg-Base { background-image: url(spritesmith-main-10.png); background-position: -834px -600px; width: 81px; height: 99px; } -.Mount_Icon_Egg-Golden { +.Mount_Icon_Egg-CottonCandyBlue { background-image: url(spritesmith-main-10.png); background-position: 0px -745px; width: 81px; height: 99px; } -.Mount_Icon_Egg-Red { +.Mount_Icon_Egg-CottonCandyPink { background-image: url(spritesmith-main-10.png); background-position: -82px -745px; width: 81px; height: 99px; } -.Mount_Icon_Egg-Shade { +.Mount_Icon_Egg-Desert { background-image: url(spritesmith-main-10.png); background-position: -164px -745px; width: 81px; height: 99px; } -.Mount_Icon_Egg-Skeleton { +.Mount_Icon_Egg-Golden { background-image: url(spritesmith-main-10.png); background-position: -246px -745px; width: 81px; height: 99px; } -.Mount_Icon_Egg-White { +.Mount_Icon_Egg-Red { background-image: url(spritesmith-main-10.png); background-position: -328px -745px; width: 81px; height: 99px; } -.Mount_Icon_Egg-Zombie { +.Mount_Icon_Egg-Shade { background-image: url(spritesmith-main-10.png); background-position: -410px -745px; width: 81px; height: 99px; } -.Mount_Icon_Falcon-Base { +.Mount_Icon_Egg-Skeleton { background-image: url(spritesmith-main-10.png); background-position: -492px -745px; width: 81px; height: 99px; } -.Mount_Icon_Falcon-CottonCandyBlue { +.Mount_Icon_Egg-White { background-image: url(spritesmith-main-10.png); background-position: -574px -745px; width: 81px; height: 99px; } -.Mount_Icon_Falcon-CottonCandyPink { +.Mount_Icon_Egg-Zombie { background-image: url(spritesmith-main-10.png); background-position: -656px -745px; width: 81px; height: 99px; } -.Mount_Icon_Falcon-Desert { +.Mount_Icon_Falcon-Base { background-image: url(spritesmith-main-10.png); background-position: -738px -745px; width: 81px; height: 99px; } -.Mount_Icon_Falcon-Golden { +.Mount_Icon_Falcon-CottonCandyBlue { background-image: url(spritesmith-main-10.png); background-position: -820px -745px; width: 81px; height: 99px; } -.Mount_Icon_Falcon-Red { +.Mount_Icon_Falcon-CottonCandyPink { background-image: url(spritesmith-main-10.png); background-position: -916px 0px; width: 81px; height: 99px; } -.Mount_Icon_Falcon-Shade { +.Mount_Icon_Falcon-Desert { background-image: url(spritesmith-main-10.png); background-position: -916px -100px; width: 81px; height: 99px; } -.Mount_Icon_Falcon-Skeleton { +.Mount_Icon_Falcon-Golden { background-image: url(spritesmith-main-10.png); background-position: -916px -200px; width: 81px; height: 99px; } -.Mount_Icon_Falcon-White { +.Mount_Icon_Falcon-Red { background-image: url(spritesmith-main-10.png); background-position: -916px -300px; width: 81px; height: 99px; } -.Mount_Icon_Falcon-Zombie { +.Mount_Icon_Falcon-Shade { background-image: url(spritesmith-main-10.png); background-position: -916px -400px; width: 81px; height: 99px; } -.Mount_Icon_FlyingPig-Base { +.Mount_Icon_Falcon-Skeleton { background-image: url(spritesmith-main-10.png); background-position: -916px -500px; width: 81px; height: 99px; } -.Mount_Icon_FlyingPig-CottonCandyBlue { +.Mount_Icon_Falcon-White { background-image: url(spritesmith-main-10.png); background-position: -916px -600px; width: 81px; height: 99px; } -.Mount_Icon_FlyingPig-CottonCandyPink { +.Mount_Icon_Falcon-Zombie { background-image: url(spritesmith-main-10.png); background-position: -916px -700px; width: 81px; height: 99px; } -.Mount_Icon_FlyingPig-Desert { +.Mount_Icon_FlyingPig-Base { background-image: url(spritesmith-main-10.png); background-position: 0px -845px; width: 81px; height: 99px; } -.Mount_Icon_FlyingPig-Golden { +.Mount_Icon_FlyingPig-CottonCandyBlue { background-image: url(spritesmith-main-10.png); background-position: -82px -845px; width: 81px; height: 99px; } -.Mount_Icon_FlyingPig-Peppermint { +.Mount_Icon_FlyingPig-CottonCandyPink { background-image: url(spritesmith-main-10.png); background-position: -164px -845px; width: 81px; height: 99px; } -.Mount_Icon_FlyingPig-Red { +.Mount_Icon_FlyingPig-Desert { background-image: url(spritesmith-main-10.png); background-position: -246px -845px; width: 81px; height: 99px; } -.Mount_Icon_FlyingPig-Shade { +.Mount_Icon_FlyingPig-Golden { background-image: url(spritesmith-main-10.png); background-position: -328px -845px; width: 81px; height: 99px; } -.Mount_Icon_FlyingPig-Skeleton { +.Mount_Icon_FlyingPig-Peppermint { background-image: url(spritesmith-main-10.png); background-position: -410px -845px; width: 81px; height: 99px; } -.Mount_Icon_FlyingPig-Spooky { +.Mount_Icon_FlyingPig-Red { background-image: url(spritesmith-main-10.png); background-position: -492px -845px; width: 81px; height: 99px; } -.Mount_Icon_FlyingPig-White { +.Mount_Icon_FlyingPig-Shade { background-image: url(spritesmith-main-10.png); background-position: -574px -845px; width: 81px; height: 99px; } -.Mount_Icon_FlyingPig-Zombie { +.Mount_Icon_FlyingPig-Skeleton { background-image: url(spritesmith-main-10.png); background-position: -656px -845px; width: 81px; height: 99px; } -.Mount_Icon_Fox-Base { +.Mount_Icon_FlyingPig-Spooky { background-image: url(spritesmith-main-10.png); background-position: -738px -845px; width: 81px; height: 99px; } -.Mount_Icon_Fox-CottonCandyBlue { +.Mount_Icon_FlyingPig-White { background-image: url(spritesmith-main-10.png); background-position: -820px -845px; width: 81px; height: 99px; } -.Mount_Icon_Fox-CottonCandyPink { +.Mount_Icon_FlyingPig-Zombie { background-image: url(spritesmith-main-10.png); background-position: -902px -845px; width: 81px; height: 99px; } -.Mount_Icon_Fox-Desert { +.Mount_Icon_Fox-Base { background-image: url(spritesmith-main-10.png); background-position: -998px 0px; width: 81px; height: 99px; } -.Mount_Icon_Fox-Golden { +.Mount_Icon_Fox-CottonCandyBlue { background-image: url(spritesmith-main-10.png); background-position: -998px -100px; width: 81px; height: 99px; } -.Mount_Icon_Fox-Peppermint { +.Mount_Icon_Fox-CottonCandyPink { background-image: url(spritesmith-main-10.png); background-position: -998px -200px; width: 81px; height: 99px; } -.Mount_Icon_Fox-Red { +.Mount_Icon_Fox-Desert { background-image: url(spritesmith-main-10.png); background-position: -998px -300px; width: 81px; height: 99px; } -.Mount_Icon_Fox-Shade { +.Mount_Icon_Fox-Golden { background-image: url(spritesmith-main-10.png); background-position: -998px -400px; width: 81px; height: 99px; } -.Mount_Icon_Fox-Skeleton { +.Mount_Icon_Fox-Peppermint { background-image: url(spritesmith-main-10.png); background-position: -998px -500px; width: 81px; height: 99px; } -.Mount_Icon_Fox-Spooky { +.Mount_Icon_Fox-Red { background-image: url(spritesmith-main-10.png); background-position: -998px -600px; width: 81px; height: 99px; } -.Mount_Icon_Fox-White { +.Mount_Icon_Fox-Shade { background-image: url(spritesmith-main-10.png); background-position: -998px -700px; width: 81px; height: 99px; } -.Mount_Icon_Fox-Zombie { +.Mount_Icon_Fox-Skeleton { background-image: url(spritesmith-main-10.png); background-position: -998px -800px; width: 81px; height: 99px; } +.Mount_Icon_Fox-Spooky { + background-image: url(spritesmith-main-10.png); + background-position: 0px -945px; + width: 81px; + height: 99px; +} +.Mount_Icon_Fox-White { + background-image: url(spritesmith-main-10.png); + background-position: -82px -945px; + width: 81px; + height: 99px; +} +.Mount_Icon_Fox-Zombie { + background-image: url(spritesmith-main-10.png); + background-position: -164px -945px; + width: 81px; + height: 99px; +} .Mount_Icon_Frog-Base { background-image: url(spritesmith-main-10.png); background-position: -212px -115px; @@ -744,187 +762,187 @@ } .Mount_Icon_Gryphon-Base { background-image: url(spritesmith-main-10.png); - background-position: -820px -945px; + background-position: -1080px 0px; width: 81px; height: 99px; } .Mount_Icon_Gryphon-CottonCandyBlue { background-image: url(spritesmith-main-10.png); - background-position: -902px -945px; + background-position: -1080px -100px; width: 81px; height: 99px; } .Mount_Icon_Gryphon-CottonCandyPink { background-image: url(spritesmith-main-10.png); - background-position: -984px -945px; + background-position: -1080px -200px; width: 81px; height: 99px; } .Mount_Icon_Gryphon-Desert { background-image: url(spritesmith-main-10.png); - background-position: -1080px 0px; + background-position: -1080px -300px; width: 81px; height: 99px; } .Mount_Icon_Gryphon-Golden { background-image: url(spritesmith-main-10.png); - background-position: -1080px -100px; + background-position: -1080px -400px; width: 81px; height: 99px; } .Mount_Icon_Gryphon-Red { background-image: url(spritesmith-main-10.png); - background-position: -1080px -200px; + background-position: -1080px -500px; width: 81px; height: 99px; } .Mount_Icon_Gryphon-RoyalPurple { background-image: url(spritesmith-main-10.png); - background-position: -1080px -300px; + background-position: -1080px -600px; width: 81px; height: 99px; } .Mount_Icon_Gryphon-Shade { background-image: url(spritesmith-main-10.png); - background-position: -1080px -400px; + background-position: -1080px -700px; width: 81px; height: 99px; } .Mount_Icon_Gryphon-Skeleton { background-image: url(spritesmith-main-10.png); - background-position: -1080px -500px; + background-position: -1080px -800px; width: 81px; height: 99px; } .Mount_Icon_Gryphon-White { background-image: url(spritesmith-main-10.png); - background-position: -1080px -600px; + background-position: -1080px -900px; width: 81px; height: 99px; } .Mount_Icon_Gryphon-Zombie { background-image: url(spritesmith-main-10.png); - background-position: -1080px -700px; + background-position: 0px -1045px; width: 81px; height: 99px; } .Mount_Icon_Hedgehog-Base { background-image: url(spritesmith-main-10.png); - background-position: -1080px -800px; + background-position: -82px -1045px; width: 81px; height: 99px; } .Mount_Icon_Hedgehog-CottonCandyBlue { background-image: url(spritesmith-main-10.png); - background-position: -1080px -900px; + background-position: -164px -1045px; width: 81px; height: 99px; } .Mount_Icon_Hedgehog-CottonCandyPink { background-image: url(spritesmith-main-10.png); - background-position: 0px -1045px; + background-position: -246px -1045px; width: 81px; height: 99px; } .Mount_Icon_Hedgehog-Desert { background-image: url(spritesmith-main-10.png); - background-position: -82px -1045px; + background-position: -328px -1045px; width: 81px; height: 99px; } .Mount_Icon_Hedgehog-Golden { background-image: url(spritesmith-main-10.png); - background-position: -164px -1045px; + background-position: -410px -1045px; width: 81px; height: 99px; } .Mount_Icon_Hedgehog-Red { background-image: url(spritesmith-main-10.png); - background-position: -246px -1045px; + background-position: -492px -1045px; width: 81px; height: 99px; } .Mount_Icon_Hedgehog-Shade { background-image: url(spritesmith-main-10.png); - background-position: -328px -1045px; + background-position: -574px -1045px; width: 81px; height: 99px; } .Mount_Icon_Hedgehog-Skeleton { background-image: url(spritesmith-main-10.png); - background-position: -410px -1045px; + background-position: -656px -1045px; width: 81px; height: 99px; } .Mount_Icon_Hedgehog-White { background-image: url(spritesmith-main-10.png); - background-position: -492px -1045px; + background-position: -738px -1045px; width: 81px; height: 99px; } .Mount_Icon_Hedgehog-Zombie { background-image: url(spritesmith-main-10.png); - background-position: -574px -1045px; + background-position: -820px -1045px; width: 81px; height: 99px; } .Mount_Icon_Horse-Base { background-image: url(spritesmith-main-10.png); - background-position: -656px -1045px; + background-position: -902px -1045px; width: 81px; height: 99px; } .Mount_Icon_Horse-CottonCandyBlue { background-image: url(spritesmith-main-10.png); - background-position: -738px -1045px; + background-position: -984px -1045px; width: 81px; height: 99px; } .Mount_Icon_Horse-CottonCandyPink { background-image: url(spritesmith-main-10.png); - background-position: -820px -1045px; + background-position: -1066px -1045px; width: 81px; height: 99px; } .Mount_Icon_Horse-Desert { background-image: url(spritesmith-main-10.png); - background-position: -902px -1045px; + background-position: -1162px 0px; width: 81px; height: 99px; } .Mount_Icon_Horse-Golden { background-image: url(spritesmith-main-10.png); - background-position: -984px -1045px; + background-position: -1162px -100px; width: 81px; height: 99px; } .Mount_Icon_Horse-Red { background-image: url(spritesmith-main-10.png); - background-position: -1066px -1045px; + background-position: -1162px -200px; width: 81px; height: 99px; } .Mount_Icon_Horse-Shade { background-image: url(spritesmith-main-10.png); - background-position: -1162px 0px; + background-position: -1162px -300px; width: 81px; height: 99px; } .Mount_Icon_Horse-Skeleton { background-image: url(spritesmith-main-10.png); - background-position: -1162px -100px; + background-position: -1162px -400px; width: 81px; height: 99px; } .Mount_Icon_Horse-White { background-image: url(spritesmith-main-10.png); - background-position: -1162px -200px; + background-position: -1162px -500px; width: 81px; height: 99px; } .Mount_Icon_Horse-Zombie { background-image: url(spritesmith-main-10.png); - background-position: -1162px -300px; + background-position: -1162px -600px; width: 81px; height: 99px; } @@ -936,469 +954,469 @@ } .Mount_Icon_LionCub-Base { background-image: url(spritesmith-main-10.png); - background-position: -1162px -500px; + background-position: -1162px -800px; width: 81px; height: 99px; } .Mount_Icon_LionCub-CottonCandyBlue { background-image: url(spritesmith-main-10.png); - background-position: -1162px -600px; + background-position: -1162px -900px; width: 81px; height: 99px; } .Mount_Icon_LionCub-CottonCandyPink { background-image: url(spritesmith-main-10.png); - background-position: -1162px -700px; + background-position: -1162px -1000px; width: 81px; height: 99px; } .Mount_Icon_LionCub-Desert { background-image: url(spritesmith-main-10.png); - background-position: -1162px -800px; + background-position: -1244px 0px; width: 81px; height: 99px; } .Mount_Icon_LionCub-Ethereal { background-image: url(spritesmith-main-10.png); - background-position: -1162px -900px; + background-position: -424px 0px; width: 81px; height: 99px; } .Mount_Icon_LionCub-Golden { background-image: url(spritesmith-main-10.png); - background-position: -1162px -1000px; + background-position: -1244px -200px; width: 81px; height: 99px; } .Mount_Icon_LionCub-Peppermint { background-image: url(spritesmith-main-10.png); - background-position: -1244px 0px; + background-position: -1244px -300px; width: 81px; height: 99px; } .Mount_Icon_LionCub-Red { background-image: url(spritesmith-main-10.png); - background-position: -424px 0px; + background-position: -1244px -400px; width: 81px; height: 99px; } .Mount_Icon_LionCub-Shade { background-image: url(spritesmith-main-10.png); - background-position: -1244px -200px; + background-position: -1244px -500px; width: 81px; height: 99px; } .Mount_Icon_LionCub-Skeleton { background-image: url(spritesmith-main-10.png); - background-position: -1244px -300px; + background-position: -1244px -600px; width: 81px; height: 99px; } .Mount_Icon_LionCub-Spooky { background-image: url(spritesmith-main-10.png); - background-position: -1244px -400px; + background-position: -1244px -700px; width: 81px; height: 99px; } .Mount_Icon_LionCub-White { background-image: url(spritesmith-main-10.png); - background-position: -1244px -500px; + background-position: -1244px -800px; width: 81px; height: 99px; } .Mount_Icon_LionCub-Zombie { background-image: url(spritesmith-main-10.png); - background-position: -1244px -600px; + background-position: -1244px -900px; width: 81px; height: 99px; } .Mount_Icon_Mammoth-Base { background-image: url(spritesmith-main-10.png); - background-position: -1244px -700px; + background-position: -1244px -1000px; width: 81px; height: 99px; } .Mount_Icon_MantisShrimp-Base { background-image: url(spritesmith-main-10.png); - background-position: -1244px -800px; + background-position: 0px -1145px; width: 81px; height: 99px; } .Mount_Icon_Monkey-Base { background-image: url(spritesmith-main-10.png); - background-position: -1244px -900px; + background-position: -82px -1145px; width: 81px; height: 99px; } .Mount_Icon_Monkey-CottonCandyBlue { background-image: url(spritesmith-main-10.png); - background-position: -1244px -1000px; + background-position: -164px -1145px; width: 81px; height: 99px; } .Mount_Icon_Monkey-CottonCandyPink { background-image: url(spritesmith-main-10.png); - background-position: 0px -1145px; + background-position: -246px -1145px; width: 81px; height: 99px; } .Mount_Icon_Monkey-Desert { background-image: url(spritesmith-main-10.png); - background-position: -82px -1145px; + background-position: -328px -1145px; width: 81px; height: 99px; } .Mount_Icon_Monkey-Golden { background-image: url(spritesmith-main-10.png); - background-position: -164px -1145px; + background-position: -410px -1145px; width: 81px; height: 99px; } .Mount_Icon_Monkey-Red { background-image: url(spritesmith-main-10.png); - background-position: -246px -1145px; + background-position: -492px -1145px; width: 81px; height: 99px; } .Mount_Icon_Monkey-Shade { background-image: url(spritesmith-main-10.png); - background-position: -328px -1145px; + background-position: -574px -1145px; width: 81px; height: 99px; } .Mount_Icon_Monkey-Skeleton { background-image: url(spritesmith-main-10.png); - background-position: -410px -1145px; + background-position: -656px -1145px; width: 81px; height: 99px; } .Mount_Icon_Monkey-White { background-image: url(spritesmith-main-10.png); - background-position: -492px -1145px; + background-position: -738px -1145px; width: 81px; height: 99px; } .Mount_Icon_Monkey-Zombie { background-image: url(spritesmith-main-10.png); - background-position: -574px -1145px; + background-position: -820px -1145px; width: 81px; height: 99px; } .Mount_Icon_Octopus-Base { background-image: url(spritesmith-main-10.png); - background-position: -656px -1145px; + background-position: -902px -1145px; width: 81px; height: 99px; } .Mount_Icon_Octopus-CottonCandyBlue { background-image: url(spritesmith-main-10.png); - background-position: -738px -1145px; + background-position: -984px -1145px; width: 81px; height: 99px; } .Mount_Icon_Octopus-CottonCandyPink { background-image: url(spritesmith-main-10.png); - background-position: -820px -1145px; + background-position: -1066px -1145px; width: 81px; height: 99px; } .Mount_Icon_Octopus-Desert { background-image: url(spritesmith-main-10.png); - background-position: -902px -1145px; + background-position: -1148px -1145px; width: 81px; height: 99px; } .Mount_Icon_Octopus-Golden { background-image: url(spritesmith-main-10.png); - background-position: -984px -1145px; + background-position: -1230px -1145px; width: 81px; height: 99px; } .Mount_Icon_Octopus-Red { background-image: url(spritesmith-main-10.png); - background-position: -1066px -1145px; + background-position: -1326px 0px; width: 81px; height: 99px; } .Mount_Icon_Octopus-Shade { background-image: url(spritesmith-main-10.png); - background-position: -1148px -1145px; + background-position: -1326px -100px; width: 81px; height: 99px; } .Mount_Icon_Octopus-Skeleton { background-image: url(spritesmith-main-10.png); - background-position: -1230px -1145px; + background-position: -1326px -200px; width: 81px; height: 99px; } .Mount_Icon_Octopus-White { background-image: url(spritesmith-main-10.png); - background-position: -1326px 0px; + background-position: -1326px -300px; width: 81px; height: 99px; } .Mount_Icon_Octopus-Zombie { background-image: url(spritesmith-main-10.png); - background-position: -1326px -100px; + background-position: -1326px -400px; width: 81px; height: 99px; } .Mount_Icon_Orca-Base { background-image: url(spritesmith-main-10.png); - background-position: -1326px -200px; + background-position: -1326px -500px; width: 81px; height: 99px; } .Mount_Icon_Owl-Base { background-image: url(spritesmith-main-10.png); - background-position: -1326px -300px; + background-position: -1326px -600px; width: 81px; height: 99px; } .Mount_Icon_Owl-CottonCandyBlue { background-image: url(spritesmith-main-10.png); - background-position: -1326px -400px; + background-position: -1326px -700px; width: 81px; height: 99px; } .Mount_Icon_Owl-CottonCandyPink { background-image: url(spritesmith-main-10.png); - background-position: -1326px -500px; + background-position: -1326px -800px; width: 81px; height: 99px; } .Mount_Icon_Owl-Desert { background-image: url(spritesmith-main-10.png); - background-position: -1326px -600px; + background-position: -1326px -900px; width: 81px; height: 99px; } .Mount_Icon_Owl-Golden { background-image: url(spritesmith-main-10.png); - background-position: -1326px -700px; + background-position: -1326px -1000px; width: 81px; height: 99px; } .Mount_Icon_Owl-Red { background-image: url(spritesmith-main-10.png); - background-position: -1326px -800px; + background-position: -1326px -1100px; width: 81px; height: 99px; } .Mount_Icon_Owl-Shade { background-image: url(spritesmith-main-10.png); - background-position: -1326px -900px; + background-position: 0px -1245px; width: 81px; height: 99px; } .Mount_Icon_Owl-Skeleton { background-image: url(spritesmith-main-10.png); - background-position: -1326px -1000px; + background-position: -82px -1245px; width: 81px; height: 99px; } .Mount_Icon_Owl-White { background-image: url(spritesmith-main-10.png); - background-position: -1326px -1100px; + background-position: -164px -1245px; width: 81px; height: 99px; } .Mount_Icon_Owl-Zombie { background-image: url(spritesmith-main-10.png); - background-position: 0px -1245px; + background-position: -246px -1245px; width: 81px; height: 99px; } .Mount_Icon_PandaCub-Base { background-image: url(spritesmith-main-10.png); - background-position: -82px -1245px; + background-position: -328px -1245px; width: 81px; height: 99px; } .Mount_Icon_PandaCub-CottonCandyBlue { background-image: url(spritesmith-main-10.png); - background-position: -164px -1245px; + background-position: -410px -1245px; width: 81px; height: 99px; } .Mount_Icon_PandaCub-CottonCandyPink { background-image: url(spritesmith-main-10.png); - background-position: -246px -1245px; + background-position: -492px -1245px; width: 81px; height: 99px; } .Mount_Icon_PandaCub-Desert { background-image: url(spritesmith-main-10.png); - background-position: -328px -1245px; + background-position: -574px -1245px; width: 81px; height: 99px; } .Mount_Icon_PandaCub-Golden { background-image: url(spritesmith-main-10.png); - background-position: -410px -1245px; + background-position: -656px -1245px; width: 81px; height: 99px; } .Mount_Icon_PandaCub-Peppermint { background-image: url(spritesmith-main-10.png); - background-position: -492px -1245px; + background-position: -738px -1245px; width: 81px; height: 99px; } .Mount_Icon_PandaCub-Red { background-image: url(spritesmith-main-10.png); - background-position: -574px -1245px; + background-position: -820px -1245px; width: 81px; height: 99px; } .Mount_Icon_PandaCub-Shade { background-image: url(spritesmith-main-10.png); - background-position: -656px -1245px; + background-position: -902px -1245px; width: 81px; height: 99px; } .Mount_Icon_PandaCub-Skeleton { background-image: url(spritesmith-main-10.png); - background-position: -738px -1245px; + background-position: -984px -1245px; width: 81px; height: 99px; } .Mount_Icon_PandaCub-Spooky { background-image: url(spritesmith-main-10.png); - background-position: -820px -1245px; + background-position: -1066px -1245px; width: 81px; height: 99px; } .Mount_Icon_PandaCub-White { background-image: url(spritesmith-main-10.png); - background-position: -902px -1245px; + background-position: -1148px -1245px; width: 81px; height: 99px; } .Mount_Icon_PandaCub-Zombie { background-image: url(spritesmith-main-10.png); - background-position: -984px -1245px; + background-position: -1230px -1245px; width: 81px; height: 99px; } .Mount_Icon_Parrot-Base { background-image: url(spritesmith-main-10.png); - background-position: -1066px -1245px; + background-position: -1312px -1245px; width: 81px; height: 99px; } .Mount_Icon_Parrot-CottonCandyBlue { background-image: url(spritesmith-main-10.png); - background-position: -1148px -1245px; + background-position: -1408px 0px; width: 81px; height: 99px; } .Mount_Icon_Parrot-CottonCandyPink { background-image: url(spritesmith-main-10.png); - background-position: -1230px -1245px; + background-position: -1408px -100px; width: 81px; height: 99px; } .Mount_Icon_Parrot-Desert { background-image: url(spritesmith-main-10.png); - background-position: -1312px -1245px; + background-position: -1408px -200px; width: 81px; height: 99px; } .Mount_Icon_Parrot-Golden { background-image: url(spritesmith-main-10.png); - background-position: -1408px 0px; + background-position: -1408px -300px; width: 81px; height: 99px; } .Mount_Icon_Parrot-Red { background-image: url(spritesmith-main-10.png); - background-position: -1408px -100px; + background-position: -1408px -400px; width: 81px; height: 99px; } .Mount_Icon_Parrot-Shade { background-image: url(spritesmith-main-10.png); - background-position: -1408px -200px; + background-position: -1408px -500px; width: 81px; height: 99px; } .Mount_Icon_Parrot-Skeleton { background-image: url(spritesmith-main-10.png); - background-position: -1408px -300px; + background-position: -1408px -600px; width: 81px; height: 99px; } .Mount_Icon_Parrot-White { background-image: url(spritesmith-main-10.png); - background-position: -1408px -400px; + background-position: -1408px -700px; width: 81px; height: 99px; } .Mount_Icon_Parrot-Zombie { background-image: url(spritesmith-main-10.png); - background-position: -1408px -500px; + background-position: -1408px -800px; width: 81px; height: 99px; } .Mount_Icon_Penguin-Base { background-image: url(spritesmith-main-10.png); - background-position: -1408px -600px; + background-position: -1408px -900px; width: 81px; height: 99px; } .Mount_Icon_Penguin-CottonCandyBlue { background-image: url(spritesmith-main-10.png); - background-position: -1408px -700px; + background-position: -1408px -1000px; width: 81px; height: 99px; } .Mount_Icon_Penguin-CottonCandyPink { background-image: url(spritesmith-main-10.png); - background-position: -1408px -800px; + background-position: -1408px -1100px; width: 81px; height: 99px; } .Mount_Icon_Penguin-Desert { background-image: url(spritesmith-main-10.png); - background-position: -1408px -900px; + background-position: -1408px -1200px; width: 81px; height: 99px; } .Mount_Icon_Penguin-Golden { background-image: url(spritesmith-main-10.png); - background-position: -1408px -1000px; + background-position: 0px -1345px; width: 81px; height: 99px; } .Mount_Icon_Penguin-Red { background-image: url(spritesmith-main-10.png); - background-position: -1408px -1100px; + background-position: -82px -1345px; width: 81px; height: 99px; } .Mount_Icon_Penguin-Shade { background-image: url(spritesmith-main-10.png); - background-position: -1408px -1200px; + background-position: -164px -1345px; width: 81px; height: 99px; } .Mount_Icon_Penguin-Skeleton { background-image: url(spritesmith-main-10.png); - background-position: 0px -1345px; + background-position: -246px -1345px; width: 81px; height: 99px; } .Mount_Icon_Penguin-White { background-image: url(spritesmith-main-10.png); - background-position: -82px -1345px; + background-position: -328px -1345px; width: 81px; height: 99px; } .Mount_Icon_Penguin-Zombie { background-image: url(spritesmith-main-10.png); - background-position: -164px -1345px; + background-position: -410px -1345px; width: 81px; height: 99px; } @@ -1410,551 +1428,533 @@ } .Mount_Icon_Rat-Base { background-image: url(spritesmith-main-10.png); - background-position: -328px -1345px; + background-position: -574px -1345px; width: 81px; height: 99px; } .Mount_Icon_Rat-CottonCandyBlue { background-image: url(spritesmith-main-10.png); - background-position: -410px -1345px; + background-position: -656px -1345px; width: 81px; height: 99px; } .Mount_Icon_Rat-CottonCandyPink { background-image: url(spritesmith-main-10.png); - background-position: -492px -1345px; + background-position: -738px -1345px; width: 81px; height: 99px; } .Mount_Icon_Rat-Desert { background-image: url(spritesmith-main-10.png); - background-position: -574px -1345px; + background-position: -820px -1345px; width: 81px; height: 99px; } .Mount_Icon_Rat-Golden { background-image: url(spritesmith-main-10.png); - background-position: -656px -1345px; + background-position: -902px -1345px; width: 81px; height: 99px; } .Mount_Icon_Rat-Red { background-image: url(spritesmith-main-10.png); - background-position: -738px -1345px; + background-position: -984px -1345px; width: 81px; height: 99px; } .Mount_Icon_Rat-Shade { background-image: url(spritesmith-main-10.png); - background-position: -820px -1345px; + background-position: -1066px -1345px; width: 81px; height: 99px; } .Mount_Icon_Rat-Skeleton { background-image: url(spritesmith-main-10.png); - background-position: -902px -1345px; + background-position: -1148px -1345px; width: 81px; height: 99px; } .Mount_Icon_Rat-White { background-image: url(spritesmith-main-10.png); - background-position: -984px -1345px; + background-position: -1230px -1345px; width: 81px; height: 99px; } .Mount_Icon_Rat-Zombie { background-image: url(spritesmith-main-10.png); - background-position: -1066px -1345px; + background-position: -1312px -1345px; width: 81px; height: 99px; } .Mount_Icon_Rock-Base { background-image: url(spritesmith-main-10.png); - background-position: -1148px -1345px; + background-position: -1394px -1345px; width: 81px; height: 99px; } .Mount_Icon_Rock-CottonCandyBlue { background-image: url(spritesmith-main-10.png); - background-position: -1230px -1345px; + background-position: -1490px 0px; width: 81px; height: 99px; } .Mount_Icon_Rock-CottonCandyPink { background-image: url(spritesmith-main-10.png); - background-position: -1312px -1345px; + background-position: -1490px -100px; width: 81px; height: 99px; } .Mount_Icon_Rock-Desert { background-image: url(spritesmith-main-10.png); - background-position: -1394px -1345px; + background-position: -1490px -200px; width: 81px; height: 99px; } .Mount_Icon_Rock-Golden { background-image: url(spritesmith-main-10.png); - background-position: -1490px 0px; + background-position: -1490px -300px; width: 81px; height: 99px; } .Mount_Icon_Rock-Red { background-image: url(spritesmith-main-10.png); - background-position: -1490px -100px; + background-position: -1490px -400px; width: 81px; height: 99px; } .Mount_Icon_Rock-Shade { background-image: url(spritesmith-main-10.png); - background-position: -1490px -200px; + background-position: -1490px -500px; width: 81px; height: 99px; } .Mount_Icon_Rock-Skeleton { background-image: url(spritesmith-main-10.png); - background-position: -1490px -300px; + background-position: -1490px -600px; width: 81px; height: 99px; } .Mount_Icon_Rock-White { background-image: url(spritesmith-main-10.png); - background-position: -1490px -400px; + background-position: -1490px -700px; width: 81px; height: 99px; } .Mount_Icon_Rock-Zombie { background-image: url(spritesmith-main-10.png); - background-position: -1490px -500px; + background-position: -1490px -800px; width: 81px; height: 99px; } .Mount_Icon_Rooster-Base { background-image: url(spritesmith-main-10.png); - background-position: -1490px -600px; + background-position: -1490px -900px; width: 81px; height: 99px; } .Mount_Icon_Rooster-CottonCandyBlue { background-image: url(spritesmith-main-10.png); - background-position: -1490px -700px; + background-position: -1490px -1000px; width: 81px; height: 99px; } .Mount_Icon_Rooster-CottonCandyPink { background-image: url(spritesmith-main-10.png); - background-position: -1490px -800px; + background-position: -1490px -1100px; width: 81px; height: 99px; } .Mount_Icon_Rooster-Desert { background-image: url(spritesmith-main-10.png); - background-position: -1490px -900px; + background-position: -1490px -1200px; width: 81px; height: 99px; } .Mount_Icon_Rooster-Golden { background-image: url(spritesmith-main-10.png); - background-position: -1490px -1000px; + background-position: -1490px -1300px; width: 81px; height: 99px; } .Mount_Icon_Rooster-Red { background-image: url(spritesmith-main-10.png); - background-position: -1490px -1100px; + background-position: 0px -1445px; width: 81px; height: 99px; } .Mount_Icon_Rooster-Shade { background-image: url(spritesmith-main-10.png); - background-position: -1490px -1200px; + background-position: -82px -1445px; width: 81px; height: 99px; } .Mount_Icon_Rooster-Skeleton { background-image: url(spritesmith-main-10.png); - background-position: -1490px -1300px; + background-position: -164px -1445px; width: 81px; height: 99px; } .Mount_Icon_Rooster-White { background-image: url(spritesmith-main-10.png); - background-position: 0px -1445px; + background-position: -246px -1445px; width: 81px; height: 99px; } .Mount_Icon_Rooster-Zombie { background-image: url(spritesmith-main-10.png); - background-position: -82px -1445px; + background-position: -328px -1445px; width: 81px; height: 99px; } .Mount_Icon_Sabretooth-Base { background-image: url(spritesmith-main-10.png); - background-position: -164px -1445px; + background-position: -410px -1445px; width: 81px; height: 99px; } .Mount_Icon_Sabretooth-CottonCandyBlue { background-image: url(spritesmith-main-10.png); - background-position: -246px -1445px; + background-position: -492px -1445px; width: 81px; height: 99px; } .Mount_Icon_Sabretooth-CottonCandyPink { background-image: url(spritesmith-main-10.png); - background-position: -328px -1445px; + background-position: -574px -1445px; width: 81px; height: 99px; } .Mount_Icon_Sabretooth-Desert { background-image: url(spritesmith-main-10.png); - background-position: -410px -1445px; + background-position: -656px -1445px; width: 81px; height: 99px; } .Mount_Icon_Sabretooth-Golden { background-image: url(spritesmith-main-10.png); - background-position: -492px -1445px; + background-position: -738px -1445px; width: 81px; height: 99px; } .Mount_Icon_Sabretooth-Red { background-image: url(spritesmith-main-10.png); - background-position: -574px -1445px; + background-position: -820px -1445px; width: 81px; height: 99px; } .Mount_Icon_Sabretooth-Shade { background-image: url(spritesmith-main-10.png); - background-position: -656px -1445px; + background-position: -902px -1445px; width: 81px; height: 99px; } .Mount_Icon_Sabretooth-Skeleton { background-image: url(spritesmith-main-10.png); - background-position: -738px -1445px; + background-position: -984px -1445px; width: 81px; height: 99px; } .Mount_Icon_Sabretooth-White { background-image: url(spritesmith-main-10.png); - background-position: -820px -1445px; + background-position: -1066px -1445px; width: 81px; height: 99px; } .Mount_Icon_Sabretooth-Zombie { background-image: url(spritesmith-main-10.png); - background-position: -902px -1445px; + background-position: -1148px -1445px; width: 81px; height: 99px; } .Mount_Icon_Seahorse-Base { background-image: url(spritesmith-main-10.png); - background-position: -984px -1445px; + background-position: -1230px -1445px; width: 81px; height: 99px; } .Mount_Icon_Seahorse-CottonCandyBlue { background-image: url(spritesmith-main-10.png); - background-position: -1066px -1445px; + background-position: -1312px -1445px; width: 81px; height: 99px; } .Mount_Icon_Seahorse-CottonCandyPink { background-image: url(spritesmith-main-10.png); - background-position: -1148px -1445px; + background-position: -1394px -1445px; width: 81px; height: 99px; } .Mount_Icon_Seahorse-Desert { background-image: url(spritesmith-main-10.png); - background-position: -1230px -1445px; + background-position: -1476px -1445px; width: 81px; height: 99px; } .Mount_Icon_Seahorse-Golden { background-image: url(spritesmith-main-10.png); - background-position: -1312px -1445px; + background-position: -1572px 0px; width: 81px; height: 99px; } .Mount_Icon_Seahorse-Red { background-image: url(spritesmith-main-10.png); - background-position: -1394px -1445px; + background-position: -1572px -100px; width: 81px; height: 99px; } .Mount_Icon_Seahorse-Shade { background-image: url(spritesmith-main-10.png); - background-position: -1476px -1445px; + background-position: -1572px -200px; width: 81px; height: 99px; } .Mount_Icon_Seahorse-Skeleton { background-image: url(spritesmith-main-10.png); - background-position: -1572px 0px; + background-position: -1572px -300px; width: 81px; height: 99px; } .Mount_Icon_Seahorse-White { background-image: url(spritesmith-main-10.png); - background-position: -1572px -100px; + background-position: -1572px -400px; width: 81px; height: 99px; } .Mount_Icon_Seahorse-Zombie { background-image: url(spritesmith-main-10.png); - background-position: -1572px -200px; + background-position: -1572px -500px; width: 81px; height: 99px; } .Mount_Icon_Sheep-Base { background-image: url(spritesmith-main-10.png); - background-position: -1572px -300px; + background-position: -1572px -600px; width: 81px; height: 99px; } .Mount_Icon_Sheep-CottonCandyBlue { background-image: url(spritesmith-main-10.png); - background-position: -1572px -400px; + background-position: -1572px -700px; width: 81px; height: 99px; } .Mount_Icon_Sheep-CottonCandyPink { background-image: url(spritesmith-main-10.png); - background-position: -1572px -500px; + background-position: -1572px -800px; width: 81px; height: 99px; } .Mount_Icon_Sheep-Desert { background-image: url(spritesmith-main-10.png); - background-position: -1572px -600px; + background-position: -1572px -900px; width: 81px; height: 99px; } .Mount_Icon_Sheep-Golden { background-image: url(spritesmith-main-10.png); - background-position: -1572px -700px; + background-position: -1572px -1000px; width: 81px; height: 99px; } .Mount_Icon_Sheep-Red { background-image: url(spritesmith-main-10.png); - background-position: -1572px -800px; + background-position: -1572px -1100px; width: 81px; height: 99px; } .Mount_Icon_Sheep-Shade { background-image: url(spritesmith-main-10.png); - background-position: -1572px -900px; + background-position: -1572px -1200px; width: 81px; height: 99px; } .Mount_Icon_Sheep-Skeleton { background-image: url(spritesmith-main-10.png); - background-position: -1572px -1000px; + background-position: -1572px -1300px; width: 81px; height: 99px; } .Mount_Icon_Sheep-White { background-image: url(spritesmith-main-10.png); - background-position: -1572px -1100px; + background-position: -1572px -1400px; width: 81px; height: 99px; } .Mount_Icon_Sheep-Zombie { background-image: url(spritesmith-main-10.png); - background-position: -1572px -1200px; + background-position: 0px -1545px; width: 81px; height: 99px; } .Mount_Icon_Slime-Base { background-image: url(spritesmith-main-10.png); - background-position: -1572px -1300px; + background-position: -82px -1545px; width: 81px; height: 99px; } .Mount_Icon_Slime-CottonCandyBlue { background-image: url(spritesmith-main-10.png); - background-position: -1572px -1400px; + background-position: -164px -1545px; width: 81px; height: 99px; } .Mount_Icon_Slime-CottonCandyPink { background-image: url(spritesmith-main-10.png); - background-position: 0px -1545px; + background-position: -246px -1545px; width: 81px; height: 99px; } .Mount_Icon_Slime-Desert { background-image: url(spritesmith-main-10.png); - background-position: -82px -1545px; + background-position: -328px -1545px; width: 81px; height: 99px; } .Mount_Icon_Slime-Golden { background-image: url(spritesmith-main-10.png); - background-position: -164px -1545px; + background-position: -410px -1545px; width: 81px; height: 99px; } .Mount_Icon_Slime-Red { background-image: url(spritesmith-main-10.png); - background-position: -246px -1545px; + background-position: -492px -1545px; width: 81px; height: 99px; } .Mount_Icon_Slime-Shade { background-image: url(spritesmith-main-10.png); - background-position: -328px -1545px; + background-position: -574px -1545px; width: 81px; height: 99px; } .Mount_Icon_Slime-Skeleton { background-image: url(spritesmith-main-10.png); - background-position: -410px -1545px; + background-position: -656px -1545px; width: 81px; height: 99px; } .Mount_Icon_Slime-White { background-image: url(spritesmith-main-10.png); - background-position: -492px -1545px; + background-position: -738px -1545px; width: 81px; height: 99px; } .Mount_Icon_Slime-Zombie { background-image: url(spritesmith-main-10.png); - background-position: -574px -1545px; + background-position: -820px -1545px; width: 81px; height: 99px; } .Mount_Icon_Snail-Base { background-image: url(spritesmith-main-10.png); - background-position: -656px -1545px; + background-position: -902px -1545px; width: 81px; height: 99px; } .Mount_Icon_Snail-CottonCandyBlue { background-image: url(spritesmith-main-10.png); - background-position: -738px -1545px; + background-position: -984px -1545px; width: 81px; height: 99px; } .Mount_Icon_Snail-CottonCandyPink { background-image: url(spritesmith-main-10.png); - background-position: -820px -1545px; + background-position: -1066px -1545px; width: 81px; height: 99px; } .Mount_Icon_Snail-Desert { background-image: url(spritesmith-main-10.png); - background-position: -902px -1545px; + background-position: -1148px -1545px; width: 81px; height: 99px; } .Mount_Icon_Snail-Golden { background-image: url(spritesmith-main-10.png); - background-position: -984px -1545px; + background-position: -1230px -1545px; width: 81px; height: 99px; } .Mount_Icon_Snail-Red { background-image: url(spritesmith-main-10.png); - background-position: -1066px -1545px; + background-position: -1312px -1545px; width: 81px; height: 99px; } .Mount_Icon_Snail-Shade { background-image: url(spritesmith-main-10.png); - background-position: -1148px -1545px; + background-position: -1394px -1545px; width: 81px; height: 99px; } .Mount_Icon_Snail-Skeleton { background-image: url(spritesmith-main-10.png); - background-position: -1230px -1545px; + background-position: -1476px -1545px; width: 81px; height: 99px; } .Mount_Icon_Snail-White { background-image: url(spritesmith-main-10.png); - background-position: -1312px -1545px; + background-position: -1558px -1545px; width: 81px; height: 99px; } .Mount_Icon_Snail-Zombie { background-image: url(spritesmith-main-10.png); - background-position: -1394px -1545px; + background-position: -1654px 0px; width: 81px; height: 99px; } .Mount_Icon_Snake-Base { background-image: url(spritesmith-main-10.png); - background-position: -1476px -1545px; + background-position: -1654px -100px; width: 81px; height: 99px; } .Mount_Icon_Snake-CottonCandyBlue { background-image: url(spritesmith-main-10.png); - background-position: -1558px -1545px; + background-position: -1654px -200px; width: 81px; height: 99px; } .Mount_Icon_Snake-CottonCandyPink { background-image: url(spritesmith-main-10.png); - background-position: -1654px 0px; + background-position: -1654px -300px; width: 81px; height: 99px; } .Mount_Icon_Snake-Desert { background-image: url(spritesmith-main-10.png); - background-position: -1654px -100px; + background-position: -1654px -400px; width: 81px; height: 99px; } .Mount_Icon_Snake-Golden { background-image: url(spritesmith-main-10.png); - background-position: -1654px -200px; + background-position: -1654px -500px; width: 81px; height: 99px; } .Mount_Icon_Snake-Red { background-image: url(spritesmith-main-10.png); - background-position: -1654px -300px; + background-position: -1654px -600px; width: 81px; height: 99px; } .Mount_Icon_Snake-Shade { background-image: url(spritesmith-main-10.png); - background-position: -1654px -400px; + background-position: -1654px -700px; width: 81px; height: 99px; } .Mount_Icon_Snake-Skeleton { background-image: url(spritesmith-main-10.png); - background-position: -1654px -500px; + background-position: -1654px -800px; width: 81px; height: 99px; } .Mount_Icon_Snake-White { - background-image: url(spritesmith-main-10.png); - background-position: -1654px -600px; - width: 81px; - height: 99px; -} -.Mount_Icon_Snake-Zombie { - background-image: url(spritesmith-main-10.png); - background-position: -1654px -700px; - width: 81px; - height: 99px; -} -.Mount_Icon_Spider-Base { - background-image: url(spritesmith-main-10.png); - background-position: -1654px -800px; - width: 81px; - height: 99px; -} -.Mount_Icon_Spider-CottonCandyBlue { background-image: url(spritesmith-main-10.png); background-position: -1654px -900px; width: 81px; diff --git a/common/dist/sprites/spritesmith-main-10.png b/common/dist/sprites/spritesmith-main-10.png index 5085549e58..605fbe38f7 100644 Binary files a/common/dist/sprites/spritesmith-main-10.png and b/common/dist/sprites/spritesmith-main-10.png differ diff --git a/common/dist/sprites/spritesmith-main-11.css b/common/dist/sprites/spritesmith-main-11.css index f0a9e665fe..439ad544f5 100644 --- a/common/dist/sprites/spritesmith-main-11.css +++ b/common/dist/sprites/spritesmith-main-11.css @@ -1,1990 +1,1990 @@ -.Mount_Icon_Spider-CottonCandyPink { +.Mount_Icon_Snake-Zombie { background-image: url(spritesmith-main-11.png); background-position: -82px 0px; width: 81px; height: 99px; } -.Mount_Icon_Spider-Desert { +.Mount_Icon_Spider-Base { background-image: url(spritesmith-main-11.png); background-position: -82px -1100px; width: 81px; height: 99px; } -.Mount_Icon_Spider-Golden { +.Mount_Icon_Spider-CottonCandyBlue { background-image: url(spritesmith-main-11.png); background-position: -164px 0px; width: 81px; height: 99px; } -.Mount_Icon_Spider-Red { +.Mount_Icon_Spider-CottonCandyPink { background-image: url(spritesmith-main-11.png); background-position: 0px -100px; width: 81px; height: 99px; } -.Mount_Icon_Spider-Shade { +.Mount_Icon_Spider-Desert { background-image: url(spritesmith-main-11.png); background-position: -82px -100px; width: 81px; height: 99px; } -.Mount_Icon_Spider-Skeleton { +.Mount_Icon_Spider-Golden { background-image: url(spritesmith-main-11.png); background-position: -164px -100px; width: 81px; height: 99px; } -.Mount_Icon_Spider-White { +.Mount_Icon_Spider-Red { background-image: url(spritesmith-main-11.png); background-position: -246px 0px; width: 81px; height: 99px; } -.Mount_Icon_Spider-Zombie { +.Mount_Icon_Spider-Shade { background-image: url(spritesmith-main-11.png); background-position: -246px -100px; width: 81px; height: 99px; } -.Mount_Icon_TRex-Base { - background-image: url(spritesmith-main-11.png); - background-position: -410px 0px; - width: 81px; - height: 99px; -} -.Mount_Icon_TRex-CottonCandyBlue { - background-image: url(spritesmith-main-11.png); - background-position: -410px -100px; - width: 81px; - height: 99px; -} -.Mount_Icon_TRex-CottonCandyPink { - background-image: url(spritesmith-main-11.png); - background-position: -410px -200px; - width: 81px; - height: 99px; -} -.Mount_Icon_TRex-Desert { - background-image: url(spritesmith-main-11.png); - background-position: -410px -300px; - width: 81px; - height: 99px; -} -.Mount_Icon_TRex-Golden { - background-image: url(spritesmith-main-11.png); - background-position: -492px 0px; - width: 81px; - height: 99px; -} -.Mount_Icon_TRex-Red { - background-image: url(spritesmith-main-11.png); - background-position: -492px -100px; - width: 81px; - height: 99px; -} -.Mount_Icon_TRex-Shade { - background-image: url(spritesmith-main-11.png); - background-position: -492px -200px; - width: 81px; - height: 99px; -} -.Mount_Icon_TRex-Skeleton { - background-image: url(spritesmith-main-11.png); - background-position: -492px -300px; - width: 81px; - height: 99px; -} -.Mount_Icon_TRex-White { - background-image: url(spritesmith-main-11.png); - background-position: 0px -400px; - width: 81px; - height: 99px; -} -.Mount_Icon_TRex-Zombie { - background-image: url(spritesmith-main-11.png); - background-position: -82px -400px; - width: 81px; - height: 99px; -} -.Mount_Icon_TigerCub-Base { +.Mount_Icon_Spider-Skeleton { background-image: url(spritesmith-main-11.png); background-position: 0px -200px; width: 81px; height: 99px; } -.Mount_Icon_TigerCub-CottonCandyBlue { +.Mount_Icon_Spider-White { background-image: url(spritesmith-main-11.png); background-position: -82px -200px; width: 81px; height: 99px; } -.Mount_Icon_TigerCub-CottonCandyPink { +.Mount_Icon_Spider-Zombie { background-image: url(spritesmith-main-11.png); background-position: -164px -200px; width: 81px; height: 99px; } -.Mount_Icon_TigerCub-Desert { +.Mount_Icon_TRex-Base { background-image: url(spritesmith-main-11.png); - background-position: -246px -200px; + background-position: -410px -300px; width: 81px; height: 99px; } -.Mount_Icon_TigerCub-Golden { +.Mount_Icon_TRex-CottonCandyBlue { background-image: url(spritesmith-main-11.png); - background-position: -328px 0px; + background-position: -492px 0px; width: 81px; height: 99px; } -.Mount_Icon_TigerCub-Peppermint { +.Mount_Icon_TRex-CottonCandyPink { background-image: url(spritesmith-main-11.png); - background-position: -328px -100px; + background-position: -492px -100px; width: 81px; height: 99px; } -.Mount_Icon_TigerCub-Red { +.Mount_Icon_TRex-Desert { background-image: url(spritesmith-main-11.png); - background-position: -328px -200px; + background-position: -492px -200px; width: 81px; height: 99px; } -.Mount_Icon_TigerCub-Shade { +.Mount_Icon_TRex-Golden { background-image: url(spritesmith-main-11.png); - background-position: 0px -300px; + background-position: -492px -300px; width: 81px; height: 99px; } -.Mount_Icon_TigerCub-Skeleton { +.Mount_Icon_TRex-Red { background-image: url(spritesmith-main-11.png); - background-position: -82px -300px; + background-position: 0px -400px; width: 81px; height: 99px; } -.Mount_Icon_TigerCub-Spooky { +.Mount_Icon_TRex-Shade { background-image: url(spritesmith-main-11.png); - background-position: -164px -300px; + background-position: -82px -400px; width: 81px; height: 99px; } -.Mount_Icon_TigerCub-White { - background-image: url(spritesmith-main-11.png); - background-position: -246px -300px; - width: 81px; - height: 99px; -} -.Mount_Icon_TigerCub-Zombie { - background-image: url(spritesmith-main-11.png); - background-position: -328px -300px; - width: 81px; - height: 99px; -} -.Mount_Icon_Turkey-Base { +.Mount_Icon_TRex-Skeleton { background-image: url(spritesmith-main-11.png); background-position: -164px -400px; width: 81px; height: 99px; } -.Mount_Icon_Unicorn-Base { +.Mount_Icon_TRex-White { background-image: url(spritesmith-main-11.png); background-position: -246px -400px; width: 81px; height: 99px; } -.Mount_Icon_Unicorn-CottonCandyBlue { +.Mount_Icon_TRex-Zombie { background-image: url(spritesmith-main-11.png); background-position: -328px -400px; width: 81px; height: 99px; } -.Mount_Icon_Unicorn-CottonCandyPink { +.Mount_Icon_TigerCub-Base { + background-image: url(spritesmith-main-11.png); + background-position: -246px -200px; + width: 81px; + height: 99px; +} +.Mount_Icon_TigerCub-CottonCandyBlue { + background-image: url(spritesmith-main-11.png); + background-position: -328px 0px; + width: 81px; + height: 99px; +} +.Mount_Icon_TigerCub-CottonCandyPink { + background-image: url(spritesmith-main-11.png); + background-position: -328px -100px; + width: 81px; + height: 99px; +} +.Mount_Icon_TigerCub-Desert { + background-image: url(spritesmith-main-11.png); + background-position: -328px -200px; + width: 81px; + height: 99px; +} +.Mount_Icon_TigerCub-Golden { + background-image: url(spritesmith-main-11.png); + background-position: 0px -300px; + width: 81px; + height: 99px; +} +.Mount_Icon_TigerCub-Peppermint { + background-image: url(spritesmith-main-11.png); + background-position: -82px -300px; + width: 81px; + height: 99px; +} +.Mount_Icon_TigerCub-Red { + background-image: url(spritesmith-main-11.png); + background-position: -164px -300px; + width: 81px; + height: 99px; +} +.Mount_Icon_TigerCub-Shade { + background-image: url(spritesmith-main-11.png); + background-position: -246px -300px; + width: 81px; + height: 99px; +} +.Mount_Icon_TigerCub-Skeleton { + background-image: url(spritesmith-main-11.png); + background-position: -328px -300px; + width: 81px; + height: 99px; +} +.Mount_Icon_TigerCub-Spooky { + background-image: url(spritesmith-main-11.png); + background-position: -410px 0px; + width: 81px; + height: 99px; +} +.Mount_Icon_TigerCub-White { + background-image: url(spritesmith-main-11.png); + background-position: -410px -100px; + width: 81px; + height: 99px; +} +.Mount_Icon_TigerCub-Zombie { + background-image: url(spritesmith-main-11.png); + background-position: -410px -200px; + width: 81px; + height: 99px; +} +.Mount_Icon_Turkey-Base { background-image: url(spritesmith-main-11.png); background-position: -410px -400px; width: 81px; height: 99px; } -.Mount_Icon_Unicorn-Desert { +.Mount_Icon_Unicorn-Base { background-image: url(spritesmith-main-11.png); background-position: -492px -400px; width: 81px; height: 99px; } -.Mount_Icon_Unicorn-Golden { +.Mount_Icon_Unicorn-CottonCandyBlue { background-image: url(spritesmith-main-11.png); background-position: -574px 0px; width: 81px; height: 99px; } -.Mount_Icon_Unicorn-Red { +.Mount_Icon_Unicorn-CottonCandyPink { background-image: url(spritesmith-main-11.png); background-position: -574px -100px; width: 81px; height: 99px; } -.Mount_Icon_Unicorn-Shade { +.Mount_Icon_Unicorn-Desert { background-image: url(spritesmith-main-11.png); background-position: -574px -200px; width: 81px; height: 99px; } -.Mount_Icon_Unicorn-Skeleton { +.Mount_Icon_Unicorn-Golden { background-image: url(spritesmith-main-11.png); background-position: -574px -300px; width: 81px; height: 99px; } -.Mount_Icon_Unicorn-White { +.Mount_Icon_Unicorn-Red { background-image: url(spritesmith-main-11.png); background-position: -574px -400px; width: 81px; height: 99px; } -.Mount_Icon_Unicorn-Zombie { +.Mount_Icon_Unicorn-Shade { background-image: url(spritesmith-main-11.png); background-position: 0px -500px; width: 81px; height: 99px; } -.Mount_Icon_Whale-Base { +.Mount_Icon_Unicorn-Skeleton { background-image: url(spritesmith-main-11.png); background-position: -82px -500px; width: 81px; height: 99px; } -.Mount_Icon_Whale-CottonCandyBlue { +.Mount_Icon_Unicorn-White { background-image: url(spritesmith-main-11.png); background-position: -164px -500px; width: 81px; height: 99px; } -.Mount_Icon_Whale-CottonCandyPink { +.Mount_Icon_Unicorn-Zombie { background-image: url(spritesmith-main-11.png); background-position: -246px -500px; width: 81px; height: 99px; } -.Mount_Icon_Whale-Desert { +.Mount_Icon_Whale-Base { background-image: url(spritesmith-main-11.png); background-position: -328px -500px; width: 81px; height: 99px; } -.Mount_Icon_Whale-Golden { +.Mount_Icon_Whale-CottonCandyBlue { background-image: url(spritesmith-main-11.png); background-position: -410px -500px; width: 81px; height: 99px; } -.Mount_Icon_Whale-Red { +.Mount_Icon_Whale-CottonCandyPink { background-image: url(spritesmith-main-11.png); background-position: -492px -500px; width: 81px; height: 99px; } -.Mount_Icon_Whale-Shade { +.Mount_Icon_Whale-Desert { background-image: url(spritesmith-main-11.png); background-position: -574px -500px; width: 81px; height: 99px; } -.Mount_Icon_Whale-Skeleton { +.Mount_Icon_Whale-Golden { background-image: url(spritesmith-main-11.png); background-position: -656px 0px; width: 81px; height: 99px; } -.Mount_Icon_Whale-White { +.Mount_Icon_Whale-Red { background-image: url(spritesmith-main-11.png); background-position: -656px -100px; width: 81px; height: 99px; } -.Mount_Icon_Whale-Zombie { +.Mount_Icon_Whale-Shade { background-image: url(spritesmith-main-11.png); background-position: -656px -200px; width: 81px; height: 99px; } -.Mount_Icon_Wolf-Base { +.Mount_Icon_Whale-Skeleton { background-image: url(spritesmith-main-11.png); background-position: -656px -300px; width: 81px; height: 99px; } -.Mount_Icon_Wolf-CottonCandyBlue { +.Mount_Icon_Whale-White { background-image: url(spritesmith-main-11.png); background-position: -656px -400px; width: 81px; height: 99px; } -.Mount_Icon_Wolf-CottonCandyPink { +.Mount_Icon_Whale-Zombie { background-image: url(spritesmith-main-11.png); background-position: -656px -500px; width: 81px; height: 99px; } -.Mount_Icon_Wolf-Desert { +.Mount_Icon_Wolf-Base { background-image: url(spritesmith-main-11.png); background-position: 0px -600px; width: 81px; height: 99px; } -.Mount_Icon_Wolf-Golden { +.Mount_Icon_Wolf-CottonCandyBlue { background-image: url(spritesmith-main-11.png); background-position: -82px -600px; width: 81px; height: 99px; } -.Mount_Icon_Wolf-Peppermint { +.Mount_Icon_Wolf-CottonCandyPink { background-image: url(spritesmith-main-11.png); background-position: -164px -600px; width: 81px; height: 99px; } -.Mount_Icon_Wolf-Red { +.Mount_Icon_Wolf-Desert { background-image: url(spritesmith-main-11.png); background-position: -246px -600px; width: 81px; height: 99px; } -.Mount_Icon_Wolf-Shade { +.Mount_Icon_Wolf-Golden { background-image: url(spritesmith-main-11.png); background-position: -328px -600px; width: 81px; height: 99px; } -.Mount_Icon_Wolf-Skeleton { +.Mount_Icon_Wolf-Peppermint { background-image: url(spritesmith-main-11.png); background-position: -410px -600px; width: 81px; height: 99px; } -.Mount_Icon_Wolf-Spooky { +.Mount_Icon_Wolf-Red { background-image: url(spritesmith-main-11.png); background-position: -492px -600px; width: 81px; height: 99px; } -.Mount_Icon_Wolf-White { +.Mount_Icon_Wolf-Shade { background-image: url(spritesmith-main-11.png); background-position: -574px -600px; width: 81px; height: 99px; } -.Mount_Icon_Wolf-Zombie { +.Mount_Icon_Wolf-Skeleton { background-image: url(spritesmith-main-11.png); background-position: -656px -600px; width: 81px; height: 99px; } -.Pet-BearCub-Base { +.Mount_Icon_Wolf-Spooky { background-image: url(spritesmith-main-11.png); background-position: -738px 0px; width: 81px; height: 99px; } -.Pet-BearCub-CottonCandyBlue { +.Mount_Icon_Wolf-White { background-image: url(spritesmith-main-11.png); background-position: -738px -100px; width: 81px; height: 99px; } -.Pet-BearCub-CottonCandyPink { +.Mount_Icon_Wolf-Zombie { background-image: url(spritesmith-main-11.png); background-position: -738px -200px; width: 81px; height: 99px; } -.Pet-BearCub-Desert { +.Pet-BearCub-Base { background-image: url(spritesmith-main-11.png); background-position: -738px -300px; width: 81px; height: 99px; } -.Pet-BearCub-Golden { +.Pet-BearCub-CottonCandyBlue { background-image: url(spritesmith-main-11.png); background-position: -738px -400px; width: 81px; height: 99px; } -.Pet-BearCub-Peppermint { +.Pet-BearCub-CottonCandyPink { background-image: url(spritesmith-main-11.png); background-position: -738px -500px; width: 81px; height: 99px; } -.Pet-BearCub-Polar { +.Pet-BearCub-Desert { background-image: url(spritesmith-main-11.png); background-position: -738px -600px; width: 81px; height: 99px; } -.Pet-BearCub-Red { +.Pet-BearCub-Golden { background-image: url(spritesmith-main-11.png); background-position: 0px -700px; width: 81px; height: 99px; } -.Pet-BearCub-Shade { +.Pet-BearCub-Peppermint { background-image: url(spritesmith-main-11.png); background-position: -82px -700px; width: 81px; height: 99px; } -.Pet-BearCub-Skeleton { +.Pet-BearCub-Polar { background-image: url(spritesmith-main-11.png); background-position: -164px -700px; width: 81px; height: 99px; } -.Pet-BearCub-Spooky { +.Pet-BearCub-Red { background-image: url(spritesmith-main-11.png); background-position: -246px -700px; width: 81px; height: 99px; } -.Pet-BearCub-White { +.Pet-BearCub-Shade { background-image: url(spritesmith-main-11.png); background-position: -328px -700px; width: 81px; height: 99px; } -.Pet-BearCub-Zombie { +.Pet-BearCub-Skeleton { background-image: url(spritesmith-main-11.png); background-position: -410px -700px; width: 81px; height: 99px; } -.Pet-Bumblebee-Base { +.Pet-BearCub-Spooky { background-image: url(spritesmith-main-11.png); background-position: -492px -700px; width: 81px; height: 99px; } -.Pet-Bunny-Base { +.Pet-BearCub-White { background-image: url(spritesmith-main-11.png); background-position: -574px -700px; width: 81px; height: 99px; } -.Pet-Bunny-CottonCandyBlue { +.Pet-BearCub-Zombie { background-image: url(spritesmith-main-11.png); background-position: -656px -700px; width: 81px; height: 99px; } -.Pet-Bunny-CottonCandyPink { +.Pet-Bunny-Base { background-image: url(spritesmith-main-11.png); background-position: -738px -700px; width: 81px; height: 99px; } -.Pet-Bunny-Desert { +.Pet-Bunny-CottonCandyBlue { background-image: url(spritesmith-main-11.png); background-position: -820px 0px; width: 81px; height: 99px; } -.Pet-Bunny-Golden { +.Pet-Bunny-CottonCandyPink { background-image: url(spritesmith-main-11.png); background-position: -820px -100px; width: 81px; height: 99px; } -.Pet-Bunny-Red { +.Pet-Bunny-Desert { background-image: url(spritesmith-main-11.png); background-position: -820px -200px; width: 81px; height: 99px; } -.Pet-Bunny-Shade { +.Pet-Bunny-Golden { background-image: url(spritesmith-main-11.png); background-position: -820px -300px; width: 81px; height: 99px; } -.Pet-Bunny-Skeleton { +.Pet-Bunny-Red { background-image: url(spritesmith-main-11.png); background-position: -820px -400px; width: 81px; height: 99px; } -.Pet-Bunny-White { +.Pet-Bunny-Shade { background-image: url(spritesmith-main-11.png); background-position: -820px -500px; width: 81px; height: 99px; } -.Pet-Bunny-Zombie { +.Pet-Bunny-Skeleton { background-image: url(spritesmith-main-11.png); background-position: -820px -600px; width: 81px; height: 99px; } -.Pet-Cactus-Base { +.Pet-Bunny-White { background-image: url(spritesmith-main-11.png); background-position: -820px -700px; width: 81px; height: 99px; } -.Pet-Cactus-CottonCandyBlue { +.Pet-Bunny-Zombie { background-image: url(spritesmith-main-11.png); background-position: 0px -800px; width: 81px; height: 99px; } -.Pet-Cactus-CottonCandyPink { +.Pet-Cactus-Base { background-image: url(spritesmith-main-11.png); background-position: -82px -800px; width: 81px; height: 99px; } -.Pet-Cactus-Desert { +.Pet-Cactus-CottonCandyBlue { background-image: url(spritesmith-main-11.png); background-position: -164px -800px; width: 81px; height: 99px; } -.Pet-Cactus-Golden { +.Pet-Cactus-CottonCandyPink { background-image: url(spritesmith-main-11.png); background-position: -246px -800px; width: 81px; height: 99px; } -.Pet-Cactus-Peppermint { +.Pet-Cactus-Desert { background-image: url(spritesmith-main-11.png); background-position: -328px -800px; width: 81px; height: 99px; } -.Pet-Cactus-Red { +.Pet-Cactus-Golden { background-image: url(spritesmith-main-11.png); background-position: -410px -800px; width: 81px; height: 99px; } -.Pet-Cactus-Shade { +.Pet-Cactus-Peppermint { background-image: url(spritesmith-main-11.png); background-position: -492px -800px; width: 81px; height: 99px; } -.Pet-Cactus-Skeleton { +.Pet-Cactus-Red { background-image: url(spritesmith-main-11.png); background-position: -574px -800px; width: 81px; height: 99px; } -.Pet-Cactus-Spooky { +.Pet-Cactus-Shade { background-image: url(spritesmith-main-11.png); background-position: -656px -800px; width: 81px; height: 99px; } -.Pet-Cactus-White { +.Pet-Cactus-Skeleton { background-image: url(spritesmith-main-11.png); background-position: -738px -800px; width: 81px; height: 99px; } -.Pet-Cactus-Zombie { +.Pet-Cactus-Spooky { background-image: url(spritesmith-main-11.png); background-position: -820px -800px; width: 81px; height: 99px; } -.Pet-Cheetah-Base { +.Pet-Cactus-White { background-image: url(spritesmith-main-11.png); background-position: -902px 0px; width: 81px; height: 99px; } -.Pet-Cheetah-CottonCandyBlue { +.Pet-Cactus-Zombie { background-image: url(spritesmith-main-11.png); background-position: -902px -100px; width: 81px; height: 99px; } -.Pet-Cheetah-CottonCandyPink { +.Pet-Cheetah-Base { background-image: url(spritesmith-main-11.png); background-position: -902px -200px; width: 81px; height: 99px; } -.Pet-Cheetah-Desert { +.Pet-Cheetah-CottonCandyBlue { background-image: url(spritesmith-main-11.png); background-position: -902px -300px; width: 81px; height: 99px; } -.Pet-Cheetah-Golden { +.Pet-Cheetah-CottonCandyPink { background-image: url(spritesmith-main-11.png); background-position: -902px -400px; width: 81px; height: 99px; } -.Pet-Cheetah-Red { +.Pet-Cheetah-Desert { background-image: url(spritesmith-main-11.png); background-position: -902px -500px; width: 81px; height: 99px; } -.Pet-Cheetah-Shade { +.Pet-Cheetah-Golden { background-image: url(spritesmith-main-11.png); background-position: -902px -600px; width: 81px; height: 99px; } -.Pet-Cheetah-Skeleton { +.Pet-Cheetah-Red { background-image: url(spritesmith-main-11.png); background-position: -902px -700px; width: 81px; height: 99px; } -.Pet-Cheetah-White { +.Pet-Cheetah-Shade { background-image: url(spritesmith-main-11.png); background-position: -902px -800px; width: 81px; height: 99px; } -.Pet-Cheetah-Zombie { +.Pet-Cheetah-Skeleton { background-image: url(spritesmith-main-11.png); background-position: -984px 0px; width: 81px; height: 99px; } -.Pet-Cuttlefish-Base { +.Pet-Cheetah-White { background-image: url(spritesmith-main-11.png); background-position: -984px -100px; width: 81px; height: 99px; } -.Pet-Cuttlefish-CottonCandyBlue { +.Pet-Cheetah-Zombie { background-image: url(spritesmith-main-11.png); background-position: -984px -200px; width: 81px; height: 99px; } -.Pet-Cuttlefish-CottonCandyPink { +.Pet-Cuttlefish-Base { background-image: url(spritesmith-main-11.png); background-position: -984px -300px; width: 81px; height: 99px; } -.Pet-Cuttlefish-Desert { +.Pet-Cuttlefish-CottonCandyBlue { background-image: url(spritesmith-main-11.png); background-position: -984px -400px; width: 81px; height: 99px; } -.Pet-Cuttlefish-Golden { +.Pet-Cuttlefish-CottonCandyPink { background-image: url(spritesmith-main-11.png); background-position: -984px -500px; width: 81px; height: 99px; } -.Pet-Cuttlefish-Red { +.Pet-Cuttlefish-Desert { background-image: url(spritesmith-main-11.png); background-position: -984px -600px; width: 81px; height: 99px; } -.Pet-Cuttlefish-Shade { +.Pet-Cuttlefish-Golden { background-image: url(spritesmith-main-11.png); background-position: -984px -700px; width: 81px; height: 99px; } -.Pet-Cuttlefish-Skeleton { +.Pet-Cuttlefish-Red { background-image: url(spritesmith-main-11.png); background-position: -984px -800px; width: 81px; height: 99px; } -.Pet-Cuttlefish-White { +.Pet-Cuttlefish-Shade { background-image: url(spritesmith-main-11.png); background-position: 0px -900px; width: 81px; height: 99px; } -.Pet-Cuttlefish-Zombie { +.Pet-Cuttlefish-Skeleton { background-image: url(spritesmith-main-11.png); background-position: -82px -900px; width: 81px; height: 99px; } -.Pet-Deer-Base { +.Pet-Cuttlefish-White { background-image: url(spritesmith-main-11.png); background-position: -164px -900px; width: 81px; height: 99px; } -.Pet-Deer-CottonCandyBlue { +.Pet-Cuttlefish-Zombie { background-image: url(spritesmith-main-11.png); background-position: -246px -900px; width: 81px; height: 99px; } -.Pet-Deer-CottonCandyPink { +.Pet-Deer-Base { background-image: url(spritesmith-main-11.png); background-position: -328px -900px; width: 81px; height: 99px; } -.Pet-Deer-Desert { +.Pet-Deer-CottonCandyBlue { background-image: url(spritesmith-main-11.png); background-position: -410px -900px; width: 81px; height: 99px; } -.Pet-Deer-Golden { +.Pet-Deer-CottonCandyPink { background-image: url(spritesmith-main-11.png); background-position: -492px -900px; width: 81px; height: 99px; } -.Pet-Deer-Red { +.Pet-Deer-Desert { background-image: url(spritesmith-main-11.png); background-position: -574px -900px; width: 81px; height: 99px; } -.Pet-Deer-Shade { +.Pet-Deer-Golden { background-image: url(spritesmith-main-11.png); background-position: -656px -900px; width: 81px; height: 99px; } -.Pet-Deer-Skeleton { +.Pet-Deer-Red { background-image: url(spritesmith-main-11.png); background-position: -738px -900px; width: 81px; height: 99px; } -.Pet-Deer-White { +.Pet-Deer-Shade { background-image: url(spritesmith-main-11.png); background-position: -820px -900px; width: 81px; height: 99px; } -.Pet-Deer-Zombie { +.Pet-Deer-Skeleton { background-image: url(spritesmith-main-11.png); background-position: -902px -900px; width: 81px; height: 99px; } -.Pet-Dragon-Base { +.Pet-Deer-White { background-image: url(spritesmith-main-11.png); background-position: -984px -900px; width: 81px; height: 99px; } -.Pet-Dragon-CottonCandyBlue { +.Pet-Deer-Zombie { background-image: url(spritesmith-main-11.png); background-position: -1066px 0px; width: 81px; height: 99px; } -.Pet-Dragon-CottonCandyPink { +.Pet-Dragon-Base { background-image: url(spritesmith-main-11.png); background-position: -1066px -100px; width: 81px; height: 99px; } -.Pet-Dragon-Desert { +.Pet-Dragon-CottonCandyBlue { background-image: url(spritesmith-main-11.png); background-position: -1066px -200px; width: 81px; height: 99px; } -.Pet-Dragon-Golden { +.Pet-Dragon-CottonCandyPink { background-image: url(spritesmith-main-11.png); background-position: -1066px -300px; width: 81px; height: 99px; } -.Pet-Dragon-Hydra { +.Pet-Dragon-Desert { background-image: url(spritesmith-main-11.png); background-position: -1066px -400px; width: 81px; height: 99px; } -.Pet-Dragon-Peppermint { +.Pet-Dragon-Golden { background-image: url(spritesmith-main-11.png); background-position: -1066px -500px; width: 81px; height: 99px; } -.Pet-Dragon-Red { +.Pet-Dragon-Hydra { background-image: url(spritesmith-main-11.png); background-position: -1066px -600px; width: 81px; height: 99px; } -.Pet-Dragon-Shade { +.Pet-Dragon-Peppermint { background-image: url(spritesmith-main-11.png); background-position: -1066px -700px; width: 81px; height: 99px; } -.Pet-Dragon-Skeleton { +.Pet-Dragon-Red { background-image: url(spritesmith-main-11.png); background-position: -1066px -800px; width: 81px; height: 99px; } -.Pet-Dragon-Spooky { +.Pet-Dragon-Shade { background-image: url(spritesmith-main-11.png); background-position: -1066px -900px; width: 81px; height: 99px; } -.Pet-Dragon-White { +.Pet-Dragon-Skeleton { background-image: url(spritesmith-main-11.png); background-position: 0px -1000px; width: 81px; height: 99px; } -.Pet-Dragon-Zombie { +.Pet-Dragon-Spooky { background-image: url(spritesmith-main-11.png); background-position: -82px -1000px; width: 81px; height: 99px; } -.Pet-Egg-Base { +.Pet-Dragon-White { background-image: url(spritesmith-main-11.png); background-position: -164px -1000px; width: 81px; height: 99px; } -.Pet-Egg-CottonCandyBlue { +.Pet-Dragon-Zombie { background-image: url(spritesmith-main-11.png); background-position: -246px -1000px; width: 81px; height: 99px; } -.Pet-Egg-CottonCandyPink { +.Pet-Egg-Base { background-image: url(spritesmith-main-11.png); background-position: -328px -1000px; width: 81px; height: 99px; } -.Pet-Egg-Desert { +.Pet-Egg-CottonCandyBlue { background-image: url(spritesmith-main-11.png); background-position: -410px -1000px; width: 81px; height: 99px; } -.Pet-Egg-Golden { +.Pet-Egg-CottonCandyPink { background-image: url(spritesmith-main-11.png); background-position: -492px -1000px; width: 81px; height: 99px; } -.Pet-Egg-Red { +.Pet-Egg-Desert { background-image: url(spritesmith-main-11.png); background-position: -574px -1000px; width: 81px; height: 99px; } -.Pet-Egg-Shade { +.Pet-Egg-Golden { background-image: url(spritesmith-main-11.png); background-position: -656px -1000px; width: 81px; height: 99px; } -.Pet-Egg-Skeleton { +.Pet-Egg-Red { background-image: url(spritesmith-main-11.png); background-position: -738px -1000px; width: 81px; height: 99px; } -.Pet-Egg-White { +.Pet-Egg-Shade { background-image: url(spritesmith-main-11.png); background-position: -820px -1000px; width: 81px; height: 99px; } -.Pet-Egg-Zombie { +.Pet-Egg-Skeleton { background-image: url(spritesmith-main-11.png); background-position: -902px -1000px; width: 81px; height: 99px; } -.Pet-Falcon-Base { +.Pet-Egg-White { background-image: url(spritesmith-main-11.png); background-position: -984px -1000px; width: 81px; height: 99px; } -.Pet-Falcon-CottonCandyBlue { +.Pet-Egg-Zombie { background-image: url(spritesmith-main-11.png); background-position: -1066px -1000px; width: 81px; height: 99px; } -.Pet-Falcon-CottonCandyPink { +.Pet-Falcon-Base { background-image: url(spritesmith-main-11.png); background-position: -1148px 0px; width: 81px; height: 99px; } -.Pet-Falcon-Desert { +.Pet-Falcon-CottonCandyBlue { background-image: url(spritesmith-main-11.png); background-position: -1148px -100px; width: 81px; height: 99px; } -.Pet-Falcon-Golden { +.Pet-Falcon-CottonCandyPink { background-image: url(spritesmith-main-11.png); background-position: -1148px -200px; width: 81px; height: 99px; } -.Pet-Falcon-Red { +.Pet-Falcon-Desert { background-image: url(spritesmith-main-11.png); background-position: -1148px -300px; width: 81px; height: 99px; } -.Pet-Falcon-Shade { +.Pet-Falcon-Golden { background-image: url(spritesmith-main-11.png); background-position: -1148px -400px; width: 81px; height: 99px; } -.Pet-Falcon-Skeleton { +.Pet-Falcon-Red { background-image: url(spritesmith-main-11.png); background-position: -1148px -500px; width: 81px; height: 99px; } -.Pet-Falcon-White { +.Pet-Falcon-Shade { background-image: url(spritesmith-main-11.png); background-position: -1148px -600px; width: 81px; height: 99px; } -.Pet-Falcon-Zombie { +.Pet-Falcon-Skeleton { background-image: url(spritesmith-main-11.png); background-position: -1148px -700px; width: 81px; height: 99px; } -.Pet-FlyingPig-Base { +.Pet-Falcon-White { background-image: url(spritesmith-main-11.png); background-position: -1148px -800px; width: 81px; height: 99px; } -.Pet-FlyingPig-CottonCandyBlue { +.Pet-Falcon-Zombie { background-image: url(spritesmith-main-11.png); background-position: -1148px -900px; width: 81px; height: 99px; } -.Pet-FlyingPig-CottonCandyPink { +.Pet-FlyingPig-Base { background-image: url(spritesmith-main-11.png); background-position: -1148px -1000px; width: 81px; height: 99px; } -.Pet-FlyingPig-Desert { +.Pet-FlyingPig-CottonCandyBlue { background-image: url(spritesmith-main-11.png); background-position: 0px -1100px; width: 81px; height: 99px; } -.Pet-FlyingPig-Golden { +.Pet-FlyingPig-CottonCandyPink { background-image: url(spritesmith-main-11.png); background-position: 0px 0px; width: 81px; height: 99px; } -.Pet-FlyingPig-Peppermint { +.Pet-FlyingPig-Desert { background-image: url(spritesmith-main-11.png); background-position: -164px -1100px; width: 81px; height: 99px; } -.Pet-FlyingPig-Red { +.Pet-FlyingPig-Golden { background-image: url(spritesmith-main-11.png); background-position: -246px -1100px; width: 81px; height: 99px; } -.Pet-FlyingPig-Shade { +.Pet-FlyingPig-Peppermint { background-image: url(spritesmith-main-11.png); background-position: -328px -1100px; width: 81px; height: 99px; } -.Pet-FlyingPig-Skeleton { +.Pet-FlyingPig-Red { background-image: url(spritesmith-main-11.png); background-position: -410px -1100px; width: 81px; height: 99px; } -.Pet-FlyingPig-Spooky { +.Pet-FlyingPig-Shade { background-image: url(spritesmith-main-11.png); background-position: -492px -1100px; width: 81px; height: 99px; } -.Pet-FlyingPig-White { +.Pet-FlyingPig-Skeleton { background-image: url(spritesmith-main-11.png); background-position: -574px -1100px; width: 81px; height: 99px; } -.Pet-FlyingPig-Zombie { +.Pet-FlyingPig-Spooky { background-image: url(spritesmith-main-11.png); background-position: -656px -1100px; width: 81px; height: 99px; } -.Pet-Fox-Base { +.Pet-FlyingPig-White { background-image: url(spritesmith-main-11.png); background-position: -738px -1100px; width: 81px; height: 99px; } -.Pet-Fox-CottonCandyBlue { +.Pet-FlyingPig-Zombie { background-image: url(spritesmith-main-11.png); background-position: -820px -1100px; width: 81px; height: 99px; } -.Pet-Fox-CottonCandyPink { +.Pet-Fox-Base { background-image: url(spritesmith-main-11.png); background-position: -902px -1100px; width: 81px; height: 99px; } -.Pet-Fox-Desert { +.Pet-Fox-CottonCandyBlue { background-image: url(spritesmith-main-11.png); background-position: -984px -1100px; width: 81px; height: 99px; } -.Pet-Fox-Golden { +.Pet-Fox-CottonCandyPink { background-image: url(spritesmith-main-11.png); background-position: -1066px -1100px; width: 81px; height: 99px; } -.Pet-Fox-Peppermint { +.Pet-Fox-Desert { background-image: url(spritesmith-main-11.png); background-position: -1148px -1100px; width: 81px; height: 99px; } -.Pet-Fox-Red { +.Pet-Fox-Golden { background-image: url(spritesmith-main-11.png); background-position: -1230px 0px; width: 81px; height: 99px; } -.Pet-Fox-Shade { +.Pet-Fox-Peppermint { background-image: url(spritesmith-main-11.png); background-position: -1230px -100px; width: 81px; height: 99px; } -.Pet-Fox-Skeleton { +.Pet-Fox-Red { background-image: url(spritesmith-main-11.png); background-position: -1230px -200px; width: 81px; height: 99px; } -.Pet-Fox-Spooky { +.Pet-Fox-Shade { background-image: url(spritesmith-main-11.png); background-position: -1230px -300px; width: 81px; height: 99px; } -.Pet-Fox-White { +.Pet-Fox-Skeleton { background-image: url(spritesmith-main-11.png); background-position: -1230px -400px; width: 81px; height: 99px; } -.Pet-Fox-Zombie { +.Pet-Fox-Spooky { background-image: url(spritesmith-main-11.png); background-position: -1230px -500px; width: 81px; height: 99px; } -.Pet-Frog-Base { +.Pet-Fox-White { background-image: url(spritesmith-main-11.png); background-position: -1230px -600px; width: 81px; height: 99px; } -.Pet-Frog-CottonCandyBlue { +.Pet-Fox-Zombie { background-image: url(spritesmith-main-11.png); background-position: -1230px -700px; width: 81px; height: 99px; } -.Pet-Frog-CottonCandyPink { +.Pet-Frog-Base { background-image: url(spritesmith-main-11.png); background-position: -1230px -800px; width: 81px; height: 99px; } -.Pet-Frog-Desert { +.Pet-Frog-CottonCandyBlue { background-image: url(spritesmith-main-11.png); background-position: -1230px -900px; width: 81px; height: 99px; } -.Pet-Frog-Golden { +.Pet-Frog-CottonCandyPink { background-image: url(spritesmith-main-11.png); background-position: -1230px -1000px; width: 81px; height: 99px; } -.Pet-Frog-Red { +.Pet-Frog-Desert { background-image: url(spritesmith-main-11.png); background-position: -1230px -1100px; width: 81px; height: 99px; } -.Pet-Frog-Shade { +.Pet-Frog-Golden { background-image: url(spritesmith-main-11.png); background-position: 0px -1200px; width: 81px; height: 99px; } -.Pet-Frog-Skeleton { +.Pet-Frog-Red { background-image: url(spritesmith-main-11.png); background-position: -82px -1200px; width: 81px; height: 99px; } -.Pet-Frog-White { +.Pet-Frog-Shade { background-image: url(spritesmith-main-11.png); background-position: -164px -1200px; width: 81px; height: 99px; } -.Pet-Frog-Zombie { +.Pet-Frog-Skeleton { background-image: url(spritesmith-main-11.png); background-position: -246px -1200px; width: 81px; height: 99px; } -.Pet-Gryphon-Base { +.Pet-Frog-White { background-image: url(spritesmith-main-11.png); background-position: -328px -1200px; width: 81px; height: 99px; } -.Pet-Gryphon-CottonCandyBlue { +.Pet-Frog-Zombie { background-image: url(spritesmith-main-11.png); background-position: -410px -1200px; width: 81px; height: 99px; } -.Pet-Gryphon-CottonCandyPink { +.Pet-Gryphon-Base { background-image: url(spritesmith-main-11.png); background-position: -492px -1200px; width: 81px; height: 99px; } -.Pet-Gryphon-Desert { +.Pet-Gryphon-CottonCandyBlue { background-image: url(spritesmith-main-11.png); background-position: -574px -1200px; width: 81px; height: 99px; } -.Pet-Gryphon-Golden { +.Pet-Gryphon-CottonCandyPink { background-image: url(spritesmith-main-11.png); background-position: -656px -1200px; width: 81px; height: 99px; } -.Pet-Gryphon-Red { +.Pet-Gryphon-Desert { background-image: url(spritesmith-main-11.png); background-position: -738px -1200px; width: 81px; height: 99px; } -.Pet-Gryphon-Shade { +.Pet-Gryphon-Golden { background-image: url(spritesmith-main-11.png); background-position: -820px -1200px; width: 81px; height: 99px; } -.Pet-Gryphon-Skeleton { +.Pet-Gryphon-Red { background-image: url(spritesmith-main-11.png); background-position: -902px -1200px; width: 81px; height: 99px; } -.Pet-Gryphon-White { +.Pet-Gryphon-Shade { background-image: url(spritesmith-main-11.png); background-position: -984px -1200px; width: 81px; height: 99px; } -.Pet-Gryphon-Zombie { +.Pet-Gryphon-Skeleton { background-image: url(spritesmith-main-11.png); background-position: -1066px -1200px; width: 81px; height: 99px; } -.Pet-Hedgehog-Base { +.Pet-Gryphon-White { background-image: url(spritesmith-main-11.png); background-position: -1148px -1200px; width: 81px; height: 99px; } -.Pet-Hedgehog-CottonCandyBlue { +.Pet-Gryphon-Zombie { background-image: url(spritesmith-main-11.png); background-position: -1230px -1200px; width: 81px; height: 99px; } -.Pet-Hedgehog-CottonCandyPink { +.Pet-Hedgehog-Base { background-image: url(spritesmith-main-11.png); background-position: -1312px 0px; width: 81px; height: 99px; } -.Pet-Hedgehog-Desert { +.Pet-Hedgehog-CottonCandyBlue { background-image: url(spritesmith-main-11.png); background-position: -1312px -100px; width: 81px; height: 99px; } -.Pet-Hedgehog-Golden { +.Pet-Hedgehog-CottonCandyPink { background-image: url(spritesmith-main-11.png); background-position: -1312px -200px; width: 81px; height: 99px; } -.Pet-Hedgehog-Red { +.Pet-Hedgehog-Desert { background-image: url(spritesmith-main-11.png); background-position: -1312px -300px; width: 81px; height: 99px; } -.Pet-Hedgehog-Shade { +.Pet-Hedgehog-Golden { background-image: url(spritesmith-main-11.png); background-position: -1312px -400px; width: 81px; height: 99px; } -.Pet-Hedgehog-Skeleton { +.Pet-Hedgehog-Red { background-image: url(spritesmith-main-11.png); background-position: -1312px -500px; width: 81px; height: 99px; } -.Pet-Hedgehog-White { +.Pet-Hedgehog-Shade { background-image: url(spritesmith-main-11.png); background-position: -1312px -600px; width: 81px; height: 99px; } -.Pet-Hedgehog-Zombie { +.Pet-Hedgehog-Skeleton { background-image: url(spritesmith-main-11.png); background-position: -1312px -700px; width: 81px; height: 99px; } -.Pet-Horse-Base { +.Pet-Hedgehog-White { background-image: url(spritesmith-main-11.png); background-position: -1312px -800px; width: 81px; height: 99px; } -.Pet-Horse-CottonCandyBlue { +.Pet-Hedgehog-Zombie { background-image: url(spritesmith-main-11.png); background-position: -1312px -900px; width: 81px; height: 99px; } -.Pet-Horse-CottonCandyPink { +.Pet-Horse-Base { background-image: url(spritesmith-main-11.png); background-position: -1312px -1000px; width: 81px; height: 99px; } -.Pet-Horse-Desert { +.Pet-Horse-CottonCandyBlue { background-image: url(spritesmith-main-11.png); background-position: -1312px -1100px; width: 81px; height: 99px; } -.Pet-Horse-Golden { +.Pet-Horse-CottonCandyPink { background-image: url(spritesmith-main-11.png); background-position: -1312px -1200px; width: 81px; height: 99px; } -.Pet-Horse-Red { +.Pet-Horse-Desert { background-image: url(spritesmith-main-11.png); background-position: -1394px 0px; width: 81px; height: 99px; } -.Pet-Horse-Shade { +.Pet-Horse-Golden { background-image: url(spritesmith-main-11.png); background-position: -1394px -100px; width: 81px; height: 99px; } -.Pet-Horse-Skeleton { +.Pet-Horse-Red { background-image: url(spritesmith-main-11.png); background-position: -1394px -200px; width: 81px; height: 99px; } -.Pet-Horse-White { +.Pet-Horse-Shade { background-image: url(spritesmith-main-11.png); background-position: -1394px -300px; width: 81px; height: 99px; } -.Pet-Horse-Zombie { +.Pet-Horse-Skeleton { background-image: url(spritesmith-main-11.png); background-position: -1394px -400px; width: 81px; height: 99px; } -.Pet-JackOLantern-Base { +.Pet-Horse-White { background-image: url(spritesmith-main-11.png); background-position: -1394px -500px; width: 81px; height: 99px; } -.Pet-LionCub-Base { +.Pet-Horse-Zombie { background-image: url(spritesmith-main-11.png); background-position: -1394px -600px; width: 81px; height: 99px; } -.Pet-LionCub-CottonCandyBlue { +.Pet-JackOLantern-Base { background-image: url(spritesmith-main-11.png); background-position: -1394px -700px; width: 81px; height: 99px; } -.Pet-LionCub-CottonCandyPink { +.Pet-LionCub-Base { background-image: url(spritesmith-main-11.png); background-position: -1394px -800px; width: 81px; height: 99px; } -.Pet-LionCub-Desert { +.Pet-LionCub-CottonCandyBlue { background-image: url(spritesmith-main-11.png); background-position: -1394px -900px; width: 81px; height: 99px; } -.Pet-LionCub-Golden { +.Pet-LionCub-CottonCandyPink { background-image: url(spritesmith-main-11.png); background-position: -1394px -1000px; width: 81px; height: 99px; } -.Pet-LionCub-Peppermint { +.Pet-LionCub-Desert { background-image: url(spritesmith-main-11.png); background-position: -1394px -1100px; width: 81px; height: 99px; } -.Pet-LionCub-Red { +.Pet-LionCub-Golden { background-image: url(spritesmith-main-11.png); background-position: -1394px -1200px; width: 81px; height: 99px; } -.Pet-LionCub-Shade { +.Pet-LionCub-Peppermint { background-image: url(spritesmith-main-11.png); background-position: 0px -1300px; width: 81px; height: 99px; } -.Pet-LionCub-Skeleton { +.Pet-LionCub-Red { background-image: url(spritesmith-main-11.png); background-position: -82px -1300px; width: 81px; height: 99px; } -.Pet-LionCub-Spooky { +.Pet-LionCub-Shade { background-image: url(spritesmith-main-11.png); background-position: -164px -1300px; width: 81px; height: 99px; } -.Pet-LionCub-White { +.Pet-LionCub-Skeleton { background-image: url(spritesmith-main-11.png); background-position: -246px -1300px; width: 81px; height: 99px; } -.Pet-LionCub-Zombie { +.Pet-LionCub-Spooky { background-image: url(spritesmith-main-11.png); background-position: -328px -1300px; width: 81px; height: 99px; } -.Pet-Mammoth-Base { +.Pet-LionCub-White { background-image: url(spritesmith-main-11.png); background-position: -410px -1300px; width: 81px; height: 99px; } -.Pet-MantisShrimp-Base { +.Pet-LionCub-Zombie { background-image: url(spritesmith-main-11.png); background-position: -492px -1300px; width: 81px; height: 99px; } -.Pet-Monkey-Base { +.Pet-MagicalBee-Base { background-image: url(spritesmith-main-11.png); background-position: -574px -1300px; width: 81px; height: 99px; } -.Pet-Monkey-CottonCandyBlue { +.Pet-Mammoth-Base { background-image: url(spritesmith-main-11.png); background-position: -656px -1300px; width: 81px; height: 99px; } -.Pet-Monkey-CottonCandyPink { +.Pet-MantisShrimp-Base { background-image: url(spritesmith-main-11.png); background-position: -738px -1300px; width: 81px; height: 99px; } -.Pet-Monkey-Desert { +.Pet-Monkey-Base { background-image: url(spritesmith-main-11.png); background-position: -820px -1300px; width: 81px; height: 99px; } -.Pet-Monkey-Golden { +.Pet-Monkey-CottonCandyBlue { background-image: url(spritesmith-main-11.png); background-position: -902px -1300px; width: 81px; height: 99px; } -.Pet-Monkey-Red { +.Pet-Monkey-CottonCandyPink { background-image: url(spritesmith-main-11.png); background-position: -984px -1300px; width: 81px; height: 99px; } -.Pet-Monkey-Shade { +.Pet-Monkey-Desert { background-image: url(spritesmith-main-11.png); background-position: -1066px -1300px; width: 81px; height: 99px; } -.Pet-Monkey-Skeleton { +.Pet-Monkey-Golden { background-image: url(spritesmith-main-11.png); background-position: -1148px -1300px; width: 81px; height: 99px; } -.Pet-Monkey-White { +.Pet-Monkey-Red { background-image: url(spritesmith-main-11.png); background-position: -1230px -1300px; width: 81px; height: 99px; } -.Pet-Monkey-Zombie { +.Pet-Monkey-Shade { background-image: url(spritesmith-main-11.png); background-position: -1312px -1300px; width: 81px; height: 99px; } -.Pet-Octopus-Base { +.Pet-Monkey-Skeleton { background-image: url(spritesmith-main-11.png); background-position: -1394px -1300px; width: 81px; height: 99px; } -.Pet-Octopus-CottonCandyBlue { +.Pet-Monkey-White { background-image: url(spritesmith-main-11.png); background-position: -1476px 0px; width: 81px; height: 99px; } -.Pet-Octopus-CottonCandyPink { +.Pet-Monkey-Zombie { background-image: url(spritesmith-main-11.png); background-position: -1476px -100px; width: 81px; height: 99px; } -.Pet-Octopus-Desert { +.Pet-Octopus-Base { background-image: url(spritesmith-main-11.png); background-position: -1476px -200px; width: 81px; height: 99px; } -.Pet-Octopus-Golden { +.Pet-Octopus-CottonCandyBlue { background-image: url(spritesmith-main-11.png); background-position: -1476px -300px; width: 81px; height: 99px; } -.Pet-Octopus-Red { +.Pet-Octopus-CottonCandyPink { background-image: url(spritesmith-main-11.png); background-position: -1476px -400px; width: 81px; height: 99px; } -.Pet-Octopus-Shade { +.Pet-Octopus-Desert { background-image: url(spritesmith-main-11.png); background-position: -1476px -500px; width: 81px; height: 99px; } -.Pet-Octopus-Skeleton { +.Pet-Octopus-Golden { background-image: url(spritesmith-main-11.png); background-position: -1476px -600px; width: 81px; height: 99px; } -.Pet-Octopus-White { +.Pet-Octopus-Red { background-image: url(spritesmith-main-11.png); background-position: -1476px -700px; width: 81px; height: 99px; } -.Pet-Octopus-Zombie { +.Pet-Octopus-Shade { background-image: url(spritesmith-main-11.png); background-position: -1476px -800px; width: 81px; height: 99px; } -.Pet-Owl-Base { +.Pet-Octopus-Skeleton { background-image: url(spritesmith-main-11.png); background-position: -1476px -900px; width: 81px; height: 99px; } -.Pet-Owl-CottonCandyBlue { +.Pet-Octopus-White { background-image: url(spritesmith-main-11.png); background-position: -1476px -1000px; width: 81px; height: 99px; } -.Pet-Owl-CottonCandyPink { +.Pet-Octopus-Zombie { background-image: url(spritesmith-main-11.png); background-position: -1476px -1100px; width: 81px; height: 99px; } -.Pet-Owl-Desert { +.Pet-Owl-Base { background-image: url(spritesmith-main-11.png); background-position: -1476px -1200px; width: 81px; height: 99px; } -.Pet-Owl-Golden { +.Pet-Owl-CottonCandyBlue { background-image: url(spritesmith-main-11.png); background-position: -1476px -1300px; width: 81px; height: 99px; } -.Pet-Owl-Red { +.Pet-Owl-CottonCandyPink { background-image: url(spritesmith-main-11.png); background-position: 0px -1400px; width: 81px; height: 99px; } -.Pet-Owl-Shade { +.Pet-Owl-Desert { background-image: url(spritesmith-main-11.png); background-position: -82px -1400px; width: 81px; height: 99px; } -.Pet-Owl-Skeleton { +.Pet-Owl-Golden { background-image: url(spritesmith-main-11.png); background-position: -164px -1400px; width: 81px; height: 99px; } -.Pet-Owl-White { +.Pet-Owl-Red { background-image: url(spritesmith-main-11.png); background-position: -246px -1400px; width: 81px; height: 99px; } -.Pet-Owl-Zombie { +.Pet-Owl-Shade { background-image: url(spritesmith-main-11.png); background-position: -328px -1400px; width: 81px; height: 99px; } -.Pet-PandaCub-Base { +.Pet-Owl-Skeleton { background-image: url(spritesmith-main-11.png); background-position: -410px -1400px; width: 81px; height: 99px; } -.Pet-PandaCub-CottonCandyBlue { +.Pet-Owl-White { background-image: url(spritesmith-main-11.png); background-position: -492px -1400px; width: 81px; height: 99px; } -.Pet-PandaCub-CottonCandyPink { +.Pet-Owl-Zombie { background-image: url(spritesmith-main-11.png); background-position: -574px -1400px; width: 81px; height: 99px; } -.Pet-PandaCub-Desert { +.Pet-PandaCub-Base { background-image: url(spritesmith-main-11.png); background-position: -656px -1400px; width: 81px; height: 99px; } -.Pet-PandaCub-Golden { +.Pet-PandaCub-CottonCandyBlue { background-image: url(spritesmith-main-11.png); background-position: -738px -1400px; width: 81px; height: 99px; } -.Pet-PandaCub-Peppermint { +.Pet-PandaCub-CottonCandyPink { background-image: url(spritesmith-main-11.png); background-position: -820px -1400px; width: 81px; height: 99px; } -.Pet-PandaCub-Red { +.Pet-PandaCub-Desert { background-image: url(spritesmith-main-11.png); background-position: -902px -1400px; width: 81px; height: 99px; } -.Pet-PandaCub-Shade { +.Pet-PandaCub-Golden { background-image: url(spritesmith-main-11.png); background-position: -984px -1400px; width: 81px; height: 99px; } -.Pet-PandaCub-Skeleton { +.Pet-PandaCub-Peppermint { background-image: url(spritesmith-main-11.png); background-position: -1066px -1400px; width: 81px; height: 99px; } -.Pet-PandaCub-Spooky { +.Pet-PandaCub-Red { background-image: url(spritesmith-main-11.png); background-position: -1148px -1400px; width: 81px; height: 99px; } -.Pet-PandaCub-White { +.Pet-PandaCub-Shade { background-image: url(spritesmith-main-11.png); background-position: -1230px -1400px; width: 81px; height: 99px; } -.Pet-PandaCub-Zombie { +.Pet-PandaCub-Skeleton { background-image: url(spritesmith-main-11.png); background-position: -1312px -1400px; width: 81px; height: 99px; } -.Pet-Parrot-Base { +.Pet-PandaCub-Spooky { background-image: url(spritesmith-main-11.png); background-position: -1394px -1400px; width: 81px; height: 99px; } -.Pet-Parrot-CottonCandyBlue { +.Pet-PandaCub-White { background-image: url(spritesmith-main-11.png); background-position: -1476px -1400px; width: 81px; height: 99px; } -.Pet-Parrot-CottonCandyPink { +.Pet-PandaCub-Zombie { background-image: url(spritesmith-main-11.png); background-position: -1558px 0px; width: 81px; height: 99px; } -.Pet-Parrot-Desert { +.Pet-Parrot-Base { background-image: url(spritesmith-main-11.png); background-position: -1558px -100px; width: 81px; height: 99px; } -.Pet-Parrot-Golden { +.Pet-Parrot-CottonCandyBlue { background-image: url(spritesmith-main-11.png); background-position: -1558px -200px; width: 81px; height: 99px; } -.Pet-Parrot-Red { +.Pet-Parrot-CottonCandyPink { background-image: url(spritesmith-main-11.png); background-position: -1558px -300px; width: 81px; height: 99px; } -.Pet-Parrot-Shade { +.Pet-Parrot-Desert { background-image: url(spritesmith-main-11.png); background-position: -1558px -400px; width: 81px; height: 99px; } -.Pet-Parrot-Skeleton { +.Pet-Parrot-Golden { background-image: url(spritesmith-main-11.png); background-position: -1558px -500px; width: 81px; height: 99px; } -.Pet-Parrot-White { +.Pet-Parrot-Red { background-image: url(spritesmith-main-11.png); background-position: -1558px -600px; width: 81px; height: 99px; } -.Pet-Parrot-Zombie { +.Pet-Parrot-Shade { background-image: url(spritesmith-main-11.png); background-position: -1558px -700px; width: 81px; height: 99px; } -.Pet-Penguin-Base { +.Pet-Parrot-Skeleton { background-image: url(spritesmith-main-11.png); background-position: -1558px -800px; width: 81px; height: 99px; } -.Pet-Penguin-CottonCandyBlue { +.Pet-Parrot-White { background-image: url(spritesmith-main-11.png); background-position: -1558px -900px; width: 81px; height: 99px; } -.Pet-Penguin-CottonCandyPink { +.Pet-Parrot-Zombie { background-image: url(spritesmith-main-11.png); background-position: -1558px -1000px; width: 81px; height: 99px; } -.Pet-Penguin-Desert { +.Pet-Penguin-Base { background-image: url(spritesmith-main-11.png); background-position: -1558px -1100px; width: 81px; height: 99px; } -.Pet-Penguin-Golden { +.Pet-Penguin-CottonCandyBlue { background-image: url(spritesmith-main-11.png); background-position: -1558px -1200px; width: 81px; height: 99px; } -.Pet-Penguin-Red { +.Pet-Penguin-CottonCandyPink { background-image: url(spritesmith-main-11.png); background-position: -1558px -1300px; width: 81px; height: 99px; } -.Pet-Penguin-Shade { +.Pet-Penguin-Desert { background-image: url(spritesmith-main-11.png); background-position: -1558px -1400px; width: 81px; height: 99px; } -.Pet-Penguin-Skeleton { +.Pet-Penguin-Golden { background-image: url(spritesmith-main-11.png); background-position: 0px -1500px; width: 81px; height: 99px; } -.Pet-Penguin-White { +.Pet-Penguin-Red { background-image: url(spritesmith-main-11.png); background-position: -82px -1500px; width: 81px; height: 99px; } -.Pet-Penguin-Zombie { +.Pet-Penguin-Shade { background-image: url(spritesmith-main-11.png); background-position: -164px -1500px; width: 81px; height: 99px; } -.Pet-Phoenix-Base { +.Pet-Penguin-Skeleton { background-image: url(spritesmith-main-11.png); background-position: -246px -1500px; width: 81px; height: 99px; } -.Pet-Rat-Base { +.Pet-Penguin-White { background-image: url(spritesmith-main-11.png); background-position: -328px -1500px; width: 81px; height: 99px; } -.Pet-Rat-CottonCandyBlue { +.Pet-Penguin-Zombie { background-image: url(spritesmith-main-11.png); background-position: -410px -1500px; width: 81px; height: 99px; } -.Pet-Rat-CottonCandyPink { +.Pet-Phoenix-Base { background-image: url(spritesmith-main-11.png); background-position: -492px -1500px; width: 81px; height: 99px; } -.Pet-Rat-Desert { +.Pet-Rat-Base { background-image: url(spritesmith-main-11.png); background-position: -574px -1500px; width: 81px; height: 99px; } -.Pet-Rat-Golden { +.Pet-Rat-CottonCandyBlue { background-image: url(spritesmith-main-11.png); background-position: -656px -1500px; width: 81px; height: 99px; } -.Pet-Rat-Red { +.Pet-Rat-CottonCandyPink { background-image: url(spritesmith-main-11.png); background-position: -738px -1500px; width: 81px; height: 99px; } -.Pet-Rat-Shade { +.Pet-Rat-Desert { background-image: url(spritesmith-main-11.png); background-position: -820px -1500px; width: 81px; height: 99px; } -.Pet-Rat-Skeleton { +.Pet-Rat-Golden { background-image: url(spritesmith-main-11.png); background-position: -902px -1500px; width: 81px; height: 99px; } -.Pet-Rat-White { +.Pet-Rat-Red { background-image: url(spritesmith-main-11.png); background-position: -984px -1500px; width: 81px; height: 99px; } -.Pet-Rat-Zombie { +.Pet-Rat-Shade { background-image: url(spritesmith-main-11.png); background-position: -1066px -1500px; width: 81px; height: 99px; } -.Pet-Rock-Base { +.Pet-Rat-Skeleton { background-image: url(spritesmith-main-11.png); background-position: -1148px -1500px; width: 81px; height: 99px; } -.Pet-Rock-CottonCandyBlue { +.Pet-Rat-White { background-image: url(spritesmith-main-11.png); background-position: -1230px -1500px; width: 81px; height: 99px; } -.Pet-Rock-CottonCandyPink { +.Pet-Rat-Zombie { background-image: url(spritesmith-main-11.png); background-position: -1312px -1500px; width: 81px; height: 99px; } -.Pet-Rock-Desert { +.Pet-Rock-Base { background-image: url(spritesmith-main-11.png); background-position: -1394px -1500px; width: 81px; height: 99px; } -.Pet-Rock-Golden { +.Pet-Rock-CottonCandyBlue { background-image: url(spritesmith-main-11.png); background-position: -1476px -1500px; width: 81px; height: 99px; } -.Pet-Rock-Red { +.Pet-Rock-CottonCandyPink { background-image: url(spritesmith-main-11.png); background-position: -1558px -1500px; width: 81px; height: 99px; } -.Pet-Rock-Shade { +.Pet-Rock-Desert { background-image: url(spritesmith-main-11.png); background-position: -1640px 0px; width: 81px; height: 99px; } -.Pet-Rock-Skeleton { +.Pet-Rock-Golden { background-image: url(spritesmith-main-11.png); background-position: -1640px -100px; width: 81px; height: 99px; } -.Pet-Rock-White { +.Pet-Rock-Red { background-image: url(spritesmith-main-11.png); background-position: -1640px -200px; width: 81px; height: 99px; } -.Pet-Rock-Zombie { +.Pet-Rock-Shade { background-image: url(spritesmith-main-11.png); background-position: -1640px -300px; width: 81px; height: 99px; } -.Pet-Rooster-Base { +.Pet-Rock-Skeleton { background-image: url(spritesmith-main-11.png); background-position: -1640px -400px; width: 81px; height: 99px; } -.Pet-Rooster-CottonCandyBlue { +.Pet-Rock-White { background-image: url(spritesmith-main-11.png); background-position: -1640px -500px; width: 81px; height: 99px; } -.Pet-Rooster-CottonCandyPink { +.Pet-Rock-Zombie { background-image: url(spritesmith-main-11.png); background-position: -1640px -600px; width: 81px; height: 99px; } -.Pet-Rooster-Desert { +.Pet-Rooster-Base { background-image: url(spritesmith-main-11.png); background-position: -1640px -700px; width: 81px; height: 99px; } -.Pet-Rooster-Golden { +.Pet-Rooster-CottonCandyBlue { background-image: url(spritesmith-main-11.png); background-position: -1640px -800px; width: 81px; height: 99px; } -.Pet-Rooster-Red { +.Pet-Rooster-CottonCandyPink { background-image: url(spritesmith-main-11.png); background-position: -1640px -900px; width: 81px; height: 99px; } -.Pet-Rooster-Shade { +.Pet-Rooster-Desert { background-image: url(spritesmith-main-11.png); background-position: -1640px -1000px; width: 81px; height: 99px; } -.Pet-Rooster-Skeleton { +.Pet-Rooster-Golden { background-image: url(spritesmith-main-11.png); background-position: -1640px -1100px; width: 81px; diff --git a/common/dist/sprites/spritesmith-main-11.png b/common/dist/sprites/spritesmith-main-11.png index fc32ed8b8a..b07fad6725 100644 Binary files a/common/dist/sprites/spritesmith-main-11.png and b/common/dist/sprites/spritesmith-main-11.png differ diff --git a/common/dist/sprites/spritesmith-main-12.css b/common/dist/sprites/spritesmith-main-12.css index 110a47261f..e06dae929e 100644 --- a/common/dist/sprites/spritesmith-main-12.css +++ b/common/dist/sprites/spritesmith-main-12.css @@ -1,852 +1,870 @@ -.Pet-Rooster-White { +.Pet-Rooster-Red { background-image: url(spritesmith-main-12.png); background-position: -82px 0px; width: 81px; height: 99px; } -.Pet-Rooster-Zombie { - background-image: url(spritesmith-main-12.png); - background-position: -82px -700px; - width: 81px; - height: 99px; -} -.Pet-Sabretooth-Base { - background-image: url(spritesmith-main-12.png); - background-position: -164px 0px; - width: 81px; - height: 99px; -} -.Pet-Sabretooth-CottonCandyBlue { - background-image: url(spritesmith-main-12.png); - background-position: 0px -100px; - width: 81px; - height: 99px; -} -.Pet-Sabretooth-CottonCandyPink { - background-image: url(spritesmith-main-12.png); - background-position: -82px -100px; - width: 81px; - height: 99px; -} -.Pet-Sabretooth-Desert { - background-image: url(spritesmith-main-12.png); - background-position: -164px -100px; - width: 81px; - height: 99px; -} -.Pet-Sabretooth-Golden { - background-image: url(spritesmith-main-12.png); - background-position: -246px 0px; - width: 81px; - height: 99px; -} -.Pet-Sabretooth-Red { - background-image: url(spritesmith-main-12.png); - background-position: -246px -100px; - width: 81px; - height: 99px; -} -.Pet-Sabretooth-Shade { - background-image: url(spritesmith-main-12.png); - background-position: 0px -200px; - width: 81px; - height: 99px; -} -.Pet-Sabretooth-Skeleton { - background-image: url(spritesmith-main-12.png); - background-position: -82px -200px; - width: 81px; - height: 99px; -} -.Pet-Sabretooth-White { - background-image: url(spritesmith-main-12.png); - background-position: -164px -200px; - width: 81px; - height: 99px; -} -.Pet-Sabretooth-Zombie { - background-image: url(spritesmith-main-12.png); - background-position: -246px -200px; - width: 81px; - height: 99px; -} -.Pet-Seahorse-Base { - background-image: url(spritesmith-main-12.png); - background-position: -328px 0px; - width: 81px; - height: 99px; -} -.Pet-Seahorse-CottonCandyBlue { - background-image: url(spritesmith-main-12.png); - background-position: -328px -100px; - width: 81px; - height: 99px; -} -.Pet-Seahorse-CottonCandyPink { - background-image: url(spritesmith-main-12.png); - background-position: -328px -200px; - width: 81px; - height: 99px; -} -.Pet-Seahorse-Desert { - background-image: url(spritesmith-main-12.png); - background-position: 0px -300px; - width: 81px; - height: 99px; -} -.Pet-Seahorse-Golden { - background-image: url(spritesmith-main-12.png); - background-position: -82px -300px; - width: 81px; - height: 99px; -} -.Pet-Seahorse-Red { - background-image: url(spritesmith-main-12.png); - background-position: -164px -300px; - width: 81px; - height: 99px; -} -.Pet-Seahorse-Shade { - background-image: url(spritesmith-main-12.png); - background-position: -246px -300px; - width: 81px; - height: 99px; -} -.Pet-Seahorse-Skeleton { - background-image: url(spritesmith-main-12.png); - background-position: -328px -300px; - width: 81px; - height: 99px; -} -.Pet-Seahorse-White { - background-image: url(spritesmith-main-12.png); - background-position: -410px 0px; - width: 81px; - height: 99px; -} -.Pet-Seahorse-Zombie { - background-image: url(spritesmith-main-12.png); - background-position: -410px -100px; - width: 81px; - height: 99px; -} -.Pet-Sheep-Base { - background-image: url(spritesmith-main-12.png); - background-position: -410px -200px; - width: 81px; - height: 99px; -} -.Pet-Sheep-CottonCandyBlue { - background-image: url(spritesmith-main-12.png); - background-position: -410px -300px; - width: 81px; - height: 99px; -} -.Pet-Sheep-CottonCandyPink { - background-image: url(spritesmith-main-12.png); - background-position: -492px 0px; - width: 81px; - height: 99px; -} -.Pet-Sheep-Desert { - background-image: url(spritesmith-main-12.png); - background-position: -492px -100px; - width: 81px; - height: 99px; -} -.Pet-Sheep-Golden { - background-image: url(spritesmith-main-12.png); - background-position: -492px -200px; - width: 81px; - height: 99px; -} -.Pet-Sheep-Red { - background-image: url(spritesmith-main-12.png); - background-position: -492px -300px; - width: 81px; - height: 99px; -} -.Pet-Sheep-Shade { - background-image: url(spritesmith-main-12.png); - background-position: 0px -400px; - width: 81px; - height: 99px; -} -.Pet-Sheep-Skeleton { - background-image: url(spritesmith-main-12.png); - background-position: -82px -400px; - width: 81px; - height: 99px; -} -.Pet-Sheep-White { - background-image: url(spritesmith-main-12.png); - background-position: -164px -400px; - width: 81px; - height: 99px; -} -.Pet-Sheep-Zombie { - background-image: url(spritesmith-main-12.png); - background-position: -246px -400px; - width: 81px; - height: 99px; -} -.Pet-Slime-Base { - background-image: url(spritesmith-main-12.png); - background-position: -328px -400px; - width: 81px; - height: 99px; -} -.Pet-Slime-CottonCandyBlue { - background-image: url(spritesmith-main-12.png); - background-position: -410px -400px; - width: 81px; - height: 99px; -} -.Pet-Slime-CottonCandyPink { - background-image: url(spritesmith-main-12.png); - background-position: -492px -400px; - width: 81px; - height: 99px; -} -.Pet-Slime-Desert { - background-image: url(spritesmith-main-12.png); - background-position: -574px 0px; - width: 81px; - height: 99px; -} -.Pet-Slime-Golden { - background-image: url(spritesmith-main-12.png); - background-position: -574px -100px; - width: 81px; - height: 99px; -} -.Pet-Slime-Red { - background-image: url(spritesmith-main-12.png); - background-position: -574px -200px; - width: 81px; - height: 99px; -} -.Pet-Slime-Shade { - background-image: url(spritesmith-main-12.png); - background-position: -574px -300px; - width: 81px; - height: 99px; -} -.Pet-Slime-Skeleton { - background-image: url(spritesmith-main-12.png); - background-position: -574px -400px; - width: 81px; - height: 99px; -} -.Pet-Slime-White { - background-image: url(spritesmith-main-12.png); - background-position: 0px -500px; - width: 81px; - height: 99px; -} -.Pet-Slime-Zombie { - background-image: url(spritesmith-main-12.png); - background-position: -82px -500px; - width: 81px; - height: 99px; -} -.Pet-Snail-Base { - background-image: url(spritesmith-main-12.png); - background-position: -164px -500px; - width: 81px; - height: 99px; -} -.Pet-Snail-CottonCandyBlue { - background-image: url(spritesmith-main-12.png); - background-position: -246px -500px; - width: 81px; - height: 99px; -} -.Pet-Snail-CottonCandyPink { - background-image: url(spritesmith-main-12.png); - background-position: -328px -500px; - width: 81px; - height: 99px; -} -.Pet-Snail-Desert { - background-image: url(spritesmith-main-12.png); - background-position: -410px -500px; - width: 81px; - height: 99px; -} -.Pet-Snail-Golden { - background-image: url(spritesmith-main-12.png); - background-position: -492px -500px; - width: 81px; - height: 99px; -} -.Pet-Snail-Red { - background-image: url(spritesmith-main-12.png); - background-position: -574px -500px; - width: 81px; - height: 99px; -} -.Pet-Snail-Shade { - background-image: url(spritesmith-main-12.png); - background-position: -656px 0px; - width: 81px; - height: 99px; -} -.Pet-Snail-Skeleton { - background-image: url(spritesmith-main-12.png); - background-position: -656px -100px; - width: 81px; - height: 99px; -} -.Pet-Snail-White { - background-image: url(spritesmith-main-12.png); - background-position: -656px -200px; - width: 81px; - height: 99px; -} -.Pet-Snail-Zombie { - background-image: url(spritesmith-main-12.png); - background-position: -656px -300px; - width: 81px; - height: 99px; -} -.Pet-Snake-Base { - background-image: url(spritesmith-main-12.png); - background-position: -656px -400px; - width: 81px; - height: 99px; -} -.Pet-Snake-CottonCandyBlue { - background-image: url(spritesmith-main-12.png); - background-position: -656px -500px; - width: 81px; - height: 99px; -} -.Pet-Snake-CottonCandyPink { - background-image: url(spritesmith-main-12.png); - background-position: 0px -600px; - width: 81px; - height: 99px; -} -.Pet-Snake-Desert { - background-image: url(spritesmith-main-12.png); - background-position: -82px -600px; - width: 81px; - height: 99px; -} -.Pet-Snake-Golden { - background-image: url(spritesmith-main-12.png); - background-position: -164px -600px; - width: 81px; - height: 99px; -} -.Pet-Snake-Red { - background-image: url(spritesmith-main-12.png); - background-position: -246px -600px; - width: 81px; - height: 99px; -} -.Pet-Snake-Shade { - background-image: url(spritesmith-main-12.png); - background-position: -328px -600px; - width: 81px; - height: 99px; -} -.Pet-Snake-Skeleton { - background-image: url(spritesmith-main-12.png); - background-position: -410px -600px; - width: 81px; - height: 99px; -} -.Pet-Snake-White { - background-image: url(spritesmith-main-12.png); - background-position: -492px -600px; - width: 81px; - height: 99px; -} -.Pet-Snake-Zombie { - background-image: url(spritesmith-main-12.png); - background-position: -574px -600px; - width: 81px; - height: 99px; -} -.Pet-Spider-Base { - background-image: url(spritesmith-main-12.png); - background-position: -656px -600px; - width: 81px; - height: 99px; -} -.Pet-Spider-CottonCandyBlue { - background-image: url(spritesmith-main-12.png); - background-position: -738px 0px; - width: 81px; - height: 99px; -} -.Pet-Spider-CottonCandyPink { - background-image: url(spritesmith-main-12.png); - background-position: -738px -100px; - width: 81px; - height: 99px; -} -.Pet-Spider-Desert { - background-image: url(spritesmith-main-12.png); - background-position: -738px -200px; - width: 81px; - height: 99px; -} -.Pet-Spider-Golden { - background-image: url(spritesmith-main-12.png); - background-position: -738px -300px; - width: 81px; - height: 99px; -} -.Pet-Spider-Red { - background-image: url(spritesmith-main-12.png); - background-position: -738px -400px; - width: 81px; - height: 99px; -} -.Pet-Spider-Shade { - background-image: url(spritesmith-main-12.png); - background-position: -738px -500px; - width: 81px; - height: 99px; -} -.Pet-Spider-Skeleton { - background-image: url(spritesmith-main-12.png); - background-position: -738px -600px; - width: 81px; - height: 99px; -} -.Pet-Spider-White { - background-image: url(spritesmith-main-12.png); - background-position: 0px -700px; - width: 81px; - height: 99px; -} -.Pet-Spider-Zombie { - background-image: url(spritesmith-main-12.png); - background-position: 0px 0px; - width: 81px; - height: 99px; -} -.Pet-TRex-Base { - background-image: url(spritesmith-main-12.png); - background-position: -820px -500px; - width: 81px; - height: 99px; -} -.Pet-TRex-CottonCandyBlue { - background-image: url(spritesmith-main-12.png); - background-position: -820px -600px; - width: 81px; - height: 99px; -} -.Pet-TRex-CottonCandyPink { - background-image: url(spritesmith-main-12.png); - background-position: -820px -700px; - width: 81px; - height: 99px; -} -.Pet-TRex-Desert { - background-image: url(spritesmith-main-12.png); - background-position: 0px -800px; - width: 81px; - height: 99px; -} -.Pet-TRex-Golden { - background-image: url(spritesmith-main-12.png); - background-position: -82px -800px; - width: 81px; - height: 99px; -} -.Pet-TRex-Red { - background-image: url(spritesmith-main-12.png); - background-position: -164px -800px; - width: 81px; - height: 99px; -} -.Pet-TRex-Shade { - background-image: url(spritesmith-main-12.png); - background-position: -246px -800px; - width: 81px; - height: 99px; -} -.Pet-TRex-Skeleton { - background-image: url(spritesmith-main-12.png); - background-position: -328px -800px; - width: 81px; - height: 99px; -} -.Pet-TRex-White { - background-image: url(spritesmith-main-12.png); - background-position: -410px -800px; - width: 81px; - height: 99px; -} -.Pet-TRex-Zombie { - background-image: url(spritesmith-main-12.png); - background-position: -492px -800px; - width: 81px; - height: 99px; -} -.Pet-Tiger-Veteran { +.Pet-Rooster-Shade { background-image: url(spritesmith-main-12.png); background-position: -164px -700px; width: 81px; height: 99px; } -.Pet-TigerCub-Base { +.Pet-Rooster-Skeleton { + background-image: url(spritesmith-main-12.png); + background-position: -164px 0px; + width: 81px; + height: 99px; +} +.Pet-Rooster-White { + background-image: url(spritesmith-main-12.png); + background-position: 0px -100px; + width: 81px; + height: 99px; +} +.Pet-Rooster-Zombie { + background-image: url(spritesmith-main-12.png); + background-position: -82px -100px; + width: 81px; + height: 99px; +} +.Pet-Sabretooth-Base { + background-image: url(spritesmith-main-12.png); + background-position: -164px -100px; + width: 81px; + height: 99px; +} +.Pet-Sabretooth-CottonCandyBlue { + background-image: url(spritesmith-main-12.png); + background-position: -246px 0px; + width: 81px; + height: 99px; +} +.Pet-Sabretooth-CottonCandyPink { + background-image: url(spritesmith-main-12.png); + background-position: -246px -100px; + width: 81px; + height: 99px; +} +.Pet-Sabretooth-Desert { + background-image: url(spritesmith-main-12.png); + background-position: 0px -200px; + width: 81px; + height: 99px; +} +.Pet-Sabretooth-Golden { + background-image: url(spritesmith-main-12.png); + background-position: -82px -200px; + width: 81px; + height: 99px; +} +.Pet-Sabretooth-Red { + background-image: url(spritesmith-main-12.png); + background-position: -164px -200px; + width: 81px; + height: 99px; +} +.Pet-Sabretooth-Shade { + background-image: url(spritesmith-main-12.png); + background-position: -246px -200px; + width: 81px; + height: 99px; +} +.Pet-Sabretooth-Skeleton { + background-image: url(spritesmith-main-12.png); + background-position: -328px 0px; + width: 81px; + height: 99px; +} +.Pet-Sabretooth-White { + background-image: url(spritesmith-main-12.png); + background-position: -328px -100px; + width: 81px; + height: 99px; +} +.Pet-Sabretooth-Zombie { + background-image: url(spritesmith-main-12.png); + background-position: -328px -200px; + width: 81px; + height: 99px; +} +.Pet-Seahorse-Base { + background-image: url(spritesmith-main-12.png); + background-position: 0px -300px; + width: 81px; + height: 99px; +} +.Pet-Seahorse-CottonCandyBlue { + background-image: url(spritesmith-main-12.png); + background-position: -82px -300px; + width: 81px; + height: 99px; +} +.Pet-Seahorse-CottonCandyPink { + background-image: url(spritesmith-main-12.png); + background-position: -164px -300px; + width: 81px; + height: 99px; +} +.Pet-Seahorse-Desert { + background-image: url(spritesmith-main-12.png); + background-position: -246px -300px; + width: 81px; + height: 99px; +} +.Pet-Seahorse-Golden { + background-image: url(spritesmith-main-12.png); + background-position: -328px -300px; + width: 81px; + height: 99px; +} +.Pet-Seahorse-Red { + background-image: url(spritesmith-main-12.png); + background-position: -410px 0px; + width: 81px; + height: 99px; +} +.Pet-Seahorse-Shade { + background-image: url(spritesmith-main-12.png); + background-position: -410px -100px; + width: 81px; + height: 99px; +} +.Pet-Seahorse-Skeleton { + background-image: url(spritesmith-main-12.png); + background-position: -410px -200px; + width: 81px; + height: 99px; +} +.Pet-Seahorse-White { + background-image: url(spritesmith-main-12.png); + background-position: -410px -300px; + width: 81px; + height: 99px; +} +.Pet-Seahorse-Zombie { + background-image: url(spritesmith-main-12.png); + background-position: -492px 0px; + width: 81px; + height: 99px; +} +.Pet-Sheep-Base { + background-image: url(spritesmith-main-12.png); + background-position: -492px -100px; + width: 81px; + height: 99px; +} +.Pet-Sheep-CottonCandyBlue { + background-image: url(spritesmith-main-12.png); + background-position: -492px -200px; + width: 81px; + height: 99px; +} +.Pet-Sheep-CottonCandyPink { + background-image: url(spritesmith-main-12.png); + background-position: -492px -300px; + width: 81px; + height: 99px; +} +.Pet-Sheep-Desert { + background-image: url(spritesmith-main-12.png); + background-position: 0px -400px; + width: 81px; + height: 99px; +} +.Pet-Sheep-Golden { + background-image: url(spritesmith-main-12.png); + background-position: -82px -400px; + width: 81px; + height: 99px; +} +.Pet-Sheep-Red { + background-image: url(spritesmith-main-12.png); + background-position: -164px -400px; + width: 81px; + height: 99px; +} +.Pet-Sheep-Shade { + background-image: url(spritesmith-main-12.png); + background-position: -246px -400px; + width: 81px; + height: 99px; +} +.Pet-Sheep-Skeleton { + background-image: url(spritesmith-main-12.png); + background-position: -328px -400px; + width: 81px; + height: 99px; +} +.Pet-Sheep-White { + background-image: url(spritesmith-main-12.png); + background-position: -410px -400px; + width: 81px; + height: 99px; +} +.Pet-Sheep-Zombie { + background-image: url(spritesmith-main-12.png); + background-position: -492px -400px; + width: 81px; + height: 99px; +} +.Pet-Slime-Base { + background-image: url(spritesmith-main-12.png); + background-position: -574px 0px; + width: 81px; + height: 99px; +} +.Pet-Slime-CottonCandyBlue { + background-image: url(spritesmith-main-12.png); + background-position: -574px -100px; + width: 81px; + height: 99px; +} +.Pet-Slime-CottonCandyPink { + background-image: url(spritesmith-main-12.png); + background-position: -574px -200px; + width: 81px; + height: 99px; +} +.Pet-Slime-Desert { + background-image: url(spritesmith-main-12.png); + background-position: -574px -300px; + width: 81px; + height: 99px; +} +.Pet-Slime-Golden { + background-image: url(spritesmith-main-12.png); + background-position: -574px -400px; + width: 81px; + height: 99px; +} +.Pet-Slime-Red { + background-image: url(spritesmith-main-12.png); + background-position: 0px -500px; + width: 81px; + height: 99px; +} +.Pet-Slime-Shade { + background-image: url(spritesmith-main-12.png); + background-position: -82px -500px; + width: 81px; + height: 99px; +} +.Pet-Slime-Skeleton { + background-image: url(spritesmith-main-12.png); + background-position: -164px -500px; + width: 81px; + height: 99px; +} +.Pet-Slime-White { + background-image: url(spritesmith-main-12.png); + background-position: -246px -500px; + width: 81px; + height: 99px; +} +.Pet-Slime-Zombie { + background-image: url(spritesmith-main-12.png); + background-position: -328px -500px; + width: 81px; + height: 99px; +} +.Pet-Snail-Base { + background-image: url(spritesmith-main-12.png); + background-position: -410px -500px; + width: 81px; + height: 99px; +} +.Pet-Snail-CottonCandyBlue { + background-image: url(spritesmith-main-12.png); + background-position: -492px -500px; + width: 81px; + height: 99px; +} +.Pet-Snail-CottonCandyPink { + background-image: url(spritesmith-main-12.png); + background-position: -574px -500px; + width: 81px; + height: 99px; +} +.Pet-Snail-Desert { + background-image: url(spritesmith-main-12.png); + background-position: -656px 0px; + width: 81px; + height: 99px; +} +.Pet-Snail-Golden { + background-image: url(spritesmith-main-12.png); + background-position: -656px -100px; + width: 81px; + height: 99px; +} +.Pet-Snail-Red { + background-image: url(spritesmith-main-12.png); + background-position: -656px -200px; + width: 81px; + height: 99px; +} +.Pet-Snail-Shade { + background-image: url(spritesmith-main-12.png); + background-position: -656px -300px; + width: 81px; + height: 99px; +} +.Pet-Snail-Skeleton { + background-image: url(spritesmith-main-12.png); + background-position: -656px -400px; + width: 81px; + height: 99px; +} +.Pet-Snail-White { + background-image: url(spritesmith-main-12.png); + background-position: -656px -500px; + width: 81px; + height: 99px; +} +.Pet-Snail-Zombie { + background-image: url(spritesmith-main-12.png); + background-position: 0px -600px; + width: 81px; + height: 99px; +} +.Pet-Snake-Base { + background-image: url(spritesmith-main-12.png); + background-position: -82px -600px; + width: 81px; + height: 99px; +} +.Pet-Snake-CottonCandyBlue { + background-image: url(spritesmith-main-12.png); + background-position: -164px -600px; + width: 81px; + height: 99px; +} +.Pet-Snake-CottonCandyPink { + background-image: url(spritesmith-main-12.png); + background-position: -246px -600px; + width: 81px; + height: 99px; +} +.Pet-Snake-Desert { + background-image: url(spritesmith-main-12.png); + background-position: -328px -600px; + width: 81px; + height: 99px; +} +.Pet-Snake-Golden { + background-image: url(spritesmith-main-12.png); + background-position: -410px -600px; + width: 81px; + height: 99px; +} +.Pet-Snake-Red { + background-image: url(spritesmith-main-12.png); + background-position: -492px -600px; + width: 81px; + height: 99px; +} +.Pet-Snake-Shade { + background-image: url(spritesmith-main-12.png); + background-position: -574px -600px; + width: 81px; + height: 99px; +} +.Pet-Snake-Skeleton { + background-image: url(spritesmith-main-12.png); + background-position: -656px -600px; + width: 81px; + height: 99px; +} +.Pet-Snake-White { + background-image: url(spritesmith-main-12.png); + background-position: -738px 0px; + width: 81px; + height: 99px; +} +.Pet-Snake-Zombie { + background-image: url(spritesmith-main-12.png); + background-position: -738px -100px; + width: 81px; + height: 99px; +} +.Pet-Spider-Base { + background-image: url(spritesmith-main-12.png); + background-position: -738px -200px; + width: 81px; + height: 99px; +} +.Pet-Spider-CottonCandyBlue { + background-image: url(spritesmith-main-12.png); + background-position: -738px -300px; + width: 81px; + height: 99px; +} +.Pet-Spider-CottonCandyPink { + background-image: url(spritesmith-main-12.png); + background-position: -738px -400px; + width: 81px; + height: 99px; +} +.Pet-Spider-Desert { + background-image: url(spritesmith-main-12.png); + background-position: -738px -500px; + width: 81px; + height: 99px; +} +.Pet-Spider-Golden { + background-image: url(spritesmith-main-12.png); + background-position: -738px -600px; + width: 81px; + height: 99px; +} +.Pet-Spider-Red { + background-image: url(spritesmith-main-12.png); + background-position: 0px -700px; + width: 81px; + height: 99px; +} +.Pet-Spider-Shade { + background-image: url(spritesmith-main-12.png); + background-position: -82px -700px; + width: 81px; + height: 99px; +} +.Pet-Spider-Skeleton { + background-image: url(spritesmith-main-12.png); + background-position: 0px 0px; + width: 81px; + height: 99px; +} +.Pet-Spider-White { background-image: url(spritesmith-main-12.png); background-position: -246px -700px; width: 81px; height: 99px; } -.Pet-TigerCub-CottonCandyBlue { +.Pet-Spider-Zombie { background-image: url(spritesmith-main-12.png); background-position: -328px -700px; width: 81px; height: 99px; } -.Pet-TigerCub-CottonCandyPink { +.Pet-TRex-Base { background-image: url(spritesmith-main-12.png); - background-position: -410px -700px; + background-position: 0px -800px; width: 81px; height: 99px; } -.Pet-TigerCub-Desert { +.Pet-TRex-CottonCandyBlue { background-image: url(spritesmith-main-12.png); - background-position: -492px -700px; + background-position: -82px -800px; width: 81px; height: 99px; } -.Pet-TigerCub-Golden { +.Pet-TRex-CottonCandyPink { background-image: url(spritesmith-main-12.png); - background-position: -574px -700px; + background-position: -164px -800px; width: 81px; height: 99px; } -.Pet-TigerCub-Peppermint { +.Pet-TRex-Desert { background-image: url(spritesmith-main-12.png); - background-position: -656px -700px; + background-position: -246px -800px; width: 81px; height: 99px; } -.Pet-TigerCub-Red { +.Pet-TRex-Golden { background-image: url(spritesmith-main-12.png); - background-position: -738px -700px; + background-position: -328px -800px; width: 81px; height: 99px; } -.Pet-TigerCub-Shade { +.Pet-TRex-Red { background-image: url(spritesmith-main-12.png); - background-position: -820px 0px; + background-position: -410px -800px; width: 81px; height: 99px; } -.Pet-TigerCub-Skeleton { +.Pet-TRex-Shade { background-image: url(spritesmith-main-12.png); - background-position: -820px -100px; + background-position: -492px -800px; width: 81px; height: 99px; } -.Pet-TigerCub-Spooky { - background-image: url(spritesmith-main-12.png); - background-position: -820px -200px; - width: 81px; - height: 99px; -} -.Pet-TigerCub-White { - background-image: url(spritesmith-main-12.png); - background-position: -820px -300px; - width: 81px; - height: 99px; -} -.Pet-TigerCub-Zombie { - background-image: url(spritesmith-main-12.png); - background-position: -820px -400px; - width: 81px; - height: 99px; -} -.Pet-Turkey-Base { +.Pet-TRex-Skeleton { background-image: url(spritesmith-main-12.png); background-position: -574px -800px; width: 81px; height: 99px; } -.Pet-Turkey-Gilded { +.Pet-TRex-White { background-image: url(spritesmith-main-12.png); background-position: -656px -800px; width: 81px; height: 99px; } -.Pet-Unicorn-Base { +.Pet-TRex-Zombie { background-image: url(spritesmith-main-12.png); background-position: -738px -800px; width: 81px; height: 99px; } -.Pet-Unicorn-CottonCandyBlue { +.Pet-Tiger-Veteran { + background-image: url(spritesmith-main-12.png); + background-position: -410px -700px; + width: 81px; + height: 99px; +} +.Pet-TigerCub-Base { + background-image: url(spritesmith-main-12.png); + background-position: -492px -700px; + width: 81px; + height: 99px; +} +.Pet-TigerCub-CottonCandyBlue { + background-image: url(spritesmith-main-12.png); + background-position: -574px -700px; + width: 81px; + height: 99px; +} +.Pet-TigerCub-CottonCandyPink { + background-image: url(spritesmith-main-12.png); + background-position: -656px -700px; + width: 81px; + height: 99px; +} +.Pet-TigerCub-Desert { + background-image: url(spritesmith-main-12.png); + background-position: -738px -700px; + width: 81px; + height: 99px; +} +.Pet-TigerCub-Golden { + background-image: url(spritesmith-main-12.png); + background-position: -820px 0px; + width: 81px; + height: 99px; +} +.Pet-TigerCub-Peppermint { + background-image: url(spritesmith-main-12.png); + background-position: -820px -100px; + width: 81px; + height: 99px; +} +.Pet-TigerCub-Red { + background-image: url(spritesmith-main-12.png); + background-position: -820px -200px; + width: 81px; + height: 99px; +} +.Pet-TigerCub-Shade { + background-image: url(spritesmith-main-12.png); + background-position: -820px -300px; + width: 81px; + height: 99px; +} +.Pet-TigerCub-Skeleton { + background-image: url(spritesmith-main-12.png); + background-position: -820px -400px; + width: 81px; + height: 99px; +} +.Pet-TigerCub-Spooky { + background-image: url(spritesmith-main-12.png); + background-position: -820px -500px; + width: 81px; + height: 99px; +} +.Pet-TigerCub-White { + background-image: url(spritesmith-main-12.png); + background-position: -820px -600px; + width: 81px; + height: 99px; +} +.Pet-TigerCub-Zombie { + background-image: url(spritesmith-main-12.png); + background-position: -820px -700px; + width: 81px; + height: 99px; +} +.Pet-Turkey-Base { background-image: url(spritesmith-main-12.png); background-position: -820px -800px; width: 81px; height: 99px; } -.Pet-Unicorn-CottonCandyPink { +.Pet-Turkey-Gilded { background-image: url(spritesmith-main-12.png); background-position: -902px 0px; width: 81px; height: 99px; } -.Pet-Unicorn-Desert { +.Pet-Unicorn-Base { background-image: url(spritesmith-main-12.png); background-position: -902px -100px; width: 81px; height: 99px; } -.Pet-Unicorn-Golden { +.Pet-Unicorn-CottonCandyBlue { background-image: url(spritesmith-main-12.png); background-position: -902px -200px; width: 81px; height: 99px; } -.Pet-Unicorn-Red { +.Pet-Unicorn-CottonCandyPink { background-image: url(spritesmith-main-12.png); background-position: -902px -300px; width: 81px; height: 99px; } -.Pet-Unicorn-Shade { +.Pet-Unicorn-Desert { background-image: url(spritesmith-main-12.png); background-position: -902px -400px; width: 81px; height: 99px; } -.Pet-Unicorn-Skeleton { +.Pet-Unicorn-Golden { background-image: url(spritesmith-main-12.png); background-position: -902px -500px; width: 81px; height: 99px; } -.Pet-Unicorn-White { +.Pet-Unicorn-Red { background-image: url(spritesmith-main-12.png); background-position: -902px -600px; width: 81px; height: 99px; } -.Pet-Unicorn-Zombie { +.Pet-Unicorn-Shade { background-image: url(spritesmith-main-12.png); background-position: -902px -700px; width: 81px; height: 99px; } -.Pet-Whale-Base { +.Pet-Unicorn-Skeleton { background-image: url(spritesmith-main-12.png); background-position: -902px -800px; width: 81px; height: 99px; } -.Pet-Whale-CottonCandyBlue { +.Pet-Unicorn-White { background-image: url(spritesmith-main-12.png); background-position: -984px 0px; width: 81px; height: 99px; } -.Pet-Whale-CottonCandyPink { +.Pet-Unicorn-Zombie { background-image: url(spritesmith-main-12.png); background-position: -984px -100px; width: 81px; height: 99px; } -.Pet-Whale-Desert { +.Pet-Whale-Base { background-image: url(spritesmith-main-12.png); background-position: -984px -200px; width: 81px; height: 99px; } -.Pet-Whale-Golden { +.Pet-Whale-CottonCandyBlue { background-image: url(spritesmith-main-12.png); background-position: -984px -300px; width: 81px; height: 99px; } -.Pet-Whale-Red { +.Pet-Whale-CottonCandyPink { background-image: url(spritesmith-main-12.png); background-position: -984px -400px; width: 81px; height: 99px; } -.Pet-Whale-Shade { +.Pet-Whale-Desert { background-image: url(spritesmith-main-12.png); background-position: -984px -500px; width: 81px; height: 99px; } -.Pet-Whale-Skeleton { +.Pet-Whale-Golden { background-image: url(spritesmith-main-12.png); background-position: -984px -600px; width: 81px; height: 99px; } -.Pet-Whale-White { +.Pet-Whale-Red { background-image: url(spritesmith-main-12.png); background-position: -984px -700px; width: 81px; height: 99px; } -.Pet-Whale-Zombie { +.Pet-Whale-Shade { background-image: url(spritesmith-main-12.png); background-position: -984px -800px; width: 81px; height: 99px; } -.Pet-Wolf-Base { +.Pet-Whale-Skeleton { background-image: url(spritesmith-main-12.png); background-position: 0px -900px; width: 81px; height: 99px; } -.Pet-Wolf-CottonCandyBlue { +.Pet-Whale-White { background-image: url(spritesmith-main-12.png); background-position: -82px -900px; width: 81px; height: 99px; } -.Pet-Wolf-CottonCandyPink { +.Pet-Whale-Zombie { background-image: url(spritesmith-main-12.png); background-position: -164px -900px; width: 81px; height: 99px; } -.Pet-Wolf-Desert { +.Pet-Wolf-Base { background-image: url(spritesmith-main-12.png); background-position: -246px -900px; width: 81px; height: 99px; } -.Pet-Wolf-Golden { +.Pet-Wolf-CottonCandyBlue { background-image: url(spritesmith-main-12.png); background-position: -328px -900px; width: 81px; height: 99px; } -.Pet-Wolf-Peppermint { +.Pet-Wolf-CottonCandyPink { background-image: url(spritesmith-main-12.png); background-position: -410px -900px; width: 81px; height: 99px; } -.Pet-Wolf-Red { +.Pet-Wolf-Desert { background-image: url(spritesmith-main-12.png); background-position: -492px -900px; width: 81px; height: 99px; } -.Pet-Wolf-Shade { +.Pet-Wolf-Golden { background-image: url(spritesmith-main-12.png); background-position: -574px -900px; width: 81px; height: 99px; } -.Pet-Wolf-Skeleton { +.Pet-Wolf-Peppermint { background-image: url(spritesmith-main-12.png); background-position: -656px -900px; width: 81px; height: 99px; } -.Pet-Wolf-Spooky { +.Pet-Wolf-Red { background-image: url(spritesmith-main-12.png); background-position: -738px -900px; width: 81px; height: 99px; } -.Pet-Wolf-Veteran { +.Pet-Wolf-Shade { background-image: url(spritesmith-main-12.png); background-position: -820px -900px; width: 81px; height: 99px; } -.Pet-Wolf-White { +.Pet-Wolf-Skeleton { background-image: url(spritesmith-main-12.png); background-position: -902px -900px; width: 81px; height: 99px; } -.Pet-Wolf-Zombie { +.Pet-Wolf-Spooky { background-image: url(spritesmith-main-12.png); background-position: -984px -900px; width: 81px; height: 99px; } +.Pet-Wolf-Veteran { + background-image: url(spritesmith-main-12.png); + background-position: -1066px 0px; + width: 81px; + height: 99px; +} +.Pet-Wolf-White { + background-image: url(spritesmith-main-12.png); + background-position: -1066px -100px; + width: 81px; + height: 99px; +} +.Pet-Wolf-Zombie { + background-image: url(spritesmith-main-12.png); + background-position: -1066px -200px; + width: 81px; + height: 99px; +} .Pet_HatchingPotion_Base { background-image: url(spritesmith-main-12.png); - background-position: -49px -1000px; + background-position: -1066px -352px; width: 48px; height: 51px; } .Pet_HatchingPotion_CottonCandyBlue { background-image: url(spritesmith-main-12.png); - background-position: -294px -1000px; + background-position: -1066px -612px; width: 48px; height: 51px; } .Pet_HatchingPotion_CottonCandyPink { background-image: url(spritesmith-main-12.png); - background-position: -98px -1000px; + background-position: -1066px -404px; width: 48px; height: 51px; } .Pet_HatchingPotion_Desert { background-image: url(spritesmith-main-12.png); - background-position: -147px -1000px; + background-position: -1066px -456px; width: 48px; height: 51px; } .Pet_HatchingPotion_Golden { background-image: url(spritesmith-main-12.png); - background-position: -196px -1000px; + background-position: -1066px -508px; width: 48px; height: 51px; } .Pet_HatchingPotion_Peppermint { background-image: url(spritesmith-main-12.png); - background-position: -245px -1000px; + background-position: -1066px -560px; width: 48px; height: 51px; } .Pet_HatchingPotion_Red { background-image: url(spritesmith-main-12.png); - background-position: 0px -1000px; + background-position: -1066px -300px; width: 48px; height: 51px; } .Pet_HatchingPotion_Shade { background-image: url(spritesmith-main-12.png); - background-position: -343px -1000px; + background-position: -1066px -664px; width: 48px; height: 51px; } .Pet_HatchingPotion_Skeleton { background-image: url(spritesmith-main-12.png); - background-position: -392px -1000px; + background-position: -1066px -716px; width: 48px; height: 51px; } .Pet_HatchingPotion_Spooky { background-image: url(spritesmith-main-12.png); - background-position: -441px -1000px; + background-position: -1066px -768px; width: 48px; height: 51px; } .Pet_HatchingPotion_White { background-image: url(spritesmith-main-12.png); - background-position: -490px -1000px; + background-position: -1066px -820px; width: 48px; height: 51px; } .Pet_HatchingPotion_Zombie { background-image: url(spritesmith-main-12.png); - background-position: -539px -1000px; + background-position: -1066px -872px; width: 48px; height: 51px; } diff --git a/common/dist/sprites/spritesmith-main-12.png b/common/dist/sprites/spritesmith-main-12.png index 03acac0df2..1644a3e8f6 100644 Binary files a/common/dist/sprites/spritesmith-main-12.png and b/common/dist/sprites/spritesmith-main-12.png differ diff --git a/common/dist/sprites/spritesmith-main-7.css b/common/dist/sprites/spritesmith-main-7.css index 0ef2c67a19..d78ec18992 100644 --- a/common/dist/sprites/spritesmith-main-7.css +++ b/common/dist/sprites/spritesmith-main-7.css @@ -1,24 +1,24 @@ .Mount_Body_FlyingPig-CottonCandyPink { background-image: url(spritesmith-main-7.png); - background-position: -1498px -212px; + background-position: -848px -1380px; width: 105px; height: 105px; } .Mount_Body_FlyingPig-Desert { background-image: url(spritesmith-main-7.png); - background-position: -318px -1159px; + background-position: -1180px -848px; width: 105px; height: 105px; } .Mount_Body_FlyingPig-Golden { background-image: url(spritesmith-main-7.png); - background-position: -1498px -318px; + background-position: -954px -1380px; width: 105px; height: 105px; } .Mount_Body_FlyingPig-Peppermint { background-image: url(spritesmith-main-7.png); - background-position: -327px -523px; + background-position: -1060px -1380px; width: 105px; height: 105px; } @@ -66,97 +66,97 @@ } .Mount_Body_Fox-CottonCandyBlue { background-image: url(spritesmith-main-7.png); - background-position: -968px -424px; + background-position: -968px -106px; width: 105px; height: 105px; } .Mount_Body_Fox-CottonCandyPink { background-image: url(spritesmith-main-7.png); - background-position: 0px -947px; + background-position: -968px -530px; width: 105px; height: 105px; } .Mount_Body_Fox-Desert { background-image: url(spritesmith-main-7.png); - background-position: -106px -947px; + background-position: -968px -636px; width: 105px; height: 105px; } .Mount_Body_Fox-Golden { background-image: url(spritesmith-main-7.png); - background-position: -848px -1371px; + background-position: -968px -742px; width: 105px; height: 105px; } .Mount_Body_Fox-Peppermint { background-image: url(spritesmith-main-7.png); - background-position: -954px -1371px; + background-position: -106px -1380px; width: 105px; height: 105px; } .Mount_Body_Fox-Red { background-image: url(spritesmith-main-7.png); - background-position: -1060px -1371px; + background-position: -212px -1380px; width: 105px; height: 105px; } .Mount_Body_Fox-Shade { background-image: url(spritesmith-main-7.png); - background-position: -1166px -1371px; + background-position: -318px -1380px; width: 105px; height: 105px; } .Mount_Body_Fox-Skeleton { background-image: url(spritesmith-main-7.png); - background-position: -1272px -1371px; + background-position: -424px -1380px; width: 105px; height: 105px; } .Mount_Body_Fox-Spooky { background-image: url(spritesmith-main-7.png); - background-position: -1378px -1371px; + background-position: -530px -1380px; width: 105px; height: 105px; } .Mount_Body_Fox-White { background-image: url(spritesmith-main-7.png); - background-position: -1498px 0px; + background-position: -636px -1380px; width: 105px; height: 105px; } .Mount_Body_Fox-Zombie { background-image: url(spritesmith-main-7.png); - background-position: -1498px -106px; + background-position: -742px -1380px; width: 105px; height: 105px; } .Mount_Body_Frog-Base { background-image: url(spritesmith-main-7.png); - background-position: -424px -408px; + background-position: 0px -408px; width: 105px; height: 114px; } .Mount_Body_Frog-CottonCandyBlue { background-image: url(spritesmith-main-7.png); - background-position: 0px -408px; + background-position: -106px -408px; width: 105px; height: 114px; } .Mount_Body_Frog-CottonCandyPink { background-image: url(spritesmith-main-7.png); - background-position: -544px -345px; + background-position: -212px -408px; width: 105px; height: 114px; } .Mount_Body_Frog-Desert { background-image: url(spritesmith-main-7.png); - background-position: -544px -230px; + background-position: -318px -408px; width: 105px; height: 114px; } .Mount_Body_Frog-Golden { background-image: url(spritesmith-main-7.png); - background-position: -544px -115px; + background-position: -424px -408px; width: 105px; height: 114px; } @@ -168,298 +168,304 @@ } .Mount_Body_Frog-Shade { background-image: url(spritesmith-main-7.png); - background-position: -408px -260px; + background-position: -544px -115px; width: 105px; height: 114px; } .Mount_Body_Frog-Skeleton { background-image: url(spritesmith-main-7.png); - background-position: -318px -408px; + background-position: -544px -230px; width: 105px; height: 114px; } .Mount_Body_Frog-White { background-image: url(spritesmith-main-7.png); - background-position: -212px -408px; + background-position: -544px -345px; width: 105px; height: 114px; } .Mount_Body_Frog-Zombie { background-image: url(spritesmith-main-7.png); - background-position: -106px -408px; + background-position: 0px -523px; width: 105px; height: 114px; } .Mount_Body_Gryphon-Base { background-image: url(spritesmith-main-7.png); - background-position: 0px -629px; + background-position: -650px -530px; width: 105px; height: 105px; } .Mount_Body_Gryphon-CottonCandyBlue { background-image: url(spritesmith-main-7.png); - background-position: -106px -629px; + background-position: 0px -638px; width: 105px; height: 105px; } .Mount_Body_Gryphon-CottonCandyPink { background-image: url(spritesmith-main-7.png); - background-position: -212px -629px; + background-position: -106px -638px; width: 105px; height: 105px; } .Mount_Body_Gryphon-Desert { background-image: url(spritesmith-main-7.png); - background-position: -318px -629px; + background-position: -212px -638px; width: 105px; height: 105px; } .Mount_Body_Gryphon-Golden { background-image: url(spritesmith-main-7.png); - background-position: -424px -629px; + background-position: -318px -638px; width: 105px; height: 105px; } .Mount_Body_Gryphon-Red { background-image: url(spritesmith-main-7.png); - background-position: -530px -629px; + background-position: -424px -638px; width: 105px; height: 105px; } .Mount_Body_Gryphon-RoyalPurple { background-image: url(spritesmith-main-7.png); - background-position: -636px -629px; + background-position: -530px -638px; width: 105px; height: 105px; } .Mount_Body_Gryphon-Shade { background-image: url(spritesmith-main-7.png); - background-position: -756px 0px; + background-position: -636px -638px; width: 105px; height: 105px; } .Mount_Body_Gryphon-Skeleton { background-image: url(spritesmith-main-7.png); - background-position: -756px -106px; + background-position: -756px 0px; width: 105px; height: 105px; } .Mount_Body_Gryphon-White { background-image: url(spritesmith-main-7.png); - background-position: -756px -212px; + background-position: -756px -106px; width: 105px; height: 105px; } .Mount_Body_Gryphon-Zombie { background-image: url(spritesmith-main-7.png); - background-position: -756px -318px; + background-position: -756px -212px; width: 105px; height: 105px; } .Mount_Body_Hedgehog-Base { background-image: url(spritesmith-main-7.png); - background-position: -756px -424px; + background-position: -756px -318px; width: 105px; height: 105px; } .Mount_Body_Hedgehog-CottonCandyBlue { background-image: url(spritesmith-main-7.png); - background-position: -756px -530px; + background-position: -756px -424px; width: 105px; height: 105px; } .Mount_Body_Hedgehog-CottonCandyPink { background-image: url(spritesmith-main-7.png); - background-position: 0px -735px; + background-position: -756px -530px; width: 105px; height: 105px; } .Mount_Body_Hedgehog-Desert { background-image: url(spritesmith-main-7.png); - background-position: -106px -735px; + background-position: -756px -636px; width: 105px; height: 105px; } .Mount_Body_Hedgehog-Golden { background-image: url(spritesmith-main-7.png); - background-position: -212px -735px; + background-position: 0px -744px; width: 105px; height: 105px; } .Mount_Body_Hedgehog-Red { background-image: url(spritesmith-main-7.png); - background-position: -318px -735px; + background-position: -106px -744px; width: 105px; height: 105px; } .Mount_Body_Hedgehog-Shade { background-image: url(spritesmith-main-7.png); - background-position: -424px -735px; + background-position: -212px -744px; width: 105px; height: 105px; } .Mount_Body_Hedgehog-Skeleton { background-image: url(spritesmith-main-7.png); - background-position: -530px -735px; + background-position: -318px -744px; width: 105px; height: 105px; } .Mount_Body_Hedgehog-White { background-image: url(spritesmith-main-7.png); - background-position: -636px -735px; + background-position: -424px -744px; width: 105px; height: 105px; } .Mount_Body_Hedgehog-Zombie { background-image: url(spritesmith-main-7.png); - background-position: -742px -735px; + background-position: -530px -744px; width: 105px; height: 105px; } .Mount_Body_Horse-Base { background-image: url(spritesmith-main-7.png); - background-position: -862px 0px; + background-position: -636px -744px; width: 105px; height: 105px; } .Mount_Body_Horse-CottonCandyBlue { background-image: url(spritesmith-main-7.png); - background-position: -862px -106px; + background-position: -742px -744px; width: 105px; height: 105px; } .Mount_Body_Horse-CottonCandyPink { background-image: url(spritesmith-main-7.png); - background-position: -862px -212px; + background-position: -862px 0px; width: 105px; height: 105px; } .Mount_Body_Horse-Desert { background-image: url(spritesmith-main-7.png); - background-position: -862px -318px; + background-position: -862px -106px; width: 105px; height: 105px; } .Mount_Body_Horse-Golden { background-image: url(spritesmith-main-7.png); - background-position: -862px -424px; + background-position: -862px -212px; width: 105px; height: 105px; } .Mount_Body_Horse-Red { background-image: url(spritesmith-main-7.png); - background-position: -862px -530px; + background-position: -862px -318px; width: 105px; height: 105px; } .Mount_Body_Horse-Shade { background-image: url(spritesmith-main-7.png); - background-position: -862px -636px; + background-position: -862px -424px; width: 105px; height: 105px; } .Mount_Body_Horse-Skeleton { background-image: url(spritesmith-main-7.png); - background-position: 0px -841px; + background-position: -862px -530px; width: 105px; height: 105px; } .Mount_Body_Horse-White { background-image: url(spritesmith-main-7.png); - background-position: -106px -841px; + background-position: -862px -636px; width: 105px; height: 105px; } .Mount_Body_Horse-Zombie { background-image: url(spritesmith-main-7.png); - background-position: -212px -841px; + background-position: -862px -742px; width: 105px; height: 105px; } .Mount_Body_JackOLantern-Base { background-image: url(spritesmith-main-7.png); - background-position: -1710px -212px; + background-position: -848px -1592px; width: 90px; height: 105px; } .Mount_Body_LionCub-Base { background-image: url(spritesmith-main-7.png); - background-position: -424px -841px; + background-position: -106px -850px; width: 105px; height: 105px; } .Mount_Body_LionCub-CottonCandyBlue { background-image: url(spritesmith-main-7.png); - background-position: -530px -841px; + background-position: -212px -850px; width: 105px; height: 105px; } .Mount_Body_LionCub-CottonCandyPink { background-image: url(spritesmith-main-7.png); - background-position: -636px -841px; + background-position: -318px -850px; width: 105px; height: 105px; } .Mount_Body_LionCub-Desert { background-image: url(spritesmith-main-7.png); - background-position: -742px -841px; + background-position: -424px -850px; width: 105px; height: 105px; } .Mount_Body_LionCub-Ethereal { background-image: url(spritesmith-main-7.png); - background-position: -848px -841px; + background-position: -530px -850px; width: 105px; height: 105px; } .Mount_Body_LionCub-Golden { background-image: url(spritesmith-main-7.png); - background-position: -968px 0px; + background-position: -636px -850px; width: 105px; height: 105px; } .Mount_Body_LionCub-Peppermint { background-image: url(spritesmith-main-7.png); - background-position: -968px -106px; + background-position: -742px -850px; width: 105px; height: 105px; } .Mount_Body_LionCub-Red { background-image: url(spritesmith-main-7.png); - background-position: -968px -212px; + background-position: -848px -850px; width: 105px; height: 105px; } .Mount_Body_LionCub-Shade { background-image: url(spritesmith-main-7.png); - background-position: -968px -318px; + background-position: -968px 0px; width: 105px; height: 105px; } .Mount_Body_LionCub-Skeleton { background-image: url(spritesmith-main-7.png); - background-position: 0px -523px; + background-position: -106px -523px; width: 111px; height: 105px; } .Mount_Body_LionCub-Spooky { background-image: url(spritesmith-main-7.png); - background-position: -968px -530px; + background-position: -968px -212px; width: 105px; height: 105px; } .Mount_Body_LionCub-White { background-image: url(spritesmith-main-7.png); - background-position: -968px -636px; + background-position: -968px -318px; width: 105px; height: 105px; } .Mount_Body_LionCub-Zombie { background-image: url(spritesmith-main-7.png); - background-position: -968px -742px; + background-position: -968px -424px; width: 105px; height: 105px; } +.Mount_Body_MagicalBee-Base { + background-image: url(spritesmith-main-7.png); + background-position: -408px -260px; + width: 105px; + height: 114px; +} .Mount_Body_Mammoth-Base { background-image: url(spritesmith-main-7.png); background-position: -408px -136px; @@ -468,973 +474,967 @@ } .Mount_Body_MantisShrimp-Base { background-image: url(spritesmith-main-7.png); - background-position: -112px -523px; + background-position: -218px -523px; width: 108px; height: 105px; } .Mount_Body_Monkey-Base { background-image: url(spritesmith-main-7.png); - background-position: -212px -947px; + background-position: -968px -848px; width: 105px; height: 105px; } .Mount_Body_Monkey-CottonCandyBlue { background-image: url(spritesmith-main-7.png); - background-position: -318px -947px; + background-position: 0px -956px; width: 105px; height: 105px; } .Mount_Body_Monkey-CottonCandyPink { background-image: url(spritesmith-main-7.png); - background-position: -424px -947px; + background-position: -106px -956px; width: 105px; height: 105px; } .Mount_Body_Monkey-Desert { background-image: url(spritesmith-main-7.png); - background-position: -530px -947px; + background-position: -212px -956px; width: 105px; height: 105px; } .Mount_Body_Monkey-Golden { background-image: url(spritesmith-main-7.png); - background-position: -636px -947px; + background-position: -318px -956px; width: 105px; height: 105px; } .Mount_Body_Monkey-Red { background-image: url(spritesmith-main-7.png); - background-position: -742px -947px; + background-position: -424px -956px; width: 105px; height: 105px; } .Mount_Body_Monkey-Shade { background-image: url(spritesmith-main-7.png); - background-position: -848px -947px; + background-position: -530px -956px; width: 105px; height: 105px; } .Mount_Body_Monkey-Skeleton { background-image: url(spritesmith-main-7.png); - background-position: -954px -947px; + background-position: -636px -956px; width: 105px; height: 105px; } .Mount_Body_Monkey-White { background-image: url(spritesmith-main-7.png); - background-position: -1074px 0px; + background-position: -742px -956px; width: 105px; height: 105px; } .Mount_Body_Monkey-Zombie { background-image: url(spritesmith-main-7.png); - background-position: -1074px -106px; + background-position: -848px -956px; width: 105px; height: 105px; } .Mount_Body_Octopus-Base { background-image: url(spritesmith-main-7.png); - background-position: -1074px -212px; + background-position: -954px -956px; width: 105px; height: 105px; } .Mount_Body_Octopus-CottonCandyBlue { background-image: url(spritesmith-main-7.png); - background-position: -1074px -318px; + background-position: -1074px 0px; width: 105px; height: 105px; } .Mount_Body_Octopus-CottonCandyPink { background-image: url(spritesmith-main-7.png); - background-position: -1074px -424px; + background-position: -1074px -106px; width: 105px; height: 105px; } .Mount_Body_Octopus-Desert { background-image: url(spritesmith-main-7.png); - background-position: -1074px -530px; + background-position: -1074px -212px; width: 105px; height: 105px; } .Mount_Body_Octopus-Golden { background-image: url(spritesmith-main-7.png); - background-position: -1074px -636px; + background-position: -1074px -318px; width: 105px; height: 105px; } .Mount_Body_Octopus-Red { background-image: url(spritesmith-main-7.png); - background-position: -1074px -742px; + background-position: -1074px -424px; width: 105px; height: 105px; } .Mount_Body_Octopus-Shade { background-image: url(spritesmith-main-7.png); - background-position: -1074px -848px; + background-position: -1074px -530px; width: 105px; height: 105px; } .Mount_Body_Octopus-Skeleton { background-image: url(spritesmith-main-7.png); - background-position: 0px -1053px; + background-position: -1074px -636px; width: 105px; height: 105px; } .Mount_Body_Octopus-White { background-image: url(spritesmith-main-7.png); - background-position: -106px -1053px; + background-position: -1074px -742px; width: 105px; height: 105px; } .Mount_Body_Octopus-Zombie { background-image: url(spritesmith-main-7.png); - background-position: -212px -1053px; + background-position: -1074px -848px; width: 105px; height: 105px; } .Mount_Body_Orca-Base { background-image: url(spritesmith-main-7.png); - background-position: -318px -1053px; + background-position: -1074px -954px; width: 105px; height: 105px; } .Mount_Body_Owl-Base { background-image: url(spritesmith-main-7.png); - background-position: -424px -1053px; + background-position: 0px -1062px; width: 105px; height: 105px; } .Mount_Body_Owl-CottonCandyBlue { background-image: url(spritesmith-main-7.png); - background-position: -530px -1053px; + background-position: -106px -1062px; width: 105px; height: 105px; } .Mount_Body_Owl-CottonCandyPink { background-image: url(spritesmith-main-7.png); - background-position: -636px -1053px; + background-position: -212px -1062px; width: 105px; height: 105px; } .Mount_Body_Owl-Desert { background-image: url(spritesmith-main-7.png); - background-position: -742px -1053px; + background-position: -318px -1062px; width: 105px; height: 105px; } .Mount_Body_Owl-Golden { background-image: url(spritesmith-main-7.png); - background-position: -848px -1053px; + background-position: -424px -1062px; width: 105px; height: 105px; } .Mount_Body_Owl-Red { background-image: url(spritesmith-main-7.png); - background-position: -954px -1053px; + background-position: -530px -1062px; width: 105px; height: 105px; } .Mount_Body_Owl-Shade { background-image: url(spritesmith-main-7.png); - background-position: -1060px -1053px; + background-position: -636px -1062px; width: 105px; height: 105px; } .Mount_Body_Owl-Skeleton { background-image: url(spritesmith-main-7.png); - background-position: -1180px 0px; + background-position: -742px -1062px; width: 105px; height: 105px; } .Mount_Body_Owl-White { background-image: url(spritesmith-main-7.png); - background-position: -1180px -106px; + background-position: -848px -1062px; width: 105px; height: 105px; } .Mount_Body_Owl-Zombie { background-image: url(spritesmith-main-7.png); - background-position: -1180px -212px; + background-position: -954px -1062px; width: 105px; height: 105px; } .Mount_Body_PandaCub-Base { background-image: url(spritesmith-main-7.png); - background-position: -1180px -318px; + background-position: -1060px -1062px; width: 105px; height: 105px; } .Mount_Body_PandaCub-CottonCandyBlue { background-image: url(spritesmith-main-7.png); - background-position: -1180px -424px; + background-position: -1180px 0px; width: 105px; height: 105px; } .Mount_Body_PandaCub-CottonCandyPink { background-image: url(spritesmith-main-7.png); - background-position: -1180px -530px; + background-position: -1180px -106px; width: 105px; height: 105px; } .Mount_Body_PandaCub-Desert { background-image: url(spritesmith-main-7.png); - background-position: -1180px -636px; + background-position: -1180px -212px; width: 105px; height: 105px; } .Mount_Body_PandaCub-Golden { background-image: url(spritesmith-main-7.png); - background-position: -1180px -742px; + background-position: -1180px -318px; width: 105px; height: 105px; } .Mount_Body_PandaCub-Peppermint { background-image: url(spritesmith-main-7.png); - background-position: -1180px -848px; + background-position: -1180px -424px; width: 105px; height: 105px; } .Mount_Body_PandaCub-Red { background-image: url(spritesmith-main-7.png); - background-position: -1180px -954px; + background-position: -1180px -530px; width: 105px; height: 105px; } .Mount_Body_PandaCub-Shade { background-image: url(spritesmith-main-7.png); - background-position: 0px -1159px; + background-position: -1180px -636px; width: 105px; height: 105px; } .Mount_Body_PandaCub-Skeleton { background-image: url(spritesmith-main-7.png); - background-position: -106px -1159px; + background-position: -1180px -742px; width: 105px; height: 105px; } .Mount_Body_PandaCub-Spooky { background-image: url(spritesmith-main-7.png); - background-position: -212px -1159px; + background-position: -327px -523px; width: 105px; height: 105px; } .Mount_Body_PandaCub-White { background-image: url(spritesmith-main-7.png); - background-position: -221px -523px; + background-position: -1180px -954px; width: 105px; height: 105px; } .Mount_Body_PandaCub-Zombie { background-image: url(spritesmith-main-7.png); - background-position: -424px -1159px; + background-position: -1180px -1060px; width: 105px; height: 105px; } .Mount_Body_Parrot-Base { background-image: url(spritesmith-main-7.png); - background-position: -530px -1159px; + background-position: 0px -1168px; width: 105px; height: 105px; } .Mount_Body_Parrot-CottonCandyBlue { background-image: url(spritesmith-main-7.png); - background-position: -636px -1159px; + background-position: -106px -1168px; width: 105px; height: 105px; } .Mount_Body_Parrot-CottonCandyPink { background-image: url(spritesmith-main-7.png); - background-position: -742px -1159px; + background-position: -212px -1168px; width: 105px; height: 105px; } .Mount_Body_Parrot-Desert { background-image: url(spritesmith-main-7.png); - background-position: -848px -1159px; + background-position: -318px -1168px; width: 105px; height: 105px; } .Mount_Body_Parrot-Golden { background-image: url(spritesmith-main-7.png); - background-position: -954px -1159px; + background-position: -424px -1168px; width: 105px; height: 105px; } .Mount_Body_Parrot-Red { background-image: url(spritesmith-main-7.png); - background-position: -1060px -1159px; + background-position: -530px -1168px; width: 105px; height: 105px; } .Mount_Body_Parrot-Shade { background-image: url(spritesmith-main-7.png); - background-position: -1166px -1159px; + background-position: -636px -1168px; width: 105px; height: 105px; } .Mount_Body_Parrot-Skeleton { background-image: url(spritesmith-main-7.png); - background-position: -1286px 0px; + background-position: -742px -1168px; width: 105px; height: 105px; } .Mount_Body_Parrot-White { background-image: url(spritesmith-main-7.png); - background-position: -1286px -106px; + background-position: -848px -1168px; width: 105px; height: 105px; } .Mount_Body_Parrot-Zombie { background-image: url(spritesmith-main-7.png); - background-position: -1286px -212px; + background-position: -954px -1168px; width: 105px; height: 105px; } .Mount_Body_Penguin-Base { background-image: url(spritesmith-main-7.png); - background-position: -1286px -318px; + background-position: -1060px -1168px; width: 105px; height: 105px; } .Mount_Body_Penguin-CottonCandyBlue { background-image: url(spritesmith-main-7.png); - background-position: -1286px -424px; + background-position: -1166px -1168px; width: 105px; height: 105px; } .Mount_Body_Penguin-CottonCandyPink { background-image: url(spritesmith-main-7.png); - background-position: -1286px -530px; + background-position: -1286px 0px; width: 105px; height: 105px; } .Mount_Body_Penguin-Desert { background-image: url(spritesmith-main-7.png); - background-position: -1286px -636px; + background-position: -1286px -106px; width: 105px; height: 105px; } .Mount_Body_Penguin-Golden { background-image: url(spritesmith-main-7.png); - background-position: -1286px -742px; + background-position: -1286px -212px; width: 105px; height: 105px; } .Mount_Body_Penguin-Red { background-image: url(spritesmith-main-7.png); - background-position: -1286px -848px; + background-position: -1286px -318px; width: 105px; height: 105px; } .Mount_Body_Penguin-Shade { background-image: url(spritesmith-main-7.png); - background-position: -1286px -954px; + background-position: -1286px -424px; width: 105px; height: 105px; } .Mount_Body_Penguin-Skeleton { background-image: url(spritesmith-main-7.png); - background-position: -1286px -1060px; + background-position: -1286px -530px; width: 105px; height: 105px; } .Mount_Body_Penguin-White { background-image: url(spritesmith-main-7.png); - background-position: 0px -1265px; + background-position: -1286px -636px; width: 105px; height: 105px; } .Mount_Body_Penguin-Zombie { background-image: url(spritesmith-main-7.png); - background-position: -106px -1265px; + background-position: -1286px -742px; width: 105px; height: 105px; } .Mount_Body_Phoenix-Base { background-image: url(spritesmith-main-7.png); - background-position: -212px -1265px; + background-position: -1286px -848px; width: 105px; height: 105px; } .Mount_Body_Rat-Base { background-image: url(spritesmith-main-7.png); - background-position: -318px -1265px; + background-position: -1286px -954px; width: 105px; height: 105px; } .Mount_Body_Rat-CottonCandyBlue { background-image: url(spritesmith-main-7.png); - background-position: -424px -1265px; + background-position: -1286px -1060px; width: 105px; height: 105px; } .Mount_Body_Rat-CottonCandyPink { background-image: url(spritesmith-main-7.png); - background-position: -530px -1265px; + background-position: -1286px -1166px; width: 105px; height: 105px; } .Mount_Body_Rat-Desert { background-image: url(spritesmith-main-7.png); - background-position: -636px -1265px; + background-position: 0px -1274px; width: 105px; height: 105px; } .Mount_Body_Rat-Golden { background-image: url(spritesmith-main-7.png); - background-position: -742px -1265px; + background-position: -106px -1274px; width: 105px; height: 105px; } .Mount_Body_Rat-Red { background-image: url(spritesmith-main-7.png); - background-position: -848px -1265px; + background-position: -212px -1274px; width: 105px; height: 105px; } .Mount_Body_Rat-Shade { background-image: url(spritesmith-main-7.png); - background-position: -954px -1265px; + background-position: -318px -1274px; width: 105px; height: 105px; } .Mount_Body_Rat-Skeleton { background-image: url(spritesmith-main-7.png); - background-position: -1060px -1265px; + background-position: -424px -1274px; width: 105px; height: 105px; } .Mount_Body_Rat-White { background-image: url(spritesmith-main-7.png); - background-position: -1166px -1265px; + background-position: -530px -1274px; width: 105px; height: 105px; } .Mount_Body_Rat-Zombie { background-image: url(spritesmith-main-7.png); - background-position: -1272px -1265px; + background-position: -636px -1274px; width: 105px; height: 105px; } .Mount_Body_Rock-Base { background-image: url(spritesmith-main-7.png); - background-position: -1392px 0px; + background-position: -742px -1274px; width: 105px; height: 105px; } .Mount_Body_Rock-CottonCandyBlue { background-image: url(spritesmith-main-7.png); - background-position: -1392px -106px; + background-position: -848px -1274px; width: 105px; height: 105px; } .Mount_Body_Rock-CottonCandyPink { background-image: url(spritesmith-main-7.png); - background-position: -1392px -212px; + background-position: -954px -1274px; width: 105px; height: 105px; } .Mount_Body_Rock-Desert { background-image: url(spritesmith-main-7.png); - background-position: -1392px -318px; + background-position: -1060px -1274px; width: 105px; height: 105px; } .Mount_Body_Rock-Golden { background-image: url(spritesmith-main-7.png); - background-position: -1392px -424px; + background-position: -1166px -1274px; width: 105px; height: 105px; } .Mount_Body_Rock-Red { background-image: url(spritesmith-main-7.png); - background-position: -1392px -530px; + background-position: -1272px -1274px; width: 105px; height: 105px; } .Mount_Body_Rock-Shade { background-image: url(spritesmith-main-7.png); - background-position: -1392px -636px; + background-position: -1392px 0px; width: 105px; height: 105px; } .Mount_Body_Rock-Skeleton { background-image: url(spritesmith-main-7.png); - background-position: -1392px -742px; + background-position: -1392px -106px; width: 105px; height: 105px; } .Mount_Body_Rock-White { background-image: url(spritesmith-main-7.png); - background-position: -1392px -848px; + background-position: -1392px -212px; width: 105px; height: 105px; } .Mount_Body_Rock-Zombie { background-image: url(spritesmith-main-7.png); - background-position: -1392px -954px; + background-position: -1392px -318px; width: 105px; height: 105px; } .Mount_Body_Rooster-Base { background-image: url(spritesmith-main-7.png); - background-position: -1392px -1060px; + background-position: -1392px -424px; width: 105px; height: 105px; } .Mount_Body_Rooster-CottonCandyBlue { background-image: url(spritesmith-main-7.png); - background-position: -1392px -1166px; + background-position: -1392px -530px; width: 105px; height: 105px; } .Mount_Body_Rooster-CottonCandyPink { background-image: url(spritesmith-main-7.png); - background-position: 0px -1371px; + background-position: -1392px -636px; width: 105px; height: 105px; } .Mount_Body_Rooster-Desert { background-image: url(spritesmith-main-7.png); - background-position: -106px -1371px; + background-position: -1392px -742px; width: 105px; height: 105px; } .Mount_Body_Rooster-Golden { background-image: url(spritesmith-main-7.png); - background-position: -212px -1371px; + background-position: -1392px -848px; width: 105px; height: 105px; } .Mount_Body_Rooster-Red { background-image: url(spritesmith-main-7.png); - background-position: -318px -1371px; + background-position: -1392px -954px; width: 105px; height: 105px; } .Mount_Body_Rooster-Shade { background-image: url(spritesmith-main-7.png); - background-position: -424px -1371px; + background-position: -1392px -1060px; width: 105px; height: 105px; } .Mount_Body_Rooster-Skeleton { background-image: url(spritesmith-main-7.png); - background-position: -530px -1371px; + background-position: -1392px -1166px; width: 105px; height: 105px; } .Mount_Body_Rooster-White { background-image: url(spritesmith-main-7.png); - background-position: -636px -1371px; + background-position: -1392px -1272px; width: 105px; height: 105px; } .Mount_Body_Rooster-Zombie { background-image: url(spritesmith-main-7.png); - background-position: -742px -1371px; + background-position: 0px -1380px; width: 105px; height: 105px; } .Mount_Body_Sabretooth-Base { background-image: url(spritesmith-main-7.png); - background-position: -408px 0px; + background-position: -272px 0px; width: 135px; height: 135px; } .Mount_Body_Sabretooth-CottonCandyBlue { background-image: url(spritesmith-main-7.png); - background-position: -272px -272px; + background-position: 0px 0px; width: 135px; height: 135px; } .Mount_Body_Sabretooth-CottonCandyPink { background-image: url(spritesmith-main-7.png); - background-position: -136px -272px; + background-position: 0px -272px; width: 135px; height: 135px; } .Mount_Body_Sabretooth-Desert { background-image: url(spritesmith-main-7.png); - background-position: 0px -272px; + background-position: -136px -272px; width: 135px; height: 135px; } .Mount_Body_Sabretooth-Golden { background-image: url(spritesmith-main-7.png); - background-position: -272px -136px; + background-position: -272px -272px; width: 135px; height: 135px; } .Mount_Body_Sabretooth-Red { background-image: url(spritesmith-main-7.png); - background-position: -272px 0px; + background-position: 0px -136px; width: 135px; height: 135px; } .Mount_Body_Sabretooth-Shade { background-image: url(spritesmith-main-7.png); - background-position: -136px -136px; + background-position: -408px 0px; width: 135px; height: 135px; } .Mount_Body_Sabretooth-Skeleton { background-image: url(spritesmith-main-7.png); - background-position: 0px -136px; + background-position: -136px -136px; width: 135px; height: 135px; } .Mount_Body_Sabretooth-White { background-image: url(spritesmith-main-7.png); - background-position: -136px 0px; + background-position: -272px -136px; width: 135px; height: 135px; } .Mount_Body_Sabretooth-Zombie { background-image: url(spritesmith-main-7.png); - background-position: 0px 0px; + background-position: -136px 0px; width: 135px; height: 135px; } .Mount_Body_Seahorse-Base { background-image: url(spritesmith-main-7.png); - background-position: -1498px -424px; + background-position: -1166px -1380px; width: 105px; height: 105px; } .Mount_Body_Seahorse-CottonCandyBlue { background-image: url(spritesmith-main-7.png); - background-position: -1498px -530px; + background-position: -1272px -1380px; width: 105px; height: 105px; } .Mount_Body_Seahorse-CottonCandyPink { background-image: url(spritesmith-main-7.png); - background-position: -1498px -636px; + background-position: -1378px -1380px; width: 105px; height: 105px; } .Mount_Body_Seahorse-Desert { background-image: url(spritesmith-main-7.png); - background-position: -1498px -742px; + background-position: -1498px 0px; width: 105px; height: 105px; } .Mount_Body_Seahorse-Golden { background-image: url(spritesmith-main-7.png); - background-position: -1498px -848px; + background-position: -1498px -106px; width: 105px; height: 105px; } .Mount_Body_Seahorse-Red { background-image: url(spritesmith-main-7.png); - background-position: -1498px -954px; + background-position: -1498px -212px; width: 105px; height: 105px; } .Mount_Body_Seahorse-Shade { background-image: url(spritesmith-main-7.png); - background-position: -1498px -1060px; + background-position: -1498px -318px; width: 105px; height: 105px; } .Mount_Body_Seahorse-Skeleton { background-image: url(spritesmith-main-7.png); - background-position: -1498px -1166px; + background-position: -1498px -424px; width: 105px; height: 105px; } .Mount_Body_Seahorse-White { background-image: url(spritesmith-main-7.png); - background-position: -1498px -1272px; + background-position: -1498px -530px; width: 105px; height: 105px; } .Mount_Body_Seahorse-Zombie { background-image: url(spritesmith-main-7.png); - background-position: 0px -1477px; + background-position: -1498px -636px; width: 105px; height: 105px; } .Mount_Body_Sheep-Base { background-image: url(spritesmith-main-7.png); - background-position: -106px -1477px; + background-position: -1498px -742px; width: 105px; height: 105px; } .Mount_Body_Sheep-CottonCandyBlue { background-image: url(spritesmith-main-7.png); - background-position: -212px -1477px; + background-position: -1498px -848px; width: 105px; height: 105px; } .Mount_Body_Sheep-CottonCandyPink { background-image: url(spritesmith-main-7.png); - background-position: -318px -1477px; + background-position: -1498px -954px; width: 105px; height: 105px; } .Mount_Body_Sheep-Desert { background-image: url(spritesmith-main-7.png); - background-position: -424px -1477px; + background-position: -1498px -1060px; width: 105px; height: 105px; } .Mount_Body_Sheep-Golden { background-image: url(spritesmith-main-7.png); - background-position: -530px -1477px; + background-position: -1498px -1166px; width: 105px; height: 105px; } .Mount_Body_Sheep-Red { background-image: url(spritesmith-main-7.png); - background-position: -636px -1477px; + background-position: -1498px -1272px; width: 105px; height: 105px; } .Mount_Body_Sheep-Shade { background-image: url(spritesmith-main-7.png); - background-position: -742px -1477px; + background-position: -1498px -1378px; width: 105px; height: 105px; } .Mount_Body_Sheep-Skeleton { background-image: url(spritesmith-main-7.png); - background-position: -848px -1477px; + background-position: 0px -1486px; width: 105px; height: 105px; } .Mount_Body_Sheep-White { background-image: url(spritesmith-main-7.png); - background-position: -954px -1477px; + background-position: -106px -1486px; width: 105px; height: 105px; } .Mount_Body_Sheep-Zombie { background-image: url(spritesmith-main-7.png); - background-position: -1060px -1477px; + background-position: -212px -1486px; width: 105px; height: 105px; } .Mount_Body_Slime-Base { background-image: url(spritesmith-main-7.png); - background-position: -1166px -1477px; + background-position: -318px -1486px; width: 105px; height: 105px; } .Mount_Body_Slime-CottonCandyBlue { background-image: url(spritesmith-main-7.png); - background-position: -1272px -1477px; + background-position: -424px -1486px; width: 105px; height: 105px; } .Mount_Body_Slime-CottonCandyPink { background-image: url(spritesmith-main-7.png); - background-position: -1378px -1477px; + background-position: -530px -1486px; width: 105px; height: 105px; } .Mount_Body_Slime-Desert { background-image: url(spritesmith-main-7.png); - background-position: -1484px -1477px; + background-position: -636px -1486px; width: 105px; height: 105px; } .Mount_Body_Slime-Golden { background-image: url(spritesmith-main-7.png); - background-position: -1604px 0px; + background-position: -742px -1486px; width: 105px; height: 105px; } .Mount_Body_Slime-Red { background-image: url(spritesmith-main-7.png); - background-position: -1604px -106px; + background-position: -848px -1486px; width: 105px; height: 105px; } .Mount_Body_Slime-Shade { background-image: url(spritesmith-main-7.png); - background-position: -1604px -212px; + background-position: -954px -1486px; width: 105px; height: 105px; } .Mount_Body_Slime-Skeleton { background-image: url(spritesmith-main-7.png); - background-position: -1604px -318px; + background-position: -1060px -1486px; width: 105px; height: 105px; } .Mount_Body_Slime-White { background-image: url(spritesmith-main-7.png); - background-position: -1604px -424px; + background-position: -1166px -1486px; width: 105px; height: 105px; } .Mount_Body_Slime-Zombie { background-image: url(spritesmith-main-7.png); - background-position: -1604px -530px; + background-position: -1272px -1486px; width: 105px; height: 105px; } .Mount_Body_Snail-Base { background-image: url(spritesmith-main-7.png); - background-position: -1604px -636px; + background-position: -1378px -1486px; width: 105px; height: 105px; } .Mount_Body_Snail-CottonCandyBlue { background-image: url(spritesmith-main-7.png); - background-position: -1604px -742px; + background-position: -1484px -1486px; width: 105px; height: 105px; } .Mount_Body_Snail-CottonCandyPink { background-image: url(spritesmith-main-7.png); - background-position: -1604px -848px; + background-position: -1604px 0px; width: 105px; height: 105px; } .Mount_Body_Snail-Desert { background-image: url(spritesmith-main-7.png); - background-position: -1604px -954px; + background-position: -1604px -106px; width: 105px; height: 105px; } .Mount_Body_Snail-Golden { background-image: url(spritesmith-main-7.png); - background-position: -1604px -1060px; + background-position: -1604px -212px; width: 105px; height: 105px; } .Mount_Body_Snail-Red { background-image: url(spritesmith-main-7.png); - background-position: -1604px -1166px; + background-position: -1604px -318px; width: 105px; height: 105px; } .Mount_Body_Snail-Shade { background-image: url(spritesmith-main-7.png); - background-position: -1604px -1272px; + background-position: -1604px -424px; width: 105px; height: 105px; } .Mount_Body_Snail-Skeleton { background-image: url(spritesmith-main-7.png); - background-position: -1604px -1378px; + background-position: -1604px -530px; width: 105px; height: 105px; } .Mount_Body_Snail-White { background-image: url(spritesmith-main-7.png); - background-position: 0px -1583px; + background-position: -1604px -636px; width: 105px; height: 105px; } .Mount_Body_Snail-Zombie { background-image: url(spritesmith-main-7.png); - background-position: -106px -1583px; + background-position: -1604px -742px; width: 105px; height: 105px; } .Mount_Body_Snake-Base { background-image: url(spritesmith-main-7.png); - background-position: -212px -1583px; + background-position: -1604px -848px; width: 105px; height: 105px; } .Mount_Body_Snake-CottonCandyBlue { background-image: url(spritesmith-main-7.png); - background-position: -318px -1583px; + background-position: -1604px -954px; width: 105px; height: 105px; } .Mount_Body_Snake-CottonCandyPink { background-image: url(spritesmith-main-7.png); - background-position: -424px -1583px; + background-position: -1604px -1060px; width: 105px; height: 105px; } .Mount_Body_Snake-Desert { background-image: url(spritesmith-main-7.png); - background-position: -530px -1583px; + background-position: -1604px -1166px; width: 105px; height: 105px; } .Mount_Body_Snake-Golden { background-image: url(spritesmith-main-7.png); - background-position: -636px -1583px; + background-position: -1604px -1272px; width: 105px; height: 105px; } .Mount_Body_Snake-Red { background-image: url(spritesmith-main-7.png); - background-position: -742px -1583px; + background-position: -1604px -1378px; width: 105px; height: 105px; } .Mount_Body_Snake-Shade { background-image: url(spritesmith-main-7.png); - background-position: -848px -1583px; + background-position: -1604px -1484px; width: 105px; height: 105px; } .Mount_Body_Snake-Skeleton { background-image: url(spritesmith-main-7.png); - background-position: -954px -1583px; + background-position: 0px -1592px; width: 105px; height: 105px; } .Mount_Body_Snake-White { background-image: url(spritesmith-main-7.png); - background-position: -1060px -1583px; + background-position: -106px -1592px; width: 105px; height: 105px; } .Mount_Body_Snake-Zombie { background-image: url(spritesmith-main-7.png); - background-position: -1166px -1583px; + background-position: -212px -1592px; width: 105px; height: 105px; } .Mount_Body_Spider-Base { background-image: url(spritesmith-main-7.png); - background-position: -1272px -1583px; + background-position: -318px -1592px; width: 105px; height: 105px; } .Mount_Body_Spider-CottonCandyBlue { background-image: url(spritesmith-main-7.png); - background-position: -1378px -1583px; + background-position: -424px -1592px; width: 105px; height: 105px; } .Mount_Body_Spider-CottonCandyPink { background-image: url(spritesmith-main-7.png); - background-position: -1484px -1583px; + background-position: -530px -1592px; width: 105px; height: 105px; } .Mount_Body_Spider-Desert { background-image: url(spritesmith-main-7.png); - background-position: -1590px -1583px; + background-position: -636px -1592px; width: 105px; height: 105px; } .Mount_Body_Spider-Golden { background-image: url(spritesmith-main-7.png); - background-position: -1710px 0px; + background-position: 0px -850px; width: 105px; height: 105px; } .Mount_Body_Spider-Red { background-image: url(spritesmith-main-7.png); - background-position: -318px -841px; - width: 105px; - height: 105px; -} -.Mount_Body_Spider-Shade { - background-image: url(spritesmith-main-7.png); - background-position: -1710px -106px; + background-position: -742px -1592px; width: 105px; height: 105px; } diff --git a/common/dist/sprites/spritesmith-main-7.png b/common/dist/sprites/spritesmith-main-7.png index b6d51e15e2..709417f562 100644 Binary files a/common/dist/sprites/spritesmith-main-7.png and b/common/dist/sprites/spritesmith-main-7.png differ diff --git a/common/dist/sprites/spritesmith-main-8.css b/common/dist/sprites/spritesmith-main-8.css index b7cdbcf911..300a95cb5a 100644 --- a/common/dist/sprites/spritesmith-main-8.css +++ b/common/dist/sprites/spritesmith-main-8.css @@ -1,30 +1,36 @@ -.Mount_Body_Spider-Skeleton { +.Mount_Body_Spider-Shade { background-image: url(spritesmith-main-8.png); - background-position: 0px -795px; + background-position: -212px -795px; width: 105px; height: 105px; } -.Mount_Body_Spider-White { +.Mount_Body_Spider-Skeleton { background-image: url(spritesmith-main-8.png); background-position: -954px -1113px; width: 105px; height: 105px; } +.Mount_Body_Spider-White { + background-image: url(spritesmith-main-8.png); + background-position: -318px -795px; + width: 105px; + height: 105px; +} .Mount_Body_Spider-Zombie { background-image: url(spritesmith-main-8.png); - background-position: -106px -795px; + background-position: -424px -795px; width: 105px; height: 105px; } .Mount_Body_TRex-Base { background-image: url(spritesmith-main-8.png); - background-position: 0px 0px; + background-position: 0px -544px; width: 135px; height: 135px; } .Mount_Body_TRex-CottonCandyBlue { background-image: url(spritesmith-main-8.png); - background-position: -136px -544px; + background-position: -408px -272px; width: 135px; height: 135px; } @@ -78,199 +84,199 @@ } .Mount_Body_TigerCub-Base { background-image: url(spritesmith-main-8.png); - background-position: -212px -795px; + background-position: -530px -795px; width: 105px; height: 105px; } .Mount_Body_TigerCub-CottonCandyBlue { background-image: url(spritesmith-main-8.png); - background-position: -318px -795px; + background-position: -636px -795px; width: 105px; height: 105px; } .Mount_Body_TigerCub-CottonCandyPink { background-image: url(spritesmith-main-8.png); - background-position: -424px -795px; + background-position: -742px -795px; width: 105px; height: 105px; } .Mount_Body_TigerCub-Desert { background-image: url(spritesmith-main-8.png); - background-position: -530px -795px; + background-position: -848px -795px; width: 105px; height: 105px; } .Mount_Body_TigerCub-Golden { background-image: url(spritesmith-main-8.png); - background-position: -636px -795px; + background-position: -1210px -742px; width: 105px; height: 105px; } .Mount_Body_TigerCub-Peppermint { background-image: url(spritesmith-main-8.png); - background-position: -742px -795px; + background-position: -1210px -848px; width: 105px; height: 105px; } .Mount_Body_TigerCub-Red { background-image: url(spritesmith-main-8.png); - background-position: -1210px -636px; + background-position: -1210px -954px; width: 105px; height: 105px; } .Mount_Body_TigerCub-Shade { background-image: url(spritesmith-main-8.png); - background-position: -1210px -742px; + background-position: -892px -424px; width: 105px; height: 105px; } .Mount_Body_TigerCub-Skeleton { background-image: url(spritesmith-main-8.png); - background-position: -892px -318px; + background-position: -892px -530px; width: 105px; height: 105px; } .Mount_Body_TigerCub-Spooky { background-image: url(spritesmith-main-8.png); - background-position: -892px -424px; + background-position: -892px -636px; width: 105px; height: 105px; } .Mount_Body_TigerCub-White { background-image: url(spritesmith-main-8.png); - background-position: -892px -530px; + background-position: 0px -795px; width: 105px; height: 105px; } .Mount_Body_TigerCub-Zombie { background-image: url(spritesmith-main-8.png); - background-position: -892px -636px; + background-position: -106px -795px; width: 105px; height: 105px; } .Mount_Body_Turkey-Base { background-image: url(spritesmith-main-8.png); - background-position: -1210px -848px; + background-position: 0px -1113px; width: 105px; height: 105px; } .Mount_Body_Unicorn-Base { background-image: url(spritesmith-main-8.png); - background-position: -1210px -954px; + background-position: -106px -1113px; width: 105px; height: 105px; } .Mount_Body_Unicorn-CottonCandyBlue { background-image: url(spritesmith-main-8.png); - background-position: 0px -1113px; + background-position: -212px -1113px; width: 105px; height: 105px; } .Mount_Body_Unicorn-CottonCandyPink { background-image: url(spritesmith-main-8.png); - background-position: -106px -1113px; + background-position: -318px -1113px; width: 105px; height: 105px; } .Mount_Body_Unicorn-Desert { background-image: url(spritesmith-main-8.png); - background-position: -212px -1113px; + background-position: -424px -1113px; width: 105px; height: 105px; } .Mount_Body_Unicorn-Golden { background-image: url(spritesmith-main-8.png); - background-position: -318px -1113px; + background-position: -530px -1113px; width: 105px; height: 105px; } .Mount_Body_Unicorn-Red { background-image: url(spritesmith-main-8.png); - background-position: -424px -1113px; + background-position: -636px -1113px; width: 105px; height: 105px; } .Mount_Body_Unicorn-Shade { background-image: url(spritesmith-main-8.png); - background-position: -530px -1113px; + background-position: -1528px -1166px; width: 105px; height: 105px; } .Mount_Body_Unicorn-Skeleton { background-image: url(spritesmith-main-8.png); - background-position: -1528px -1060px; + background-position: -1528px -1272px; width: 105px; height: 105px; } .Mount_Body_Unicorn-White { background-image: url(spritesmith-main-8.png); - background-position: -1528px -1166px; + background-position: 0px -1431px; width: 105px; height: 105px; } .Mount_Body_Unicorn-Zombie { background-image: url(spritesmith-main-8.png); - background-position: -1528px -1272px; + background-position: -106px -1431px; width: 105px; height: 105px; } .Mount_Body_Whale-Base { background-image: url(spritesmith-main-8.png); - background-position: 0px -1431px; + background-position: -212px -1431px; width: 105px; height: 105px; } .Mount_Body_Whale-CottonCandyBlue { background-image: url(spritesmith-main-8.png); - background-position: -106px -1431px; + background-position: -318px -1431px; width: 105px; height: 105px; } .Mount_Body_Whale-CottonCandyPink { background-image: url(spritesmith-main-8.png); - background-position: -212px -1431px; + background-position: -424px -1431px; width: 105px; height: 105px; } .Mount_Body_Whale-Desert { background-image: url(spritesmith-main-8.png); - background-position: -318px -1431px; + background-position: -530px -1431px; width: 105px; height: 105px; } .Mount_Body_Whale-Golden { background-image: url(spritesmith-main-8.png); - background-position: -424px -1431px; + background-position: -636px -1431px; width: 105px; height: 105px; } .Mount_Body_Whale-Red { background-image: url(spritesmith-main-8.png); - background-position: -530px -1431px; + background-position: -742px -1431px; width: 105px; height: 105px; } .Mount_Body_Whale-Shade { background-image: url(spritesmith-main-8.png); - background-position: -636px -1431px; + background-position: -892px 0px; width: 105px; height: 105px; } .Mount_Body_Whale-Skeleton { background-image: url(spritesmith-main-8.png); - background-position: -954px -1537px; + background-position: -892px -106px; width: 105px; height: 105px; } .Mount_Body_Whale-White { background-image: url(spritesmith-main-8.png); - background-position: -892px -106px; + background-position: -892px -212px; width: 105px; height: 105px; } .Mount_Body_Whale-Zombie { background-image: url(spritesmith-main-8.png); - background-position: -892px -212px; + background-position: -892px -318px; width: 105px; height: 105px; } @@ -282,7 +288,7 @@ } .Mount_Body_Wolf-CottonCandyBlue { background-image: url(spritesmith-main-8.png); - background-position: -408px -272px; + background-position: 0px 0px; width: 135px; height: 135px; } @@ -336,283 +342,283 @@ } .Mount_Body_Wolf-White { background-image: url(spritesmith-main-8.png); - background-position: 0px -544px; + background-position: -136px 0px; width: 135px; height: 135px; } .Mount_Body_Wolf-Zombie { background-image: url(spritesmith-main-8.png); - background-position: -136px 0px; + background-position: -136px -544px; width: 135px; height: 135px; } .Mount_Head_BearCub-Base { background-image: url(spritesmith-main-8.png); - background-position: -848px -795px; + background-position: -998px 0px; width: 105px; height: 105px; } .Mount_Head_BearCub-CottonCandyBlue { background-image: url(spritesmith-main-8.png); - background-position: -998px 0px; + background-position: -998px -106px; width: 105px; height: 105px; } .Mount_Head_BearCub-CottonCandyPink { background-image: url(spritesmith-main-8.png); - background-position: -998px -106px; + background-position: -998px -212px; width: 105px; height: 105px; } .Mount_Head_BearCub-Desert { background-image: url(spritesmith-main-8.png); - background-position: -998px -212px; + background-position: -998px -318px; width: 105px; height: 105px; } .Mount_Head_BearCub-Golden { background-image: url(spritesmith-main-8.png); - background-position: -998px -318px; + background-position: -998px -424px; width: 105px; height: 105px; } .Mount_Head_BearCub-Peppermint { background-image: url(spritesmith-main-8.png); - background-position: -998px -424px; + background-position: -998px -530px; width: 105px; height: 105px; } .Mount_Head_BearCub-Polar { background-image: url(spritesmith-main-8.png); - background-position: -998px -530px; + background-position: -998px -636px; width: 105px; height: 105px; } .Mount_Head_BearCub-Red { background-image: url(spritesmith-main-8.png); - background-position: -998px -636px; + background-position: -998px -742px; width: 105px; height: 105px; } .Mount_Head_BearCub-Shade { background-image: url(spritesmith-main-8.png); - background-position: -998px -742px; + background-position: 0px -901px; width: 105px; height: 105px; } .Mount_Head_BearCub-Skeleton { background-image: url(spritesmith-main-8.png); - background-position: 0px -901px; + background-position: -106px -901px; width: 105px; height: 105px; } .Mount_Head_BearCub-Spooky { background-image: url(spritesmith-main-8.png); - background-position: -106px -901px; + background-position: -212px -901px; width: 105px; height: 105px; } .Mount_Head_BearCub-White { background-image: url(spritesmith-main-8.png); - background-position: -212px -901px; + background-position: -318px -901px; width: 105px; height: 105px; } .Mount_Head_BearCub-Zombie { background-image: url(spritesmith-main-8.png); - background-position: -318px -901px; + background-position: -424px -901px; width: 105px; height: 105px; } .Mount_Head_Bunny-Base { background-image: url(spritesmith-main-8.png); - background-position: -424px -901px; + background-position: -530px -901px; width: 105px; height: 105px; } .Mount_Head_Bunny-CottonCandyBlue { background-image: url(spritesmith-main-8.png); - background-position: -530px -901px; + background-position: -636px -901px; width: 105px; height: 105px; } .Mount_Head_Bunny-CottonCandyPink { background-image: url(spritesmith-main-8.png); - background-position: -636px -901px; + background-position: -742px -901px; width: 105px; height: 105px; } .Mount_Head_Bunny-Desert { background-image: url(spritesmith-main-8.png); - background-position: -742px -901px; + background-position: -848px -901px; width: 105px; height: 105px; } .Mount_Head_Bunny-Golden { background-image: url(spritesmith-main-8.png); - background-position: -848px -901px; + background-position: -954px -901px; width: 105px; height: 105px; } .Mount_Head_Bunny-Red { background-image: url(spritesmith-main-8.png); - background-position: -954px -901px; + background-position: -1104px 0px; width: 105px; height: 105px; } .Mount_Head_Bunny-Shade { background-image: url(spritesmith-main-8.png); - background-position: -1104px 0px; + background-position: -1104px -106px; width: 105px; height: 105px; } .Mount_Head_Bunny-Skeleton { background-image: url(spritesmith-main-8.png); - background-position: -1104px -106px; + background-position: -1104px -212px; width: 105px; height: 105px; } .Mount_Head_Bunny-White { background-image: url(spritesmith-main-8.png); - background-position: -1104px -212px; + background-position: -1104px -318px; width: 105px; height: 105px; } .Mount_Head_Bunny-Zombie { background-image: url(spritesmith-main-8.png); - background-position: -1104px -318px; + background-position: -1104px -424px; width: 105px; height: 105px; } .Mount_Head_Cactus-Base { background-image: url(spritesmith-main-8.png); - background-position: -1104px -424px; + background-position: -1104px -530px; width: 105px; height: 105px; } .Mount_Head_Cactus-CottonCandyBlue { background-image: url(spritesmith-main-8.png); - background-position: -1104px -530px; + background-position: -1104px -636px; width: 105px; height: 105px; } .Mount_Head_Cactus-CottonCandyPink { background-image: url(spritesmith-main-8.png); - background-position: -1104px -636px; + background-position: -1104px -742px; width: 105px; height: 105px; } .Mount_Head_Cactus-Desert { background-image: url(spritesmith-main-8.png); - background-position: -1104px -742px; + background-position: -1104px -848px; width: 105px; height: 105px; } .Mount_Head_Cactus-Golden { background-image: url(spritesmith-main-8.png); - background-position: -1104px -848px; + background-position: 0px -1007px; width: 105px; height: 105px; } .Mount_Head_Cactus-Peppermint { background-image: url(spritesmith-main-8.png); - background-position: 0px -1007px; + background-position: -106px -1007px; width: 105px; height: 105px; } .Mount_Head_Cactus-Red { background-image: url(spritesmith-main-8.png); - background-position: -106px -1007px; + background-position: -212px -1007px; width: 105px; height: 105px; } .Mount_Head_Cactus-Shade { background-image: url(spritesmith-main-8.png); - background-position: -212px -1007px; + background-position: -318px -1007px; width: 105px; height: 105px; } .Mount_Head_Cactus-Skeleton { background-image: url(spritesmith-main-8.png); - background-position: -318px -1007px; + background-position: -424px -1007px; width: 105px; height: 105px; } .Mount_Head_Cactus-Spooky { background-image: url(spritesmith-main-8.png); - background-position: -424px -1007px; + background-position: -530px -1007px; width: 105px; height: 105px; } .Mount_Head_Cactus-White { background-image: url(spritesmith-main-8.png); - background-position: -530px -1007px; + background-position: -636px -1007px; width: 105px; height: 105px; } .Mount_Head_Cactus-Zombie { background-image: url(spritesmith-main-8.png); - background-position: -636px -1007px; + background-position: -742px -1007px; width: 105px; height: 105px; } .Mount_Head_Cheetah-Base { background-image: url(spritesmith-main-8.png); - background-position: -742px -1007px; + background-position: -848px -1007px; width: 105px; height: 105px; } .Mount_Head_Cheetah-CottonCandyBlue { background-image: url(spritesmith-main-8.png); - background-position: -848px -1007px; + background-position: -954px -1007px; width: 105px; height: 105px; } .Mount_Head_Cheetah-CottonCandyPink { background-image: url(spritesmith-main-8.png); - background-position: -954px -1007px; + background-position: -1060px -1007px; width: 105px; height: 105px; } .Mount_Head_Cheetah-Desert { background-image: url(spritesmith-main-8.png); - background-position: -1060px -1007px; + background-position: -1210px 0px; width: 105px; height: 105px; } .Mount_Head_Cheetah-Golden { background-image: url(spritesmith-main-8.png); - background-position: -1210px 0px; + background-position: -1210px -106px; width: 105px; height: 105px; } .Mount_Head_Cheetah-Red { background-image: url(spritesmith-main-8.png); - background-position: -1210px -106px; + background-position: -1210px -212px; width: 105px; height: 105px; } .Mount_Head_Cheetah-Shade { background-image: url(spritesmith-main-8.png); - background-position: -1210px -212px; + background-position: -1210px -318px; width: 105px; height: 105px; } .Mount_Head_Cheetah-Skeleton { background-image: url(spritesmith-main-8.png); - background-position: -1210px -318px; + background-position: -1210px -424px; width: 105px; height: 105px; } .Mount_Head_Cheetah-White { background-image: url(spritesmith-main-8.png); - background-position: -1210px -424px; + background-position: -1210px -530px; width: 105px; height: 105px; } .Mount_Head_Cheetah-Zombie { background-image: url(spritesmith-main-8.png); - background-position: -1210px -530px; + background-position: -1210px -636px; width: 105px; height: 105px; } @@ -624,697 +630,697 @@ } .Mount_Head_Cuttlefish-CottonCandyBlue { background-image: url(spritesmith-main-8.png); - background-position: -786px -230px; + background-position: -484px -544px; width: 105px; height: 114px; } .Mount_Head_Cuttlefish-CottonCandyPink { background-image: url(spritesmith-main-8.png); - background-position: -484px -544px; + background-position: -680px 0px; width: 105px; height: 114px; } .Mount_Head_Cuttlefish-Desert { background-image: url(spritesmith-main-8.png); - background-position: -680px 0px; + background-position: -680px -115px; width: 105px; height: 114px; } .Mount_Head_Cuttlefish-Golden { background-image: url(spritesmith-main-8.png); - background-position: -680px -115px; + background-position: -680px -230px; width: 105px; height: 114px; } .Mount_Head_Cuttlefish-Red { background-image: url(spritesmith-main-8.png); - background-position: -680px -230px; + background-position: -680px -345px; width: 105px; height: 114px; } .Mount_Head_Cuttlefish-Shade { background-image: url(spritesmith-main-8.png); - background-position: -680px -345px; + background-position: -680px -460px; width: 105px; height: 114px; } .Mount_Head_Cuttlefish-Skeleton { background-image: url(spritesmith-main-8.png); - background-position: -680px -460px; + background-position: -786px 0px; width: 105px; height: 114px; } .Mount_Head_Cuttlefish-White { background-image: url(spritesmith-main-8.png); - background-position: -786px 0px; + background-position: -786px -115px; width: 105px; height: 114px; } .Mount_Head_Cuttlefish-Zombie { background-image: url(spritesmith-main-8.png); - background-position: -786px -115px; + background-position: -786px -230px; width: 105px; height: 114px; } .Mount_Head_Deer-Base { background-image: url(spritesmith-main-8.png); - background-position: -636px -1113px; + background-position: -742px -1113px; width: 105px; height: 105px; } .Mount_Head_Deer-CottonCandyBlue { background-image: url(spritesmith-main-8.png); - background-position: -742px -1113px; + background-position: -848px -1113px; width: 105px; height: 105px; } .Mount_Head_Deer-CottonCandyPink { background-image: url(spritesmith-main-8.png); - background-position: -848px -1113px; + background-position: -1740px -318px; width: 105px; height: 105px; } .Mount_Head_Deer-Desert { background-image: url(spritesmith-main-8.png); - background-position: -892px 0px; + background-position: -1060px -1113px; width: 105px; height: 105px; } .Mount_Head_Deer-Golden { background-image: url(spritesmith-main-8.png); - background-position: -1060px -1113px; + background-position: -1166px -1113px; width: 105px; height: 105px; } .Mount_Head_Deer-Red { background-image: url(spritesmith-main-8.png); - background-position: -1166px -1113px; + background-position: -1316px 0px; width: 105px; height: 105px; } .Mount_Head_Deer-Shade { background-image: url(spritesmith-main-8.png); - background-position: -1316px 0px; + background-position: -1316px -106px; width: 105px; height: 105px; } .Mount_Head_Deer-Skeleton { background-image: url(spritesmith-main-8.png); - background-position: -1316px -106px; + background-position: -1316px -212px; width: 105px; height: 105px; } .Mount_Head_Deer-White { background-image: url(spritesmith-main-8.png); - background-position: -1316px -212px; + background-position: -1316px -318px; width: 105px; height: 105px; } .Mount_Head_Deer-Zombie { background-image: url(spritesmith-main-8.png); - background-position: -1316px -318px; + background-position: -1316px -424px; width: 105px; height: 105px; } .Mount_Head_Dragon-Base { background-image: url(spritesmith-main-8.png); - background-position: -1316px -424px; + background-position: -1316px -530px; width: 105px; height: 105px; } .Mount_Head_Dragon-CottonCandyBlue { background-image: url(spritesmith-main-8.png); - background-position: -1316px -530px; + background-position: -1316px -636px; width: 105px; height: 105px; } .Mount_Head_Dragon-CottonCandyPink { background-image: url(spritesmith-main-8.png); - background-position: -1316px -636px; + background-position: -1316px -742px; width: 105px; height: 105px; } .Mount_Head_Dragon-Desert { background-image: url(spritesmith-main-8.png); - background-position: -1316px -742px; + background-position: -1316px -848px; width: 105px; height: 105px; } .Mount_Head_Dragon-Golden { background-image: url(spritesmith-main-8.png); - background-position: -1316px -848px; + background-position: -1316px -954px; width: 105px; height: 105px; } .Mount_Head_Dragon-Peppermint { background-image: url(spritesmith-main-8.png); - background-position: -1316px -954px; + background-position: -1316px -1060px; width: 105px; height: 105px; } .Mount_Head_Dragon-Red { background-image: url(spritesmith-main-8.png); - background-position: -1316px -1060px; + background-position: 0px -1219px; width: 105px; height: 105px; } .Mount_Head_Dragon-Shade { background-image: url(spritesmith-main-8.png); - background-position: 0px -1219px; + background-position: -106px -1219px; width: 105px; height: 105px; } .Mount_Head_Dragon-Skeleton { background-image: url(spritesmith-main-8.png); - background-position: -106px -1219px; + background-position: -212px -1219px; width: 105px; height: 105px; } .Mount_Head_Dragon-Spooky { background-image: url(spritesmith-main-8.png); - background-position: -212px -1219px; + background-position: -318px -1219px; width: 105px; height: 105px; } .Mount_Head_Dragon-White { background-image: url(spritesmith-main-8.png); - background-position: -318px -1219px; + background-position: -424px -1219px; width: 105px; height: 105px; } .Mount_Head_Dragon-Zombie { background-image: url(spritesmith-main-8.png); - background-position: -424px -1219px; + background-position: -530px -1219px; width: 105px; height: 105px; } .Mount_Head_Egg-Base { background-image: url(spritesmith-main-8.png); - background-position: -530px -1219px; + background-position: -636px -1219px; width: 105px; height: 105px; } .Mount_Head_Egg-CottonCandyBlue { background-image: url(spritesmith-main-8.png); - background-position: -636px -1219px; + background-position: -742px -1219px; width: 105px; height: 105px; } .Mount_Head_Egg-CottonCandyPink { background-image: url(spritesmith-main-8.png); - background-position: -742px -1219px; + background-position: -848px -1219px; width: 105px; height: 105px; } .Mount_Head_Egg-Desert { background-image: url(spritesmith-main-8.png); - background-position: -848px -1219px; + background-position: -954px -1219px; width: 105px; height: 105px; } .Mount_Head_Egg-Golden { background-image: url(spritesmith-main-8.png); - background-position: -954px -1219px; + background-position: -1060px -1219px; width: 105px; height: 105px; } .Mount_Head_Egg-Red { background-image: url(spritesmith-main-8.png); - background-position: -1060px -1219px; + background-position: -1166px -1219px; width: 105px; height: 105px; } .Mount_Head_Egg-Shade { background-image: url(spritesmith-main-8.png); - background-position: -1166px -1219px; + background-position: -1272px -1219px; width: 105px; height: 105px; } .Mount_Head_Egg-Skeleton { background-image: url(spritesmith-main-8.png); - background-position: -1272px -1219px; + background-position: -1422px 0px; width: 105px; height: 105px; } .Mount_Head_Egg-White { background-image: url(spritesmith-main-8.png); - background-position: -1422px 0px; + background-position: -1422px -106px; width: 105px; height: 105px; } .Mount_Head_Egg-Zombie { background-image: url(spritesmith-main-8.png); - background-position: -1422px -106px; + background-position: -1422px -212px; width: 105px; height: 105px; } .Mount_Head_Falcon-Base { background-image: url(spritesmith-main-8.png); - background-position: -1422px -212px; + background-position: -1422px -318px; width: 105px; height: 105px; } .Mount_Head_Falcon-CottonCandyBlue { background-image: url(spritesmith-main-8.png); - background-position: -1422px -318px; + background-position: -1422px -424px; width: 105px; height: 105px; } .Mount_Head_Falcon-CottonCandyPink { background-image: url(spritesmith-main-8.png); - background-position: -1422px -424px; + background-position: -1422px -530px; width: 105px; height: 105px; } .Mount_Head_Falcon-Desert { background-image: url(spritesmith-main-8.png); - background-position: -1422px -530px; + background-position: -1422px -636px; width: 105px; height: 105px; } .Mount_Head_Falcon-Golden { background-image: url(spritesmith-main-8.png); - background-position: -1422px -636px; + background-position: -1422px -742px; width: 105px; height: 105px; } .Mount_Head_Falcon-Red { background-image: url(spritesmith-main-8.png); - background-position: -1422px -742px; + background-position: -1422px -848px; width: 105px; height: 105px; } .Mount_Head_Falcon-Shade { background-image: url(spritesmith-main-8.png); - background-position: -1422px -848px; + background-position: -1422px -954px; width: 105px; height: 105px; } .Mount_Head_Falcon-Skeleton { background-image: url(spritesmith-main-8.png); - background-position: -1422px -954px; + background-position: -1422px -1060px; width: 105px; height: 105px; } .Mount_Head_Falcon-White { background-image: url(spritesmith-main-8.png); - background-position: -1422px -1060px; + background-position: -1422px -1166px; width: 105px; height: 105px; } .Mount_Head_Falcon-Zombie { background-image: url(spritesmith-main-8.png); - background-position: -1422px -1166px; + background-position: 0px -1325px; width: 105px; height: 105px; } .Mount_Head_FlyingPig-Base { background-image: url(spritesmith-main-8.png); - background-position: 0px -1325px; + background-position: -106px -1325px; width: 105px; height: 105px; } .Mount_Head_FlyingPig-CottonCandyBlue { background-image: url(spritesmith-main-8.png); - background-position: -106px -1325px; + background-position: -212px -1325px; width: 105px; height: 105px; } .Mount_Head_FlyingPig-CottonCandyPink { background-image: url(spritesmith-main-8.png); - background-position: -212px -1325px; + background-position: -318px -1325px; width: 105px; height: 105px; } .Mount_Head_FlyingPig-Desert { background-image: url(spritesmith-main-8.png); - background-position: -318px -1325px; + background-position: -424px -1325px; width: 105px; height: 105px; } .Mount_Head_FlyingPig-Golden { background-image: url(spritesmith-main-8.png); - background-position: -424px -1325px; + background-position: -530px -1325px; width: 105px; height: 105px; } .Mount_Head_FlyingPig-Peppermint { background-image: url(spritesmith-main-8.png); - background-position: -530px -1325px; + background-position: -636px -1325px; width: 105px; height: 105px; } .Mount_Head_FlyingPig-Red { background-image: url(spritesmith-main-8.png); - background-position: -636px -1325px; + background-position: -742px -1325px; width: 105px; height: 105px; } .Mount_Head_FlyingPig-Shade { background-image: url(spritesmith-main-8.png); - background-position: -742px -1325px; + background-position: -848px -1325px; width: 105px; height: 105px; } .Mount_Head_FlyingPig-Skeleton { background-image: url(spritesmith-main-8.png); - background-position: -848px -1325px; + background-position: -954px -1325px; width: 105px; height: 105px; } .Mount_Head_FlyingPig-Spooky { background-image: url(spritesmith-main-8.png); - background-position: -954px -1325px; + background-position: -1060px -1325px; width: 105px; height: 105px; } .Mount_Head_FlyingPig-White { background-image: url(spritesmith-main-8.png); - background-position: -1060px -1325px; + background-position: -1166px -1325px; width: 105px; height: 105px; } .Mount_Head_FlyingPig-Zombie { background-image: url(spritesmith-main-8.png); - background-position: -1166px -1325px; + background-position: -1272px -1325px; width: 105px; height: 105px; } .Mount_Head_Fox-Base { background-image: url(spritesmith-main-8.png); - background-position: -1272px -1325px; + background-position: -1378px -1325px; width: 105px; height: 105px; } .Mount_Head_Fox-CottonCandyBlue { background-image: url(spritesmith-main-8.png); - background-position: -1378px -1325px; + background-position: -1528px 0px; width: 105px; height: 105px; } .Mount_Head_Fox-CottonCandyPink { background-image: url(spritesmith-main-8.png); - background-position: -1528px 0px; + background-position: -1528px -106px; width: 105px; height: 105px; } .Mount_Head_Fox-Desert { background-image: url(spritesmith-main-8.png); - background-position: -1528px -106px; + background-position: -1528px -212px; width: 105px; height: 105px; } .Mount_Head_Fox-Golden { background-image: url(spritesmith-main-8.png); - background-position: -1528px -212px; + background-position: -1528px -318px; width: 105px; height: 105px; } .Mount_Head_Fox-Peppermint { background-image: url(spritesmith-main-8.png); - background-position: -1528px -318px; + background-position: -1528px -424px; width: 105px; height: 105px; } .Mount_Head_Fox-Red { background-image: url(spritesmith-main-8.png); - background-position: -1528px -424px; + background-position: -1528px -530px; width: 105px; height: 105px; } .Mount_Head_Fox-Shade { background-image: url(spritesmith-main-8.png); - background-position: -1528px -530px; + background-position: -1528px -636px; width: 105px; height: 105px; } .Mount_Head_Fox-Skeleton { background-image: url(spritesmith-main-8.png); - background-position: -1528px -636px; + background-position: -1528px -742px; width: 105px; height: 105px; } .Mount_Head_Fox-Spooky { background-image: url(spritesmith-main-8.png); - background-position: -1528px -742px; + background-position: -1528px -848px; width: 105px; height: 105px; } .Mount_Head_Fox-White { background-image: url(spritesmith-main-8.png); - background-position: -1528px -848px; + background-position: -1528px -954px; width: 105px; height: 105px; } .Mount_Head_Fox-Zombie { background-image: url(spritesmith-main-8.png); - background-position: -1528px -954px; + background-position: -1528px -1060px; width: 105px; height: 105px; } .Mount_Head_Frog-Base { background-image: url(spritesmith-main-8.png); - background-position: -272px -544px; + background-position: -786px -345px; width: 105px; height: 114px; } .Mount_Head_Frog-CottonCandyBlue { background-image: url(spritesmith-main-8.png); - background-position: -786px -345px; + background-position: -786px -460px; width: 105px; height: 114px; } .Mount_Head_Frog-CottonCandyPink { background-image: url(spritesmith-main-8.png); - background-position: -786px -460px; + background-position: 0px -680px; width: 105px; height: 114px; } .Mount_Head_Frog-Desert { background-image: url(spritesmith-main-8.png); - background-position: 0px -680px; + background-position: -106px -680px; width: 105px; height: 114px; } .Mount_Head_Frog-Golden { background-image: url(spritesmith-main-8.png); - background-position: -106px -680px; + background-position: -212px -680px; width: 105px; height: 114px; } .Mount_Head_Frog-Red { background-image: url(spritesmith-main-8.png); - background-position: -212px -680px; + background-position: -318px -680px; width: 105px; height: 114px; } .Mount_Head_Frog-Shade { background-image: url(spritesmith-main-8.png); - background-position: -318px -680px; + background-position: -424px -680px; width: 105px; height: 114px; } .Mount_Head_Frog-Skeleton { background-image: url(spritesmith-main-8.png); - background-position: -424px -680px; + background-position: -530px -680px; width: 105px; height: 114px; } .Mount_Head_Frog-White { background-image: url(spritesmith-main-8.png); - background-position: -530px -680px; + background-position: -636px -680px; width: 105px; height: 114px; } .Mount_Head_Frog-Zombie { background-image: url(spritesmith-main-8.png); - background-position: -636px -680px; + background-position: -272px -544px; width: 105px; height: 114px; } .Mount_Head_Gryphon-Base { background-image: url(spritesmith-main-8.png); - background-position: -742px -1431px; + background-position: -848px -1431px; width: 105px; height: 105px; } .Mount_Head_Gryphon-CottonCandyBlue { background-image: url(spritesmith-main-8.png); - background-position: -848px -1431px; + background-position: -954px -1431px; width: 105px; height: 105px; } .Mount_Head_Gryphon-CottonCandyPink { background-image: url(spritesmith-main-8.png); - background-position: -954px -1431px; + background-position: -1060px -1431px; width: 105px; height: 105px; } .Mount_Head_Gryphon-Desert { background-image: url(spritesmith-main-8.png); - background-position: -1060px -1431px; + background-position: -1166px -1431px; width: 105px; height: 105px; } .Mount_Head_Gryphon-Golden { background-image: url(spritesmith-main-8.png); - background-position: -1166px -1431px; + background-position: -1272px -1431px; width: 105px; height: 105px; } .Mount_Head_Gryphon-Red { background-image: url(spritesmith-main-8.png); - background-position: -1272px -1431px; + background-position: -1378px -1431px; width: 105px; height: 105px; } .Mount_Head_Gryphon-RoyalPurple { background-image: url(spritesmith-main-8.png); - background-position: -1378px -1431px; + background-position: -1484px -1431px; width: 105px; height: 105px; } .Mount_Head_Gryphon-Shade { background-image: url(spritesmith-main-8.png); - background-position: -1484px -1431px; + background-position: -1634px 0px; width: 105px; height: 105px; } .Mount_Head_Gryphon-Skeleton { background-image: url(spritesmith-main-8.png); - background-position: -1634px 0px; + background-position: -1634px -106px; width: 105px; height: 105px; } .Mount_Head_Gryphon-White { background-image: url(spritesmith-main-8.png); - background-position: -1634px -106px; + background-position: -1634px -212px; width: 105px; height: 105px; } .Mount_Head_Gryphon-Zombie { background-image: url(spritesmith-main-8.png); - background-position: -1634px -212px; + background-position: -1634px -318px; width: 105px; height: 105px; } .Mount_Head_Hedgehog-Base { background-image: url(spritesmith-main-8.png); - background-position: -1634px -318px; + background-position: -1634px -424px; width: 105px; height: 105px; } .Mount_Head_Hedgehog-CottonCandyBlue { background-image: url(spritesmith-main-8.png); - background-position: -1634px -424px; + background-position: -1634px -530px; width: 105px; height: 105px; } .Mount_Head_Hedgehog-CottonCandyPink { background-image: url(spritesmith-main-8.png); - background-position: -1634px -530px; + background-position: -1634px -636px; width: 105px; height: 105px; } .Mount_Head_Hedgehog-Desert { background-image: url(spritesmith-main-8.png); - background-position: -1634px -636px; + background-position: -1634px -742px; width: 105px; height: 105px; } .Mount_Head_Hedgehog-Golden { background-image: url(spritesmith-main-8.png); - background-position: -1634px -742px; + background-position: -1634px -848px; width: 105px; height: 105px; } .Mount_Head_Hedgehog-Red { background-image: url(spritesmith-main-8.png); - background-position: -1634px -848px; + background-position: -1634px -954px; width: 105px; height: 105px; } .Mount_Head_Hedgehog-Shade { background-image: url(spritesmith-main-8.png); - background-position: -1634px -954px; + background-position: -1634px -1060px; width: 105px; height: 105px; } .Mount_Head_Hedgehog-Skeleton { background-image: url(spritesmith-main-8.png); - background-position: -1634px -1060px; + background-position: -1634px -1166px; width: 105px; height: 105px; } .Mount_Head_Hedgehog-White { background-image: url(spritesmith-main-8.png); - background-position: -1634px -1166px; + background-position: -1634px -1272px; width: 105px; height: 105px; } .Mount_Head_Hedgehog-Zombie { background-image: url(spritesmith-main-8.png); - background-position: -1634px -1272px; + background-position: -1634px -1378px; width: 105px; height: 105px; } .Mount_Head_Horse-Base { background-image: url(spritesmith-main-8.png); - background-position: -1634px -1378px; + background-position: 0px -1537px; width: 105px; height: 105px; } .Mount_Head_Horse-CottonCandyBlue { background-image: url(spritesmith-main-8.png); - background-position: 0px -1537px; + background-position: -106px -1537px; width: 105px; height: 105px; } .Mount_Head_Horse-CottonCandyPink { background-image: url(spritesmith-main-8.png); - background-position: -106px -1537px; + background-position: -212px -1537px; width: 105px; height: 105px; } .Mount_Head_Horse-Desert { background-image: url(spritesmith-main-8.png); - background-position: -212px -1537px; + background-position: -318px -1537px; width: 105px; height: 105px; } .Mount_Head_Horse-Golden { background-image: url(spritesmith-main-8.png); - background-position: -318px -1537px; + background-position: -424px -1537px; width: 105px; height: 105px; } .Mount_Head_Horse-Red { background-image: url(spritesmith-main-8.png); - background-position: -424px -1537px; + background-position: -530px -1537px; width: 105px; height: 105px; } .Mount_Head_Horse-Shade { background-image: url(spritesmith-main-8.png); - background-position: -530px -1537px; + background-position: -636px -1537px; width: 105px; height: 105px; } .Mount_Head_Horse-Skeleton { background-image: url(spritesmith-main-8.png); - background-position: -636px -1537px; + background-position: -742px -1537px; width: 105px; height: 105px; } .Mount_Head_Horse-White { background-image: url(spritesmith-main-8.png); - background-position: -742px -1537px; + background-position: -848px -1537px; width: 105px; height: 105px; } .Mount_Head_Horse-Zombie { background-image: url(spritesmith-main-8.png); - background-position: -848px -1537px; + background-position: -954px -1537px; width: 105px; height: 105px; } @@ -1326,55 +1332,55 @@ } .Mount_Head_LionCub-Base { background-image: url(spritesmith-main-8.png); - background-position: -1060px -1537px; + background-position: -1166px -1537px; width: 105px; height: 105px; } .Mount_Head_LionCub-CottonCandyBlue { background-image: url(spritesmith-main-8.png); - background-position: -1166px -1537px; + background-position: -1272px -1537px; width: 105px; height: 105px; } .Mount_Head_LionCub-CottonCandyPink { background-image: url(spritesmith-main-8.png); - background-position: -1272px -1537px; + background-position: -1378px -1537px; width: 105px; height: 105px; } .Mount_Head_LionCub-Desert { background-image: url(spritesmith-main-8.png); - background-position: -1378px -1537px; + background-position: -1484px -1537px; width: 105px; height: 105px; } .Mount_Head_LionCub-Ethereal { background-image: url(spritesmith-main-8.png); - background-position: -1484px -1537px; + background-position: -1590px -1537px; width: 105px; height: 105px; } .Mount_Head_LionCub-Golden { background-image: url(spritesmith-main-8.png); - background-position: -1590px -1537px; + background-position: -1740px 0px; width: 105px; height: 105px; } .Mount_Head_LionCub-Peppermint { background-image: url(spritesmith-main-8.png); - background-position: -1740px 0px; + background-position: -1740px -106px; width: 105px; height: 105px; } .Mount_Head_LionCub-Red { background-image: url(spritesmith-main-8.png); - background-position: -1740px -106px; + background-position: -1740px -212px; width: 105px; height: 105px; } .Mount_Head_LionCub-Shade { background-image: url(spritesmith-main-8.png); - background-position: -1740px -212px; + background-position: -1060px -1537px; width: 105px; height: 105px; } @@ -1384,9 +1390,3 @@ width: 105px; height: 110px; } -.Mount_Head_LionCub-Spooky { - background-image: url(spritesmith-main-8.png); - background-position: -1740px -318px; - width: 105px; - height: 105px; -} diff --git a/common/dist/sprites/spritesmith-main-8.png b/common/dist/sprites/spritesmith-main-8.png index 50aabc21b3..4578d2a2d0 100644 Binary files a/common/dist/sprites/spritesmith-main-8.png and b/common/dist/sprites/spritesmith-main-8.png differ diff --git a/common/dist/sprites/spritesmith-main-9.css b/common/dist/sprites/spritesmith-main-9.css index fd33c435ee..227fbc2b94 100644 --- a/common/dist/sprites/spritesmith-main-9.css +++ b/common/dist/sprites/spritesmith-main-9.css @@ -1,15 +1,27 @@ +.Mount_Head_LionCub-Spooky { + background-image: url(spritesmith-main-9.png); + background-position: -318px -1134px; + width: 105px; + height: 105px; +} .Mount_Head_LionCub-White { background-image: url(spritesmith-main-9.png); - background-position: 0px -1134px; + background-position: -1240px -530px; width: 105px; height: 105px; } .Mount_Head_LionCub-Zombie { background-image: url(spritesmith-main-9.png); - background-position: -1240px -636px; + background-position: -212px -1134px; width: 105px; height: 105px; } +.Mount_Head_MagicalBee-Base { + background-image: url(spritesmith-main-9.png); + background-position: -378px -680px; + width: 105px; + height: 114px; +} .Mount_Head_Mammoth-Base { background-image: url(spritesmith-main-9.png); background-position: -272px -680px; @@ -18,1015 +30,1015 @@ } .Mount_Head_MantisShrimp-Base { background-image: url(spritesmith-main-9.png); - background-position: -378px -680px; + background-position: -484px -680px; width: 108px; height: 105px; } .Mount_Head_Monkey-Base { background-image: url(spritesmith-main-9.png); - background-position: -106px -1134px; + background-position: -424px -1134px; width: 105px; height: 105px; } .Mount_Head_Monkey-CottonCandyBlue { background-image: url(spritesmith-main-9.png); - background-position: -212px -1134px; + background-position: -530px -1134px; width: 105px; height: 105px; } .Mount_Head_Monkey-CottonCandyPink { background-image: url(spritesmith-main-9.png); - background-position: -318px -1134px; + background-position: -636px -1134px; width: 105px; height: 105px; } .Mount_Head_Monkey-Desert { background-image: url(spritesmith-main-9.png); - background-position: -424px -1134px; + background-position: -742px -1134px; width: 105px; height: 105px; } .Mount_Head_Monkey-Golden { background-image: url(spritesmith-main-9.png); - background-position: -530px -1134px; + background-position: -848px -1134px; width: 105px; height: 105px; } .Mount_Head_Monkey-Red { background-image: url(spritesmith-main-9.png); - background-position: -636px -1134px; + background-position: -954px -1134px; width: 105px; height: 105px; } .Mount_Head_Monkey-Shade { background-image: url(spritesmith-main-9.png); - background-position: -742px -1134px; + background-position: -1060px -1134px; width: 105px; height: 105px; } .Mount_Head_Monkey-Skeleton { background-image: url(spritesmith-main-9.png); - background-position: -848px -1134px; + background-position: -1240px 0px; width: 105px; height: 105px; } .Mount_Head_Monkey-White { background-image: url(spritesmith-main-9.png); - background-position: -954px -1134px; + background-position: -1272px -1452px; width: 105px; height: 105px; } .Mount_Head_Monkey-Zombie { background-image: url(spritesmith-main-9.png); - background-position: -1060px -1452px; + background-position: -1378px -1452px; width: 105px; height: 105px; } .Mount_Head_Octopus-Base { background-image: url(spritesmith-main-9.png); - background-position: -1166px -1452px; + background-position: -1558px 0px; width: 105px; height: 105px; } .Mount_Head_Octopus-CottonCandyBlue { background-image: url(spritesmith-main-9.png); - background-position: -1272px -1452px; + background-position: -1558px -106px; width: 105px; height: 105px; } .Mount_Head_Octopus-CottonCandyPink { background-image: url(spritesmith-main-9.png); - background-position: -1378px -1452px; + background-position: -1558px -212px; width: 105px; height: 105px; } .Mount_Head_Octopus-Desert { background-image: url(spritesmith-main-9.png); - background-position: -1558px 0px; + background-position: -1558px -318px; width: 105px; height: 105px; } .Mount_Head_Octopus-Golden { background-image: url(spritesmith-main-9.png); - background-position: -1558px -106px; + background-position: -1558px -424px; width: 105px; height: 105px; } .Mount_Head_Octopus-Red { background-image: url(spritesmith-main-9.png); - background-position: -1558px -212px; + background-position: -1558px -530px; width: 105px; height: 105px; } .Mount_Head_Octopus-Shade { background-image: url(spritesmith-main-9.png); - background-position: -1558px -318px; + background-position: -1558px -636px; width: 105px; height: 105px; } .Mount_Head_Octopus-Skeleton { background-image: url(spritesmith-main-9.png); - background-position: -1558px -424px; + background-position: -1558px -742px; width: 105px; height: 105px; } .Mount_Head_Octopus-White { background-image: url(spritesmith-main-9.png); - background-position: -1558px -530px; + background-position: -1664px 0px; width: 105px; height: 105px; } .Mount_Head_Octopus-Zombie { background-image: url(spritesmith-main-9.png); - background-position: -1378px -1558px; + background-position: -1664px -106px; width: 105px; height: 105px; } .Mount_Head_Orca-Base { background-image: url(spritesmith-main-9.png); - background-position: -1484px -1558px; + background-position: -1664px -212px; width: 105px; height: 105px; } .Mount_Head_Owl-Base { background-image: url(spritesmith-main-9.png); - background-position: -1664px 0px; + background-position: -1664px -318px; width: 105px; height: 105px; } .Mount_Head_Owl-CottonCandyBlue { background-image: url(spritesmith-main-9.png); - background-position: -1664px -106px; + background-position: -1664px -424px; width: 105px; height: 105px; } .Mount_Head_Owl-CottonCandyPink { background-image: url(spritesmith-main-9.png); - background-position: -1664px -212px; + background-position: -1664px -530px; width: 105px; height: 105px; } .Mount_Head_Owl-Desert { background-image: url(spritesmith-main-9.png); - background-position: -1664px -318px; + background-position: -1664px -636px; width: 105px; height: 105px; } .Mount_Head_Owl-Golden { background-image: url(spritesmith-main-9.png); - background-position: -1664px -424px; + background-position: -1664px -742px; width: 105px; height: 105px; } .Mount_Head_Owl-Red { background-image: url(spritesmith-main-9.png); - background-position: -1664px -530px; + background-position: -1664px -848px; width: 105px; height: 105px; } .Mount_Head_Owl-Shade { background-image: url(spritesmith-main-9.png); - background-position: -1664px -636px; + background-position: -1664px -954px; width: 105px; height: 105px; } .Mount_Head_Owl-Skeleton { background-image: url(spritesmith-main-9.png); - background-position: -1664px -742px; + background-position: -1664px -1060px; width: 105px; height: 105px; } .Mount_Head_Owl-White { background-image: url(spritesmith-main-9.png); - background-position: -1664px -848px; + background-position: -1664px -1166px; width: 105px; height: 105px; } .Mount_Head_Owl-Zombie { background-image: url(spritesmith-main-9.png); - background-position: -1664px -954px; + background-position: -699px -680px; width: 105px; height: 105px; } .Mount_Head_PandaCub-Base { background-image: url(spritesmith-main-9.png); - background-position: -593px -680px; + background-position: -816px 0px; width: 105px; height: 105px; } .Mount_Head_PandaCub-CottonCandyBlue { background-image: url(spritesmith-main-9.png); - background-position: -699px -680px; + background-position: -816px -106px; width: 105px; height: 105px; } .Mount_Head_PandaCub-CottonCandyPink { background-image: url(spritesmith-main-9.png); - background-position: -816px 0px; + background-position: -816px -212px; width: 105px; height: 105px; } .Mount_Head_PandaCub-Desert { background-image: url(spritesmith-main-9.png); - background-position: -816px -106px; + background-position: -816px -318px; width: 105px; height: 105px; } .Mount_Head_PandaCub-Golden { background-image: url(spritesmith-main-9.png); - background-position: -816px -212px; + background-position: -816px -424px; width: 105px; height: 105px; } .Mount_Head_PandaCub-Peppermint { background-image: url(spritesmith-main-9.png); - background-position: -816px -318px; + background-position: -816px -530px; width: 105px; height: 105px; } .Mount_Head_PandaCub-Red { background-image: url(spritesmith-main-9.png); - background-position: -816px -424px; + background-position: -816px -636px; width: 105px; height: 105px; } .Mount_Head_PandaCub-Shade { background-image: url(spritesmith-main-9.png); - background-position: -816px -530px; + background-position: 0px -816px; width: 105px; height: 105px; } .Mount_Head_PandaCub-Skeleton { background-image: url(spritesmith-main-9.png); - background-position: -816px -636px; + background-position: -106px -816px; width: 105px; height: 105px; } .Mount_Head_PandaCub-Spooky { background-image: url(spritesmith-main-9.png); - background-position: 0px -816px; + background-position: -212px -816px; width: 105px; height: 105px; } .Mount_Head_PandaCub-White { background-image: url(spritesmith-main-9.png); - background-position: -106px -816px; + background-position: -318px -816px; width: 105px; height: 105px; } .Mount_Head_PandaCub-Zombie { background-image: url(spritesmith-main-9.png); - background-position: -212px -816px; + background-position: -424px -816px; width: 105px; height: 105px; } .Mount_Head_Parrot-Base { background-image: url(spritesmith-main-9.png); - background-position: -318px -816px; + background-position: -530px -816px; width: 105px; height: 105px; } .Mount_Head_Parrot-CottonCandyBlue { background-image: url(spritesmith-main-9.png); - background-position: -424px -816px; + background-position: -636px -816px; width: 105px; height: 105px; } .Mount_Head_Parrot-CottonCandyPink { background-image: url(spritesmith-main-9.png); - background-position: -530px -816px; + background-position: -742px -816px; width: 105px; height: 105px; } .Mount_Head_Parrot-Desert { background-image: url(spritesmith-main-9.png); - background-position: -636px -816px; + background-position: -922px 0px; width: 105px; height: 105px; } .Mount_Head_Parrot-Golden { background-image: url(spritesmith-main-9.png); - background-position: -742px -816px; + background-position: -922px -106px; width: 105px; height: 105px; } .Mount_Head_Parrot-Red { background-image: url(spritesmith-main-9.png); - background-position: -922px 0px; + background-position: -922px -212px; width: 105px; height: 105px; } .Mount_Head_Parrot-Shade { background-image: url(spritesmith-main-9.png); - background-position: -922px -106px; + background-position: -922px -318px; width: 105px; height: 105px; } .Mount_Head_Parrot-Skeleton { background-image: url(spritesmith-main-9.png); - background-position: -922px -212px; + background-position: -922px -424px; width: 105px; height: 105px; } .Mount_Head_Parrot-White { background-image: url(spritesmith-main-9.png); - background-position: -922px -318px; + background-position: -922px -530px; width: 105px; height: 105px; } .Mount_Head_Parrot-Zombie { background-image: url(spritesmith-main-9.png); - background-position: -922px -424px; + background-position: -922px -636px; width: 105px; height: 105px; } .Mount_Head_Penguin-Base { background-image: url(spritesmith-main-9.png); - background-position: -922px -530px; + background-position: -922px -742px; width: 105px; height: 105px; } .Mount_Head_Penguin-CottonCandyBlue { background-image: url(spritesmith-main-9.png); - background-position: -922px -636px; + background-position: 0px -922px; width: 105px; height: 105px; } .Mount_Head_Penguin-CottonCandyPink { background-image: url(spritesmith-main-9.png); - background-position: -922px -742px; + background-position: -106px -922px; width: 105px; height: 105px; } .Mount_Head_Penguin-Desert { background-image: url(spritesmith-main-9.png); - background-position: 0px -922px; + background-position: -212px -922px; width: 105px; height: 105px; } .Mount_Head_Penguin-Golden { background-image: url(spritesmith-main-9.png); - background-position: -106px -922px; + background-position: -318px -922px; width: 105px; height: 105px; } .Mount_Head_Penguin-Red { background-image: url(spritesmith-main-9.png); - background-position: -212px -922px; + background-position: -424px -922px; width: 105px; height: 105px; } .Mount_Head_Penguin-Shade { background-image: url(spritesmith-main-9.png); - background-position: -318px -922px; + background-position: -530px -922px; width: 105px; height: 105px; } .Mount_Head_Penguin-Skeleton { background-image: url(spritesmith-main-9.png); - background-position: -424px -922px; + background-position: -636px -922px; width: 105px; height: 105px; } .Mount_Head_Penguin-White { background-image: url(spritesmith-main-9.png); - background-position: -530px -922px; + background-position: -742px -922px; width: 105px; height: 105px; } .Mount_Head_Penguin-Zombie { background-image: url(spritesmith-main-9.png); - background-position: -636px -922px; + background-position: -848px -922px; width: 105px; height: 105px; } .Mount_Head_Phoenix-Base { background-image: url(spritesmith-main-9.png); - background-position: -742px -922px; + background-position: -1028px 0px; width: 105px; height: 105px; } .Mount_Head_Rat-Base { background-image: url(spritesmith-main-9.png); - background-position: -848px -922px; + background-position: -1028px -106px; width: 105px; height: 105px; } .Mount_Head_Rat-CottonCandyBlue { background-image: url(spritesmith-main-9.png); - background-position: -1028px 0px; + background-position: -1028px -212px; width: 105px; height: 105px; } .Mount_Head_Rat-CottonCandyPink { background-image: url(spritesmith-main-9.png); - background-position: -1028px -106px; + background-position: -1028px -318px; width: 105px; height: 105px; } .Mount_Head_Rat-Desert { background-image: url(spritesmith-main-9.png); - background-position: -1028px -212px; + background-position: -1028px -424px; width: 105px; height: 105px; } .Mount_Head_Rat-Golden { background-image: url(spritesmith-main-9.png); - background-position: -1028px -318px; + background-position: -1028px -530px; width: 105px; height: 105px; } .Mount_Head_Rat-Red { background-image: url(spritesmith-main-9.png); - background-position: -1028px -424px; + background-position: -1028px -636px; width: 105px; height: 105px; } .Mount_Head_Rat-Shade { background-image: url(spritesmith-main-9.png); - background-position: -1028px -530px; + background-position: -1028px -742px; width: 105px; height: 105px; } .Mount_Head_Rat-Skeleton { background-image: url(spritesmith-main-9.png); - background-position: -1028px -636px; + background-position: -1028px -848px; width: 105px; height: 105px; } .Mount_Head_Rat-White { background-image: url(spritesmith-main-9.png); - background-position: -1028px -742px; + background-position: 0px -1028px; width: 105px; height: 105px; } .Mount_Head_Rat-Zombie { background-image: url(spritesmith-main-9.png); - background-position: -1028px -848px; + background-position: -106px -1028px; width: 105px; height: 105px; } .Mount_Head_Rock-Base { background-image: url(spritesmith-main-9.png); - background-position: 0px -1028px; + background-position: -212px -1028px; width: 105px; height: 105px; } .Mount_Head_Rock-CottonCandyBlue { background-image: url(spritesmith-main-9.png); - background-position: -106px -1028px; + background-position: -318px -1028px; width: 105px; height: 105px; } .Mount_Head_Rock-CottonCandyPink { background-image: url(spritesmith-main-9.png); - background-position: -212px -1028px; + background-position: -424px -1028px; width: 105px; height: 105px; } .Mount_Head_Rock-Desert { background-image: url(spritesmith-main-9.png); - background-position: -318px -1028px; + background-position: -530px -1028px; width: 105px; height: 105px; } .Mount_Head_Rock-Golden { background-image: url(spritesmith-main-9.png); - background-position: -424px -1028px; + background-position: -636px -1028px; width: 105px; height: 105px; } .Mount_Head_Rock-Red { background-image: url(spritesmith-main-9.png); - background-position: -530px -1028px; + background-position: -742px -1028px; width: 105px; height: 105px; } .Mount_Head_Rock-Shade { background-image: url(spritesmith-main-9.png); - background-position: -636px -1028px; + background-position: -848px -1028px; width: 105px; height: 105px; } .Mount_Head_Rock-Skeleton { background-image: url(spritesmith-main-9.png); - background-position: -742px -1028px; + background-position: -954px -1028px; width: 105px; height: 105px; } .Mount_Head_Rock-White { background-image: url(spritesmith-main-9.png); - background-position: -848px -1028px; + background-position: -1134px 0px; width: 105px; height: 105px; } .Mount_Head_Rock-Zombie { background-image: url(spritesmith-main-9.png); - background-position: -954px -1028px; + background-position: -1134px -106px; width: 105px; height: 105px; } .Mount_Head_Rooster-Base { background-image: url(spritesmith-main-9.png); - background-position: -1134px 0px; + background-position: -1134px -212px; width: 105px; height: 105px; } .Mount_Head_Rooster-CottonCandyBlue { background-image: url(spritesmith-main-9.png); - background-position: -1134px -106px; + background-position: -1134px -318px; width: 105px; height: 105px; } .Mount_Head_Rooster-CottonCandyPink { background-image: url(spritesmith-main-9.png); - background-position: -1134px -212px; + background-position: -1134px -424px; width: 105px; height: 105px; } .Mount_Head_Rooster-Desert { background-image: url(spritesmith-main-9.png); - background-position: -1134px -318px; + background-position: -1134px -530px; width: 105px; height: 105px; } .Mount_Head_Rooster-Golden { background-image: url(spritesmith-main-9.png); - background-position: -1134px -424px; + background-position: -1134px -636px; width: 105px; height: 105px; } .Mount_Head_Rooster-Red { background-image: url(spritesmith-main-9.png); - background-position: -1134px -530px; + background-position: -1134px -742px; width: 105px; height: 105px; } .Mount_Head_Rooster-Shade { background-image: url(spritesmith-main-9.png); - background-position: -1134px -636px; + background-position: -1134px -848px; width: 105px; height: 105px; } .Mount_Head_Rooster-Skeleton { background-image: url(spritesmith-main-9.png); - background-position: -1134px -742px; + background-position: -1134px -954px; width: 105px; height: 105px; } .Mount_Head_Rooster-White { background-image: url(spritesmith-main-9.png); - background-position: -1134px -848px; + background-position: 0px -1134px; width: 105px; height: 105px; } .Mount_Head_Rooster-Zombie { background-image: url(spritesmith-main-9.png); - background-position: -1134px -954px; + background-position: -106px -1134px; width: 105px; height: 105px; } .Mount_Head_Sabretooth-Base { background-image: url(spritesmith-main-9.png); - background-position: -136px -136px; + background-position: -272px 0px; width: 135px; height: 135px; } .Mount_Head_Sabretooth-CottonCandyBlue { background-image: url(spritesmith-main-9.png); - background-position: -272px 0px; + background-position: -272px -136px; width: 135px; height: 135px; } .Mount_Head_Sabretooth-CottonCandyPink { background-image: url(spritesmith-main-9.png); - background-position: -272px -136px; + background-position: 0px -272px; width: 135px; height: 135px; } .Mount_Head_Sabretooth-Desert { background-image: url(spritesmith-main-9.png); - background-position: 0px -272px; + background-position: -136px -272px; width: 135px; height: 135px; } .Mount_Head_Sabretooth-Golden { background-image: url(spritesmith-main-9.png); - background-position: -136px -272px; + background-position: -272px -272px; width: 135px; height: 135px; } .Mount_Head_Sabretooth-Red { background-image: url(spritesmith-main-9.png); - background-position: -272px -272px; + background-position: -408px 0px; width: 135px; height: 135px; } .Mount_Head_Sabretooth-Shade { background-image: url(spritesmith-main-9.png); - background-position: -408px 0px; + background-position: -408px -136px; width: 135px; height: 135px; } .Mount_Head_Sabretooth-Skeleton { background-image: url(spritesmith-main-9.png); - background-position: -408px -136px; + background-position: -408px -272px; width: 135px; height: 135px; } .Mount_Head_Sabretooth-White { background-image: url(spritesmith-main-9.png); - background-position: -408px -272px; + background-position: 0px -408px; width: 135px; height: 135px; } .Mount_Head_Sabretooth-Zombie { background-image: url(spritesmith-main-9.png); - background-position: 0px -408px; + background-position: -136px -408px; width: 135px; height: 135px; } .Mount_Head_Seahorse-Base { background-image: url(spritesmith-main-9.png); - background-position: -1060px -1134px; + background-position: -1240px -106px; width: 105px; height: 105px; } .Mount_Head_Seahorse-CottonCandyBlue { background-image: url(spritesmith-main-9.png); - background-position: -1240px 0px; + background-position: -1240px -212px; width: 105px; height: 105px; } .Mount_Head_Seahorse-CottonCandyPink { background-image: url(spritesmith-main-9.png); - background-position: -1240px -106px; + background-position: -1240px -318px; width: 105px; height: 105px; } .Mount_Head_Seahorse-Desert { background-image: url(spritesmith-main-9.png); - background-position: -1240px -212px; + background-position: -1240px -424px; width: 105px; height: 105px; } .Mount_Head_Seahorse-Golden { background-image: url(spritesmith-main-9.png); - background-position: -1240px -318px; + background-position: -593px -680px; width: 105px; height: 105px; } .Mount_Head_Seahorse-Red { background-image: url(spritesmith-main-9.png); - background-position: -1240px -424px; + background-position: -1240px -636px; width: 105px; height: 105px; } .Mount_Head_Seahorse-Shade { background-image: url(spritesmith-main-9.png); - background-position: -1240px -530px; + background-position: -1240px -742px; width: 105px; height: 105px; } .Mount_Head_Seahorse-Skeleton { background-image: url(spritesmith-main-9.png); - background-position: -487px -680px; + background-position: -1240px -848px; width: 105px; height: 105px; } .Mount_Head_Seahorse-White { background-image: url(spritesmith-main-9.png); - background-position: -1240px -742px; + background-position: -1240px -954px; width: 105px; height: 105px; } .Mount_Head_Seahorse-Zombie { background-image: url(spritesmith-main-9.png); - background-position: -1240px -848px; + background-position: -1240px -1060px; width: 105px; height: 105px; } .Mount_Head_Sheep-Base { background-image: url(spritesmith-main-9.png); - background-position: -1240px -954px; + background-position: 0px -1240px; width: 105px; height: 105px; } .Mount_Head_Sheep-CottonCandyBlue { background-image: url(spritesmith-main-9.png); - background-position: -1240px -1060px; + background-position: -106px -1240px; width: 105px; height: 105px; } .Mount_Head_Sheep-CottonCandyPink { background-image: url(spritesmith-main-9.png); - background-position: 0px -1240px; + background-position: -212px -1240px; width: 105px; height: 105px; } .Mount_Head_Sheep-Desert { background-image: url(spritesmith-main-9.png); - background-position: -106px -1240px; + background-position: -318px -1240px; width: 105px; height: 105px; } .Mount_Head_Sheep-Golden { background-image: url(spritesmith-main-9.png); - background-position: -212px -1240px; + background-position: -424px -1240px; width: 105px; height: 105px; } .Mount_Head_Sheep-Red { background-image: url(spritesmith-main-9.png); - background-position: -318px -1240px; + background-position: -530px -1240px; width: 105px; height: 105px; } .Mount_Head_Sheep-Shade { background-image: url(spritesmith-main-9.png); - background-position: -424px -1240px; + background-position: -636px -1240px; width: 105px; height: 105px; } .Mount_Head_Sheep-Skeleton { background-image: url(spritesmith-main-9.png); - background-position: -530px -1240px; + background-position: -742px -1240px; width: 105px; height: 105px; } .Mount_Head_Sheep-White { background-image: url(spritesmith-main-9.png); - background-position: -636px -1240px; + background-position: -848px -1240px; width: 105px; height: 105px; } .Mount_Head_Sheep-Zombie { background-image: url(spritesmith-main-9.png); - background-position: -742px -1240px; + background-position: -954px -1240px; width: 105px; height: 105px; } .Mount_Head_Slime-Base { background-image: url(spritesmith-main-9.png); - background-position: -848px -1240px; + background-position: -1060px -1240px; width: 105px; height: 105px; } .Mount_Head_Slime-CottonCandyBlue { background-image: url(spritesmith-main-9.png); - background-position: -954px -1240px; + background-position: -1166px -1240px; width: 105px; height: 105px; } .Mount_Head_Slime-CottonCandyPink { background-image: url(spritesmith-main-9.png); - background-position: -1060px -1240px; + background-position: -1346px 0px; width: 105px; height: 105px; } .Mount_Head_Slime-Desert { background-image: url(spritesmith-main-9.png); - background-position: -1166px -1240px; + background-position: -1346px -106px; width: 105px; height: 105px; } .Mount_Head_Slime-Golden { background-image: url(spritesmith-main-9.png); - background-position: -1346px 0px; + background-position: -1346px -212px; width: 105px; height: 105px; } .Mount_Head_Slime-Red { background-image: url(spritesmith-main-9.png); - background-position: -1346px -106px; + background-position: -1346px -318px; width: 105px; height: 105px; } .Mount_Head_Slime-Shade { background-image: url(spritesmith-main-9.png); - background-position: -1346px -212px; + background-position: -1346px -424px; width: 105px; height: 105px; } .Mount_Head_Slime-Skeleton { background-image: url(spritesmith-main-9.png); - background-position: -1346px -318px; + background-position: -1346px -530px; width: 105px; height: 105px; } .Mount_Head_Slime-White { background-image: url(spritesmith-main-9.png); - background-position: -1346px -424px; + background-position: -1346px -636px; width: 105px; height: 105px; } .Mount_Head_Slime-Zombie { background-image: url(spritesmith-main-9.png); - background-position: -1346px -530px; + background-position: -1346px -742px; width: 105px; height: 105px; } .Mount_Head_Snail-Base { background-image: url(spritesmith-main-9.png); - background-position: -1346px -636px; + background-position: -1346px -848px; width: 105px; height: 105px; } .Mount_Head_Snail-CottonCandyBlue { background-image: url(spritesmith-main-9.png); - background-position: -1346px -742px; + background-position: -1346px -954px; width: 105px; height: 105px; } .Mount_Head_Snail-CottonCandyPink { background-image: url(spritesmith-main-9.png); - background-position: -1346px -848px; + background-position: -1346px -1060px; width: 105px; height: 105px; } .Mount_Head_Snail-Desert { background-image: url(spritesmith-main-9.png); - background-position: -1346px -954px; + background-position: -1346px -1166px; width: 105px; height: 105px; } .Mount_Head_Snail-Golden { background-image: url(spritesmith-main-9.png); - background-position: -1346px -1060px; + background-position: 0px -1346px; width: 105px; height: 105px; } .Mount_Head_Snail-Red { background-image: url(spritesmith-main-9.png); - background-position: -1346px -1166px; + background-position: -106px -1346px; width: 105px; height: 105px; } .Mount_Head_Snail-Shade { background-image: url(spritesmith-main-9.png); - background-position: 0px -1346px; + background-position: -212px -1346px; width: 105px; height: 105px; } .Mount_Head_Snail-Skeleton { background-image: url(spritesmith-main-9.png); - background-position: -106px -1346px; + background-position: -318px -1346px; width: 105px; height: 105px; } .Mount_Head_Snail-White { background-image: url(spritesmith-main-9.png); - background-position: -212px -1346px; + background-position: -424px -1346px; width: 105px; height: 105px; } .Mount_Head_Snail-Zombie { background-image: url(spritesmith-main-9.png); - background-position: -318px -1346px; + background-position: -530px -1346px; width: 105px; height: 105px; } .Mount_Head_Snake-Base { background-image: url(spritesmith-main-9.png); - background-position: -424px -1346px; + background-position: -636px -1346px; width: 105px; height: 105px; } .Mount_Head_Snake-CottonCandyBlue { background-image: url(spritesmith-main-9.png); - background-position: -530px -1346px; + background-position: -742px -1346px; width: 105px; height: 105px; } .Mount_Head_Snake-CottonCandyPink { background-image: url(spritesmith-main-9.png); - background-position: -636px -1346px; + background-position: -848px -1346px; width: 105px; height: 105px; } .Mount_Head_Snake-Desert { background-image: url(spritesmith-main-9.png); - background-position: -742px -1346px; + background-position: -954px -1346px; width: 105px; height: 105px; } .Mount_Head_Snake-Golden { background-image: url(spritesmith-main-9.png); - background-position: -848px -1346px; + background-position: -1060px -1346px; width: 105px; height: 105px; } .Mount_Head_Snake-Red { background-image: url(spritesmith-main-9.png); - background-position: -954px -1346px; + background-position: -1166px -1346px; width: 105px; height: 105px; } .Mount_Head_Snake-Shade { background-image: url(spritesmith-main-9.png); - background-position: -1060px -1346px; + background-position: -1272px -1346px; width: 105px; height: 105px; } .Mount_Head_Snake-Skeleton { background-image: url(spritesmith-main-9.png); - background-position: -1166px -1346px; + background-position: -1452px 0px; width: 105px; height: 105px; } .Mount_Head_Snake-White { background-image: url(spritesmith-main-9.png); - background-position: -1272px -1346px; + background-position: -1452px -106px; width: 105px; height: 105px; } .Mount_Head_Snake-Zombie { background-image: url(spritesmith-main-9.png); - background-position: -1452px 0px; + background-position: -1452px -212px; width: 105px; height: 105px; } .Mount_Head_Spider-Base { background-image: url(spritesmith-main-9.png); - background-position: -1452px -106px; + background-position: -1452px -318px; width: 105px; height: 105px; } .Mount_Head_Spider-CottonCandyBlue { background-image: url(spritesmith-main-9.png); - background-position: -1452px -212px; + background-position: -1452px -424px; width: 105px; height: 105px; } .Mount_Head_Spider-CottonCandyPink { background-image: url(spritesmith-main-9.png); - background-position: -1452px -318px; + background-position: -1452px -530px; width: 105px; height: 105px; } .Mount_Head_Spider-Desert { background-image: url(spritesmith-main-9.png); - background-position: -1452px -424px; + background-position: -1452px -636px; width: 105px; height: 105px; } .Mount_Head_Spider-Golden { background-image: url(spritesmith-main-9.png); - background-position: -1452px -530px; + background-position: -1452px -742px; width: 105px; height: 105px; } .Mount_Head_Spider-Red { background-image: url(spritesmith-main-9.png); - background-position: -1452px -636px; + background-position: -1452px -848px; width: 105px; height: 105px; } .Mount_Head_Spider-Shade { background-image: url(spritesmith-main-9.png); - background-position: -1452px -742px; + background-position: -1452px -954px; width: 105px; height: 105px; } .Mount_Head_Spider-Skeleton { background-image: url(spritesmith-main-9.png); - background-position: -1452px -848px; + background-position: -1452px -1060px; width: 105px; height: 105px; } .Mount_Head_Spider-White { background-image: url(spritesmith-main-9.png); - background-position: -1452px -954px; + background-position: -1452px -1166px; width: 105px; height: 105px; } .Mount_Head_Spider-Zombie { background-image: url(spritesmith-main-9.png); - background-position: -1452px -1060px; + background-position: -1452px -1272px; width: 105px; height: 105px; } .Mount_Head_TRex-Base { background-image: url(spritesmith-main-9.png); - background-position: -136px -408px; + background-position: -272px -408px; width: 135px; height: 135px; } .Mount_Head_TRex-CottonCandyBlue { background-image: url(spritesmith-main-9.png); - background-position: -272px -408px; + background-position: -408px -408px; width: 135px; height: 135px; } .Mount_Head_TRex-CottonCandyPink { background-image: url(spritesmith-main-9.png); - background-position: -408px -408px; + background-position: -544px 0px; width: 135px; height: 135px; } .Mount_Head_TRex-Desert { background-image: url(spritesmith-main-9.png); - background-position: -544px 0px; + background-position: -544px -136px; width: 135px; height: 135px; } @@ -1038,289 +1050,289 @@ } .Mount_Head_TRex-Red { background-image: url(spritesmith-main-9.png); - background-position: -544px -272px; + background-position: -544px -408px; width: 135px; height: 135px; } .Mount_Head_TRex-Shade { background-image: url(spritesmith-main-9.png); - background-position: -544px -408px; + background-position: 0px -544px; width: 135px; height: 135px; } .Mount_Head_TRex-Skeleton { background-image: url(spritesmith-main-9.png); - background-position: 0px -544px; + background-position: -136px -544px; width: 135px; height: 135px; } .Mount_Head_TRex-White { background-image: url(spritesmith-main-9.png); - background-position: -136px -544px; + background-position: -272px -544px; width: 135px; height: 135px; } .Mount_Head_TRex-Zombie { background-image: url(spritesmith-main-9.png); - background-position: -272px -544px; + background-position: -408px -544px; width: 135px; height: 135px; } .Mount_Head_TigerCub-Base { background-image: url(spritesmith-main-9.png); - background-position: -1452px -1166px; + background-position: 0px -1452px; width: 105px; height: 105px; } .Mount_Head_TigerCub-CottonCandyBlue { background-image: url(spritesmith-main-9.png); - background-position: -1452px -1272px; + background-position: -106px -1452px; width: 105px; height: 105px; } .Mount_Head_TigerCub-CottonCandyPink { background-image: url(spritesmith-main-9.png); - background-position: 0px -1452px; + background-position: -212px -1452px; width: 105px; height: 105px; } .Mount_Head_TigerCub-Desert { background-image: url(spritesmith-main-9.png); - background-position: -106px -1452px; + background-position: -318px -1452px; width: 105px; height: 105px; } .Mount_Head_TigerCub-Golden { background-image: url(spritesmith-main-9.png); - background-position: -212px -1452px; + background-position: -424px -1452px; width: 105px; height: 105px; } .Mount_Head_TigerCub-Peppermint { background-image: url(spritesmith-main-9.png); - background-position: -318px -1452px; + background-position: -530px -1452px; width: 105px; height: 105px; } .Mount_Head_TigerCub-Red { background-image: url(spritesmith-main-9.png); - background-position: -424px -1452px; + background-position: -636px -1452px; width: 105px; height: 105px; } .Mount_Head_TigerCub-Shade { background-image: url(spritesmith-main-9.png); - background-position: -530px -1452px; + background-position: -742px -1452px; width: 105px; height: 105px; } .Mount_Head_TigerCub-Skeleton { background-image: url(spritesmith-main-9.png); - background-position: -636px -1452px; + background-position: -848px -1452px; width: 105px; height: 105px; } .Mount_Head_TigerCub-Spooky { background-image: url(spritesmith-main-9.png); - background-position: -742px -1452px; + background-position: -954px -1452px; width: 105px; height: 105px; } .Mount_Head_TigerCub-White { background-image: url(spritesmith-main-9.png); - background-position: -848px -1452px; + background-position: -1060px -1452px; width: 105px; height: 105px; } .Mount_Head_TigerCub-Zombie { background-image: url(spritesmith-main-9.png); - background-position: -954px -1452px; + background-position: -1166px -1452px; width: 105px; height: 105px; } .Mount_Head_Turkey-Base { background-image: url(spritesmith-main-9.png); - background-position: -1558px -636px; + background-position: -1558px -848px; width: 105px; height: 105px; } .Mount_Head_Unicorn-Base { background-image: url(spritesmith-main-9.png); - background-position: -1558px -742px; + background-position: -1558px -954px; width: 105px; height: 105px; } .Mount_Head_Unicorn-CottonCandyBlue { background-image: url(spritesmith-main-9.png); - background-position: -1558px -848px; + background-position: -1558px -1060px; width: 105px; height: 105px; } .Mount_Head_Unicorn-CottonCandyPink { background-image: url(spritesmith-main-9.png); - background-position: -1558px -954px; + background-position: -1558px -1166px; width: 105px; height: 105px; } .Mount_Head_Unicorn-Desert { background-image: url(spritesmith-main-9.png); - background-position: -1558px -1060px; + background-position: -1558px -1272px; width: 105px; height: 105px; } .Mount_Head_Unicorn-Golden { background-image: url(spritesmith-main-9.png); - background-position: -1558px -1166px; + background-position: -1558px -1378px; width: 105px; height: 105px; } .Mount_Head_Unicorn-Red { background-image: url(spritesmith-main-9.png); - background-position: -1558px -1272px; + background-position: 0px -1558px; width: 105px; height: 105px; } .Mount_Head_Unicorn-Shade { background-image: url(spritesmith-main-9.png); - background-position: -1558px -1378px; + background-position: -106px -1558px; width: 105px; height: 105px; } .Mount_Head_Unicorn-Skeleton { background-image: url(spritesmith-main-9.png); - background-position: 0px -1558px; + background-position: -212px -1558px; width: 105px; height: 105px; } .Mount_Head_Unicorn-White { background-image: url(spritesmith-main-9.png); - background-position: -106px -1558px; + background-position: -318px -1558px; width: 105px; height: 105px; } .Mount_Head_Unicorn-Zombie { background-image: url(spritesmith-main-9.png); - background-position: -212px -1558px; + background-position: -424px -1558px; width: 105px; height: 105px; } .Mount_Head_Whale-Base { background-image: url(spritesmith-main-9.png); - background-position: -318px -1558px; + background-position: -530px -1558px; width: 105px; height: 105px; } .Mount_Head_Whale-CottonCandyBlue { background-image: url(spritesmith-main-9.png); - background-position: -424px -1558px; + background-position: -636px -1558px; width: 105px; height: 105px; } .Mount_Head_Whale-CottonCandyPink { background-image: url(spritesmith-main-9.png); - background-position: -530px -1558px; + background-position: -742px -1558px; width: 105px; height: 105px; } .Mount_Head_Whale-Desert { background-image: url(spritesmith-main-9.png); - background-position: -636px -1558px; + background-position: -848px -1558px; width: 105px; height: 105px; } .Mount_Head_Whale-Golden { background-image: url(spritesmith-main-9.png); - background-position: -742px -1558px; + background-position: -954px -1558px; width: 105px; height: 105px; } .Mount_Head_Whale-Red { background-image: url(spritesmith-main-9.png); - background-position: -848px -1558px; + background-position: -1060px -1558px; width: 105px; height: 105px; } .Mount_Head_Whale-Shade { background-image: url(spritesmith-main-9.png); - background-position: -954px -1558px; + background-position: -1166px -1558px; width: 105px; height: 105px; } .Mount_Head_Whale-Skeleton { background-image: url(spritesmith-main-9.png); - background-position: -1060px -1558px; + background-position: -1272px -1558px; width: 105px; height: 105px; } .Mount_Head_Whale-White { background-image: url(spritesmith-main-9.png); - background-position: -1166px -1558px; + background-position: -1378px -1558px; width: 105px; height: 105px; } .Mount_Head_Whale-Zombie { background-image: url(spritesmith-main-9.png); - background-position: -1272px -1558px; + background-position: -1484px -1558px; width: 105px; height: 105px; } .Mount_Head_Wolf-Base { background-image: url(spritesmith-main-9.png); - background-position: -408px -544px; + background-position: -544px -544px; width: 135px; height: 135px; } .Mount_Head_Wolf-CottonCandyBlue { background-image: url(spritesmith-main-9.png); - background-position: -544px -544px; + background-position: -680px 0px; width: 135px; height: 135px; } .Mount_Head_Wolf-CottonCandyPink { background-image: url(spritesmith-main-9.png); - background-position: -680px 0px; + background-position: -680px -136px; width: 135px; height: 135px; } .Mount_Head_Wolf-Desert { background-image: url(spritesmith-main-9.png); - background-position: -680px -136px; + background-position: -680px -272px; width: 135px; height: 135px; } .Mount_Head_Wolf-Golden { background-image: url(spritesmith-main-9.png); - background-position: -680px -272px; + background-position: -680px -408px; width: 135px; height: 135px; } .Mount_Head_Wolf-Peppermint { background-image: url(spritesmith-main-9.png); - background-position: -680px -408px; + background-position: -680px -544px; width: 135px; height: 135px; } .Mount_Head_Wolf-Red { background-image: url(spritesmith-main-9.png); - background-position: -680px -544px; + background-position: 0px -680px; width: 135px; height: 135px; } .Mount_Head_Wolf-Shade { background-image: url(spritesmith-main-9.png); - background-position: 0px -680px; + background-position: -136px -680px; width: 135px; height: 135px; } .Mount_Head_Wolf-Skeleton { background-image: url(spritesmith-main-9.png); - background-position: -136px -680px; + background-position: -544px -272px; width: 135px; height: 135px; } .Mount_Head_Wolf-Spooky { background-image: url(spritesmith-main-9.png); - background-position: -544px -136px; + background-position: -136px -136px; width: 135px; height: 135px; } @@ -1338,41 +1350,23 @@ } .Mount_Icon_BearCub-Base { background-image: url(spritesmith-main-9.png); - background-position: -1664px -1060px; + background-position: -1664px -1272px; width: 81px; height: 99px; } .Mount_Icon_BearCub-CottonCandyBlue { background-image: url(spritesmith-main-9.png); - background-position: -1664px -1160px; + background-position: -1664px -1372px; width: 81px; height: 99px; } .Mount_Icon_BearCub-CottonCandyPink { background-image: url(spritesmith-main-9.png); - background-position: -1664px -1260px; + background-position: -1664px -1472px; width: 81px; height: 99px; } .Mount_Icon_BearCub-Desert { - background-image: url(spritesmith-main-9.png); - background-position: -1664px -1360px; - width: 81px; - height: 99px; -} -.Mount_Icon_BearCub-Golden { - background-image: url(spritesmith-main-9.png); - background-position: -1664px -1460px; - width: 81px; - height: 99px; -} -.Mount_Icon_BearCub-Peppermint { - background-image: url(spritesmith-main-9.png); - background-position: -1664px -1560px; - width: 81px; - height: 99px; -} -.Mount_Icon_BearCub-Polar { background-image: url(spritesmith-main-9.png); background-position: 0px -1664px; width: 81px; diff --git a/common/dist/sprites/spritesmith-main-9.png b/common/dist/sprites/spritesmith-main-9.png index 77a25a814d..afb52a805d 100644 Binary files a/common/dist/sprites/spritesmith-main-9.png and b/common/dist/sprites/spritesmith-main-9.png differ diff --git a/common/img/sprites/spritesmith/stable/mounts/Mount_Body_MagicalBee-Base.png b/common/img/sprites/spritesmith/stable/mounts/Mount_Body_MagicalBee-Base.png new file mode 100644 index 0000000000..8aaf142b0d Binary files /dev/null and b/common/img/sprites/spritesmith/stable/mounts/Mount_Body_MagicalBee-Base.png differ diff --git a/common/img/sprites/spritesmith/stable/mounts/Mount_Head_MagicalBee-Base.png b/common/img/sprites/spritesmith/stable/mounts/Mount_Head_MagicalBee-Base.png new file mode 100644 index 0000000000..bf6da48fc5 Binary files /dev/null and b/common/img/sprites/spritesmith/stable/mounts/Mount_Head_MagicalBee-Base.png differ diff --git a/common/img/sprites/spritesmith/stable/pets/Pet-Bumblebee-Base.png b/common/img/sprites/spritesmith/stable/pets/Pet-MagicalBee-Base.png similarity index 100% rename from common/img/sprites/spritesmith/stable/pets/Pet-Bumblebee-Base.png rename to common/img/sprites/spritesmith/stable/pets/Pet-MagicalBee-Base.png diff --git a/common/locales/en/api-v3.json b/common/locales/en/api-v3.json index 2f3ea4052a..9f0df52127 100644 --- a/common/locales/en/api-v3.json +++ b/common/locales/en/api-v3.json @@ -113,14 +113,13 @@ "missingKeyParam": "\"req.params.key\" is required.", "mysterySetNotFound": "Mystery set not found, or set already owned.", "itemNotFound": "Item \"<%= key %>\" not found.", - "cannoyBuyItem": "You can't buy this item.", + "cannotBuyItem": "You can't buy this item.", "missingTypeKeyEquip": "\"key\" and \"type\" are required parameters.", "missingPetFoodFeed": "\"pet\" and \"food\" are required parameters.", "invalidPetName": "Invalid pet name supplied.", "missingEggHatchingPotionHatch": "\"egg\" and \"hatchingPotion\" are required parameters.", "invalidTypeEquip": "\"type\" must be one of 'equipped', 'pet', 'mount', 'costume'.", "cannotDeleteActiveAccount": "You have an active subscription, cancel your plan before deleting your account.", - "cannoyBuyItem": "You can't buy this item", "messageRequired": "A message is required.", "toUserIDRequired": "A toUserId is required", "notAuthorizedToSendMessageToThisUser": "Can't send message to this user.", @@ -171,5 +170,6 @@ "pushDeviceAdded": "Push device added successfully", "pushDeviceAlreadyAdded": "The user already has the push device", "resetComplete": "Reset completed", - "lvl10ChangeClass": "To change class you must be at least level 10." + "lvl10ChangeClass": "To change class you must be at least level 10.", + "equipmentAlreadyOwned": "You already own that piece of equipment" } diff --git a/common/locales/en/character.json b/common/locales/en/character.json index 95e3221a86..0cd4e854cb 100644 --- a/common/locales/en/character.json +++ b/common/locales/en/character.json @@ -1,4 +1,5 @@ { + "communityGuidelinesWarning": "Please keep in mind that your Display Name, profile photo, and blurb must comply with the Community Guidelines (e.g. no profanity, no adult topics, no insults, etc). If you have any questions about whether or not something is appropriate, feel free to email leslie@habitica.com!", "statsAch": "Stats & Achievements", "profile": "Profile", "avatar": "Customize Avatar", diff --git a/common/locales/en/pets.json b/common/locales/en/pets.json index 95829feada..f6dcadae58 100644 --- a/common/locales/en/pets.json +++ b/common/locales/en/pets.json @@ -19,7 +19,7 @@ "orca": "Orca", "royalPurpleGryphon": "Royal Purple Gryphon", "phoenix": "Phoenix", - "bumblebee": "Magical Bee", + "magicalBee": "Magical Bee", "rarePetPop1": "Click the gold paw to learn more about how you can obtain this rare pet through contributing to Habitica!", "rarePetPop2": "How to Get this Pet!", "potion": "<%= potionType %> Potion", diff --git a/common/locales/en/settings.json b/common/locales/en/settings.json index a5ea38a2d6..b1262e9d7d 100644 --- a/common/locales/en/settings.json +++ b/common/locales/en/settings.json @@ -66,6 +66,14 @@ "API": "API", "APIText": "Copy these for use in third party applications. However, think of your API Token like a password, and do not share it publicly. You may occasionally be asked for your User ID, but never post your API Token where others can see it, including on Github.", "APIToken": "API Token (this is a password - see warning above!)", + "thirdPartyApps": "Third Party Apps", + "dataToolDesc": "A webpage that shows you certain information from your Habitica account, such as statistics about your tasks, equipment, and skills.", + "beeminder": "Beeminder", + "beeminderDesc": "Let Beeminder automatically monitor your Habitica To-Dos. You can commit to maintaining a target number of To-Dos completed per day or per week, or you can commit to gradually reducing your remaining number of uncompleted To-Dos. (By \"commit\" Beeminder means under threat of paying actual money! But you may also just like Beeminder's fancy graphs.)", + "chromeChatExtension": "Chrome Chat Extension", + "chromeChatExtensionDesc": "The Chrome Chat Extension for Habitica adds an intuitive chat box to all of habitica.com. It allows users to chat in the Tavern, their party, and any guilds they are in.", + "otherExtensions": "Other Extensions", + "otherDesc": "Find other apps, extensions, and tools on the Habitica wiki.", "resetDo": "Do it, reset my account!", "fixValues": "Fix Values", "fixValuesText1": "If you've encountered a bug or made a mistake that unfairly changed your character (damage you shouldn't have taken, Gold you didn't really earn, etc.), you can manually correct your numbers here. Yes, this makes it possible to cheat: use this feature wisely, or you'll sabotage your own habit-building!", diff --git a/common/script/content/index.js b/common/script/content/index.js index 5b444ecb0f..fc5da5bcbc 100644 --- a/common/script/content/index.js +++ b/common/script/content/index.js @@ -418,7 +418,7 @@ api.specialPets = { 'Tiger-Veteran': 'veteranTiger', 'Phoenix-Base': 'phoenix', 'Turkey-Gilded': 'gildedTurkey', - 'Bumblebee-Base': 'bumblebee', + 'MagicalBee-Base': 'magicalBee', }; api.specialMounts = { @@ -431,7 +431,7 @@ api.specialMounts = { 'Gryphon-RoyalPurple': 'royalPurpleGryphon', 'Phoenix-Base': 'phoenix', 'JackOLantern-Base': 'jackolantern', - 'Bumblebee-Base': 'bumblebee', + 'MagicalBee-Base': 'magicalBee', }; api.timeTravelStable = { diff --git a/common/script/fns/crit.js b/common/script/fns/crit.js index 07b144a805..65a0cbb062 100644 --- a/common/script/fns/crit.js +++ b/common/script/fns/crit.js @@ -1,7 +1,8 @@ +import predictableRandom from './predictableRandom'; module.exports = function crit (user, stat = 'str', chance = 0.03) { let s = user._statsComputed[stat]; - if (user.fns.predictableRandom() <= chance * (1 + s / 100)) { + if (predictableRandom(user) <= chance * (1 + s / 100)) { return 1.5 + 4 * s / (s + 200); } else { return 1; diff --git a/common/script/fns/randomDrop.js b/common/script/fns/randomDrop.js index 0ab6a5e69a..3d1114676a 100644 --- a/common/script/fns/randomDrop.js +++ b/common/script/fns/randomDrop.js @@ -3,80 +3,118 @@ import content from '../content/index'; import i18n from '../i18n'; import { daysSince } from '../cron'; import { diminishingReturns } from '../statHelpers'; +import { predictableRandom } from './predictableRandom'; +import randomVal from './randomVal'; // Clone a drop object maintaining its functions so that we can change it without affecting the original item function cloneDropItem (drop) { - return _.cloneDeep(drop, function (val) { + return _.cloneDeep(drop, (val) => { return _.isFunction(val) ? val : undefined; // undefined will be handled by lodash }); } -module.exports = function randomDrop (user, modifiers, req) { - var acceptableDrops, base, base1, base2, chance, drop, dropK, dropMultiplier, name, name1, name2, quest, rarity, ref, ref1, ref2, ref3, task; +module.exports = function randomDrop (user, modifiers, req = {}) { + let acceptableDrops; + let chance; + let drop; + let dropK; + let dropMultiplier; + let quest; + let rarity; + let task; + task = modifiers.task; - chance = _.min([Math.abs(task.value - 21.27), 37.5]) / 150 + .02; - chance *= task.priority * (1 + (task.streak / 100 || 0)) * (1 + (user._statsComputed.per / 100)) * (1 + (user.contributor.level / 40 || 0)) * (1 + (user.achievements.rebirths / 20 || 0)) * (1 + (user.achievements.streak / 200 || 0)) * (user._tmp.crit || 1) * (1 + .5 * (_.reduce(task.checklist, (function(m, i) { - return m + (i.completed ? 1 : 0); - }), 0) || 0)); + + chance = _.min([Math.abs(task.value - 21.27), 37.5]) / 150 + 0.02; + chance *= task.priority * // Task priority: +50% for Medium, +100% for Hard + (1 + (task.streak / 100 || 0)) * // Streak bonus: +1% per streak + (1 + user._statsComputed.per / 100) * // PERception: +1% per point + (1 + (user.contributor.level / 40 || 0)) * // Contrib levels: +2.5% per level + (1 + (user.achievements.rebirths / 20 || 0)) * // Rebirths: +5% per achievement + (1 + (user.achievements.streak / 200 || 0)) * // Streak achievements: +0.5% per achievement + (user._tmp.crit || 1) * (1 + 0.5 * (_.reduce(task.checklist, (m, i) => { + return m + (i.completed ? 1 : 0); // +50% per checklist item complete. TODO: make this into X individual drop chances instead + }, 0) || 0)); chance = diminishingReturns(chance, 0.75); - quest = content.quests[(ref = user.party.quest) != null ? ref.key : void 0]; - if ((quest != null ? quest.collect : void 0) && user.fns.predictableRandom(user.stats.gp) < chance) { - dropK = user.fns.randomVal(quest.collect, { - key: true + + if (user.party.quest.key) + quest = content.quests[user.party.quest.key]; + if (quest && quest.collect && predictableRandom(user, user.stats.gp) < chance) { + dropK = randomVal(user, quest.collect, { + key: true, }); + if (!user.party.quest.progress.collect[dropK]) + user.party.quest.progress.collect[dropK] = 0; user.party.quest.progress.collect[dropK]++; - if (typeof user.markModified === "function") { - user.markModified('party.quest.progress'); - } + user.markModified('party.quest.progress'); } - dropMultiplier = ((ref1 = user.purchased) != null ? (ref2 = ref1.plan) != null ? ref2.customerId : void 0 : void 0) ? 2 : 1; - if ((daysSince(user.items.lastDrop.date, user.preferences) === 0) && (user.items.lastDrop.count >= dropMultiplier * (5 + Math.floor(user._statsComputed.per / 25) + (user.contributor.level || 0)))) { + + if (user.purchased && user.purchased.plan && user.purchased.plan.custsomerId) { + dropMultiplier = 2; + } else { + dropMultiplier = 1; + } + + if (daysSince(user.items.lastDrop.date, user.preferences) === 0 && + user.items.lastDrop.count >= dropMultiplier * (5 + Math.floor(user._statsComputed.per / 25) + (user.contributor.level || 0))) { return; } - if (((ref3 = user.flags) != null ? ref3.dropsEnabled : void 0) && user.fns.predictableRandom(user.stats.exp) < chance) { - rarity = user.fns.predictableRandom(user.stats.gp); - if (rarity > .6) { - drop = cloneDropItem(user.fns.randomVal(_.where(content.food, { - canDrop: true + + if (user.flags && user.flags.dropsEnabled && predictableRandom(user, user.stats.exp) < chance) { + rarity = predictableRandom(user, user.stats.gp); + + if (rarity > 0.6) { // food 40% chance + drop = cloneDropItem(randomVal(user, _.where(content.food, { + canDrop: true, }))); - if ((base = user.items.food)[name = drop.key] == null) { - base[name] = 0; + + if (!user.items.food[drop.key]) { + user.items.food[drop.key] = 0; } user.items.food[drop.key] += 1; drop.type = 'Food'; drop.dialog = i18n.t('messageDropFood', { dropArticle: drop.article, dropText: drop.text(req.language), - dropNotes: drop.notes(req.language) + dropNotes: drop.notes(req.language), }, req.language); - } else if (rarity > .3) { - drop = cloneDropItem(user.fns.randomVal(content.dropEggs)); - if ((base1 = user.items.eggs)[name1 = drop.key] == null) { - base1[name1] = 0; + } else if (rarity > 0.3) { // eggs 30% chance + drop = cloneDropItem(randomVal(user, content.dropEggs)); + if (!user.items.eggs[drop.key]) { + user.items.eggs[drop.key] = 0; } user.items.eggs[drop.key]++; drop.type = 'Egg'; drop.dialog = i18n.t('messageDropEgg', { dropText: drop.text(req.language), - dropNotes: drop.notes(req.language) + dropNotes: drop.notes(req.language), }, req.language); - } else { - acceptableDrops = rarity < .02 ? ['Golden'] : rarity < .09 ? ['Zombie', 'CottonCandyPink', 'CottonCandyBlue'] : rarity < .18 ? ['Red', 'Shade', 'Skeleton'] : ['Base', 'White', 'Desert']; - drop = cloneDropItem(user.fns.randomVal(_.pick(content.hatchingPotions, (function(v, k) { + } else { // Hatching Potion, 30% chance - break down by rarity. + if (rarity < 0.02) { // Very Rare: 10% (of 30%) + acceptableDrops = ['Golden']; + } else if (rarity < 0.09) { // Rare: 20% of 30% + acceptableDrops = ['Zombie', 'CottonCandyPink', 'CottonCandyBlue']; + } else if (rarity < 0.18) { // uncommon: 30% of 30% + acceptableDrops = ['Red', 'Shade', 'Skeleton']; + } else { // common, 40% of 30% + acceptableDrops = ['Base', 'White', 'Desert']; + } + drop = cloneDropItem(randomVal(user, _.pick(content.hatchingPotions, (v, k) => { return acceptableDrops.indexOf(k) >= 0; - })))); - if ((base2 = user.items.hatchingPotions)[name2 = drop.key] == null) { - base2[name2] = 0; + }))); + if (!user.items.hatchingPotions[drop.key]) { + user.items.hatchingPotions[drop.key] = 0; } user.items.hatchingPotions[drop.key]++; drop.type = 'HatchingPotion'; drop.dialog = i18n.t('messageDropPotion', { dropText: drop.text(req.language), - dropNotes: drop.notes(req.language) + dropNotes: drop.notes(req.language), }, req.language); } + user._tmp.drop = drop; - user.items.lastDrop.date = +(new Date); - return user.items.lastDrop.count++; + user.items.lastDrop.date = Number(new Date()); + user.items.lastDrop.count++; } }; diff --git a/common/script/index.js b/common/script/index.js index 0a6cfae2c2..5191ba5802 100644 --- a/common/script/index.js +++ b/common/script/index.js @@ -85,12 +85,37 @@ import count from './count'; api.count = count; import statsComputed from './libs/statsComputed'; +api.statsComputed = statsComputed; + +import autoAllocate from './fns/autoAllocate'; +import crit from './fns/crit'; +import handleTwoHanded from './fns/handleTwoHanded'; +import predictableRandom from './fns/predictableRandom'; +import randomDrop from './fns/randomDrop'; +import randomVal from './fns/randomVal'; +import resetGear from './fns/resetGear'; +import ultimateGear from './fns/ultimateGear'; +import updateStats from './fns/updateStats'; + +api.fns = { + autoAllocate, + crit, + handleTwoHanded, + predictableRandom, + randomDrop, + randomVal, + resetGear, + ultimateGear, + updateStats, +}; -// TODO As ops and fns are ported, exported them through the api object import scoreTask from './ops/scoreTask'; import sleep from './ops/sleep'; import allocate from './ops/allocate'; import buy from './ops/buy'; +import buyGear from './ops/buyGear'; +import buyPotion from './ops/buyPotion'; +import buyArmoire from './ops/buyArmoire'; import buyMysterySet from './ops/buyMysterySet'; import buyQuest from './ops/buyQuest'; import buySpecialSpell from './ops/buySpecialSpell'; @@ -128,6 +153,9 @@ api.ops = { sleep, allocate, buy, + buyGear, + buyPotion, + buyArmoire, buyMysterySet, buySpecialSpell, buyQuest, @@ -161,28 +189,12 @@ api.ops = { reset, }; -import handleTwoHanded from './fns/handleTwoHanded'; -import predictableRandom from './fns/predictableRandom'; -import randomVal from './fns/randomVal'; -import ultimateGear from './fns/ultimateGear'; -import autoAllocate from './fns/autoAllocate'; - -api.fns = { - handleTwoHanded, - predictableRandom, - randomVal, - ultimateGear, - autoAllocate, -}; - - /* ------------------------------------------------------ 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) @@ -216,7 +228,7 @@ TODO import importedOps from './ops'; import importedFns from './fns'; -// TODO redo +// TODO Kept for the client side api.wrap = function wrapUser (user, main = true) { if (user._wrapped) return; user._wrapped = true; @@ -260,6 +272,9 @@ api.wrap = function wrapUser (user, main = true) { releaseMounts: _.partial(importedOps.releaseMounts, user), releaseBoth: _.partial(importedOps.releaseBoth, user), buy: _.partial(importedOps.buy, user), + buyPotion: _.partial(importedOps.buyPotion, user), + buyArmoire: _.partial(importedOps.buyArmoire, user), + buyGear: _.partial(importedOps.buyGear, user), buyQuest: _.partial(importedOps.buyQuest, user), buyMysterySet: _.partial(importedOps.buyMysterySet, user), hourglassPurchase: _.partial(importedOps.hourglassPurchase, user), diff --git a/common/script/ops/addPushDevice.js b/common/script/ops/addPushDevice.js index 431a74177b..a909fe9feb 100644 --- a/common/script/ops/addPushDevice.js +++ b/common/script/ops/addPushDevice.js @@ -1,11 +1,11 @@ import _ from 'lodash'; import i18n from '../i18n'; -import splitWhitespace from '../libs/splitWhitespace'; import { BadRequest, NotAuthorized, } from '../libs/errors'; +// TODO move to server code module.exports = function addPushDevice (user, req = {}) { let regId = _.get(req, 'body.regId'); if (!regId) throw new BadRequest(i18n.t('regIdRequired', req.language)); @@ -34,10 +34,8 @@ module.exports = function addPushDevice (user, req = {}) { pushDevices.push(item); - let response = { - data: _.pick(user, splitWhitespace('pushDevices')), - message: i18n.t('pushDeviceAdded', req.language), - }; - - return response; + return [ + user.pushDevices, + i18n.t('pushDeviceAdded', req.language), + ]; }; diff --git a/common/script/ops/addWebhook.js b/common/script/ops/addWebhook.js index 16d63593d2..c308d1b9e5 100644 --- a/common/script/ops/addWebhook.js +++ b/common/script/ops/addWebhook.js @@ -7,8 +7,7 @@ import { import _ from 'lodash'; module.exports = function addWebhook (user, req = {}) { - let wh; - wh = user.preferences.webhooks; + let wh = user.preferences.webhooks; if (!validator.isURL(_.get(req, 'body.url'))) throw new BadRequest(i18n.t('invalidUrl', req.language)); if (!validator.isBoolean(_.get(req, 'body.enabled'))) throw new BadRequest(i18n.t('invalidEnabled', req.language)); @@ -18,9 +17,11 @@ module.exports = function addWebhook (user, req = {}) { if (req.v2 === true) { return user.preferences.webhooks; } else { - return refPush(wh, { - url: req.body.url, - enabled: req.body.enabled, - }); + return [ + refPush(wh, { + url: req.body.url, + enabled: req.body.enabled, + }), + ]; } }; diff --git a/common/script/ops/allocate.js b/common/script/ops/allocate.js index c04c756e45..8e07e09589 100644 --- a/common/script/ops/allocate.js +++ b/common/script/ops/allocate.js @@ -1,5 +1,4 @@ import _ from 'lodash'; -import splitWhitespace from '../libs/splitWhitespace'; import { ATTRIBUTES, } from '../constants'; @@ -26,5 +25,7 @@ module.exports = function allocate (user, req = {}) { throw new NotAuthorized(i18n.t('notEnoughAttrPoints', req.language)); } - return _.pick(user, splitWhitespace('stats')); + return [ + user.stats, + ]; }; diff --git a/common/script/ops/allocateNow.js b/common/script/ops/allocateNow.js index 0db7a3a819..e8ae5d249c 100644 --- a/common/script/ops/allocateNow.js +++ b/common/script/ops/allocateNow.js @@ -8,8 +8,8 @@ module.exports = function allocateNow (user, req = {}) { if (req.v2 === true) { return _.pick(user, 'stats'); } else { - return { - data: _.pick(user, 'stats'), - }; + return [ + user.stats, + ]; } }; diff --git a/common/script/ops/blockUser.js b/common/script/ops/blockUser.js index 3546d412ab..5c123735ed 100644 --- a/common/script/ops/blockUser.js +++ b/common/script/ops/blockUser.js @@ -15,5 +15,7 @@ module.exports = function blockUser (user, req = {}) { } user.markModified('inbox.blocks'); - return user.inbox.blocks; + return [ + user.inbox.blocks, + ]; }; diff --git a/common/script/ops/buy.js b/common/script/ops/buy.js index 268be94b39..d62842acea 100644 --- a/common/script/ops/buy.js +++ b/common/script/ops/buy.js @@ -1,142 +1,24 @@ -import content from '../content/index'; import i18n from '../i18n'; import _ from 'lodash'; -import count from '../count'; -import splitWhitespace from '../libs/splitWhitespace'; import { BadRequest, - NotAuthorized, - NotFound, } from '../libs/errors'; -import predictableRandom from '../fns/predictableRandom'; -import randomVal from '../fns/randomVal'; -import handleTwoHanded from '../fns/handleTwoHanded'; -import ultimateGear from '../fns/ultimateGear'; +import buyPotion from './buyPotion'; +import buyArmoire from './buyArmoire'; +import buyGear from './buyGear'; module.exports = function buy (user, req = {}, analytics) { let key = _.get(req, 'params.key'); if (!key) throw new BadRequest(i18n.t('missingKeyParam', req.language)); - let item; + let buyRes; if (key === 'potion') { - item = content.potion; + buyRes = buyPotion(user, req, analytics); } else if (key === 'armoire') { - item = content.armoire; + buyRes = buyArmoire(user, req, analytics); } else { - item = content.gear.flat[key]; - } - if (!item) throw new NotFound(i18n.t('itemNotFound', {key}, req.language)); - - if (user.stats.gp < item.value) { - throw new NotAuthorized(i18n.t('messageNotEnoughGold', req.language)); + buyRes = buyGear(user, req, analytics); } - if (item.canOwn && !item.canOwn(user)) { - throw new NotAuthorized(i18n.t('cannoyBuyItem', req.language)); - } - - let armoireResp; - let armoireResult; - let eligibleEquipment; - let drop; - let message; - - if (item.key === 'potion') { - user.stats.hp += 15; - if (user.stats.hp > 50) { - user.stats.hp = 50; - } - } else if (item.key === 'armoire') { - armoireResult = predictableRandom(user, user.stats.gp); - eligibleEquipment = _.filter(content.gear.flat, (eligible) => { - return eligible.klass === 'armoire' && !user.items.gear.owned[eligible.key]; - }); - - if (!_.isEmpty(eligibleEquipment) && (armoireResult < 0.6 || !user.flags.armoireOpened)) { - eligibleEquipment.sort(); - drop = randomVal(user, eligibleEquipment); - - user.items.gear.owned[drop.key] = true; - user.flags.armoireOpened = true; - message = i18n.t('armoireEquipment', { - image: ``, - dropText: drop.text(req.language), - }, req.language); - - if (count.remainingGearInSet(user.items.gear.owned, 'armoire') === 0) { - user.flags.armoireEmpty = true; - } - - armoireResp = { - type: 'gear', - dropKey: drop.key, - dropText: drop.text(req.language), - }; - } else if ((!_.isEmpty(eligibleEquipment) && armoireResult < 0.8) || armoireResult < 0.5) { // eslint-disable-line no-extra-parens - drop = randomVal(user, _.where(content.food, { - canDrop: true, - })); - user.items.food[drop.key] = user.items.food[drop.key] || 0; - user.items.food[drop.key] += 1; - - message = i18n.t('armoireFood', { - image: ``, - dropArticle: drop.article, - dropText: drop.text(req.language), - }, req.language); - armoireResp = { - type: 'food', - dropKey: drop.key, - dropArticle: drop.article, - dropText: drop.text(req.language), - }; - } else { - let armoireExp = Math.floor(predictableRandom(user, user.stats.exp) * 40 + 10); - user.stats.exp += armoireExp; - message = i18n.t('armoireExp', req.language); - armoireResp = { - type: 'experience', - value: armoireExp, - }; - } - } else { - if (user.preferences.autoEquip) { - user.items.gear.equipped[item.type] = item.key; - message = handleTwoHanded(user, item, undefined, req); - } - user.items.gear.owned[item.key] = true; - - if (item.last) ultimateGear(user); - } - - user.stats.gp -= item.value; - - if (!message) { - message = i18n.t('messageBought', { - itemText: item.text(req.language), - }, req.language); - } - - if (analytics) { - analytics.track('acquire item', { - uuid: user._id, - itemKey: key, - acquireMethod: 'Gold', - goldCost: item.value, - category: 'behavior', - }); - } - - let res = { - data: _.pick(user, splitWhitespace('items achievements stats flags')), - message, - }; - - if (armoireResp) res.armoire = armoireResp; - - if (req.v2 === true) { - return res.data; - } else { - return res; - } + return buyRes; }; diff --git a/common/script/ops/buyArmoire.js b/common/script/ops/buyArmoire.js new file mode 100644 index 0000000000..e183c06984 --- /dev/null +++ b/common/script/ops/buyArmoire.js @@ -0,0 +1,115 @@ +import content from '../content/index'; +import i18n from '../i18n'; +import _ from 'lodash'; +import count from '../count'; +import splitWhitespace from '../libs/splitWhitespace'; +import { + NotAuthorized, +} from '../libs/errors'; +import predictableRandom from '../fns/predictableRandom'; +import randomVal from '../fns/randomVal'; + +module.exports = function buyArmoire (user, req = {}, analytics) { + let item = content.armoire; + + if (user.stats.gp < item.value) { + throw new NotAuthorized(i18n.t('messageNotEnoughGold', req.language)); + } + + if (item.canOwn && !item.canOwn(user)) { + throw new NotAuthorized(i18n.t('cannotBuyItem', req.language)); + } + + let armoireResp; + let armoireResult; + let eligibleEquipment; + let drop; + let message; + + armoireResult = predictableRandom(user, user.stats.gp); + eligibleEquipment = _.filter(content.gear.flat, (eligible) => { + return eligible.klass === 'armoire' && !user.items.gear.owned[eligible.key]; + }); + + if (!_.isEmpty(eligibleEquipment) && (armoireResult < 0.6 || !user.flags.armoireOpened)) { + eligibleEquipment.sort(); + drop = randomVal(user, eligibleEquipment); + + if (user.items.gear.owned[drop.key]) { + throw new NotAuthorized(i18n.t('equipmentAlradyOwned', req.language)); + } + + user.items.gear.owned[drop.key] = true; + user.flags.armoireOpened = true; + message = i18n.t('armoireEquipment', { + image: ``, + dropText: drop.text(req.language), + }, req.language); + + if (count.remainingGearInSet(user.items.gear.owned, 'armoire') === 0) { + user.flags.armoireEmpty = true; + } + + armoireResp = { + type: 'gear', + dropKey: drop.key, + dropText: drop.text(req.language), + }; + } else if ((!_.isEmpty(eligibleEquipment) && armoireResult < 0.8) || armoireResult < 0.5) { // eslint-disable-line no-extra-parens + drop = randomVal(user, _.where(content.food, { + canDrop: true, + })); + user.items.food[drop.key] = user.items.food[drop.key] || 0; + user.items.food[drop.key] += 1; + + message = i18n.t('armoireFood', { + image: ``, + dropArticle: drop.article, + dropText: drop.text(req.language), + }, req.language); + armoireResp = { + type: 'food', + dropKey: drop.key, + dropArticle: drop.article, + dropText: drop.text(req.language), + }; + } else { + let armoireExp = Math.floor(predictableRandom(user, user.stats.exp) * 40 + 10); + user.stats.exp += armoireExp; + message = i18n.t('armoireExp', req.language); + armoireResp = { + type: 'experience', + value: armoireExp, + }; + } + + user.stats.gp -= item.value; + + if (!message) { + message = i18n.t('messageBought', { + itemText: item.text(req.language), + }, req.language); + } + + if (analytics) { + analytics.track('acquire item', { + uuid: user._id, + itemKey: 'Armoire', + acquireMethod: 'Gold', + goldCost: item.value, + category: 'behavior', + }); + } + + let resData = _.pick(user, splitWhitespace('items flags')); + if (armoireResp) resData.armoire = armoireResp; + + if (req.v2 === true) { + return resData; + } else { + return [ + resData, + message, + ]; + } +}; diff --git a/common/script/ops/buyGear.js b/common/script/ops/buyGear.js new file mode 100644 index 0000000000..e4f4eb3b68 --- /dev/null +++ b/common/script/ops/buyGear.js @@ -0,0 +1,70 @@ +import content from '../content/index'; +import i18n from '../i18n'; +import _ from 'lodash'; +import splitWhitespace from '../libs/splitWhitespace'; +import { + BadRequest, + NotAuthorized, + NotFound, +} from '../libs/errors'; +import handleTwoHanded from '../fns/handleTwoHanded'; +import ultimateGear from '../fns/ultimateGear'; + +module.exports = function buyGear (user, req = {}, analytics) { + let key = _.get(req, 'params.key'); + if (!key) throw new BadRequest(i18n.t('missingKeyParam', req.language)); + + let item = content.gear.flat[key]; + + if (!item) throw new NotFound(i18n.t('itemNotFound', {key}, req.language)); + + if (user.stats.gp < item.value) { + throw new NotAuthorized(i18n.t('messageNotEnoughGold', req.language)); + } + + if (item.canOwn && !item.canOwn(user)) { + throw new NotAuthorized(i18n.t('cannotBuyItem', req.language)); + } + + let message; + + if (user.items.gear.owned[item.key]) { + throw new NotAuthorized(i18n.t('equipmentAlreadyOwned', req.language)); + } + + if (user.preferences.autoEquip) { + user.items.gear.equipped[item.type] = item.key; + message = handleTwoHanded(user, item, undefined, req); + } + + user.items.gear.owned[item.key] = true; + + if (item.last) ultimateGear(user); + + user.stats.gp -= item.value; + + if (!message) { + message = i18n.t('messageBought', { + itemText: item.text(req.language), + }, req.language); + } + + if (analytics) { + analytics.track('acquire item', { + uuid: user._id, + itemKey: key, + acquireMethod: 'Gold', + goldCost: item.value, + category: 'behavior', + }); + } + + if (req.v2 === true) { + return _.pick(user, splitWhitespace('items achievements stats flags')); + } else { + return [ + _.pick(user, splitWhitespace('items achievements stats flags')), + message, + ]; + } +}; diff --git a/common/script/ops/buyMysterySet.js b/common/script/ops/buyMysterySet.js index cc2eb8f3b1..acf0014279 100644 --- a/common/script/ops/buyMysterySet.js +++ b/common/script/ops/buyMysterySet.js @@ -47,9 +47,9 @@ module.exports = function buyMysterySet (user, req = {}, analytics) { if (req.v2 === true) { return pickDeep(user, splitWhitespace('items purchased.plan.consecutive')); } else { - return { - data: pickDeep(user, splitWhitespace('items purchased.plan.consecutive')), - message: i18n.t('hourglassPurchaseSet', req.language), - }; + return [ + { items: user.items, purchasedPlanConsecutive: user.purchased.plan.consecutive }, + i18n.t('hourglassPurchaseSet', req.language), + ]; } }; diff --git a/common/script/ops/buyPotion.js b/common/script/ops/buyPotion.js new file mode 100644 index 0000000000..5c64b19609 --- /dev/null +++ b/common/script/ops/buyPotion.js @@ -0,0 +1,48 @@ +import content from '../content/index'; +import i18n from '../i18n'; +import { + NotAuthorized, +} from '../libs/errors'; + +module.exports = function buyPotion (user, req = {}, analytics) { + let item = content.potion; + + if (user.stats.gp < item.value) { + throw new NotAuthorized(i18n.t('messageNotEnoughGold', req.language)); + } + + if (item.canOwn && !item.canOwn(user)) { + throw new NotAuthorized(i18n.t('cannotBuyItem', req.language)); + } + + user.stats.hp += 15; + if (user.stats.hp > 50) { + user.stats.hp = 50; + } + + user.stats.gp -= item.value; + + let message = i18n.t('messageBought', { + itemText: item.text(req.language), + }, req.language); + + + if (analytics) { + analytics.track('acquire item', { + uuid: user._id, + itemKey: 'Potion', + acquireMethod: 'Gold', + goldCost: item.value, + category: 'behavior', + }); + } + + if (req.v2 === true) { + return user.stats; + } else { + return [ + user.stats, + message, + ]; + } +}; diff --git a/common/script/ops/buyQuest.js b/common/script/ops/buyQuest.js index 6cab422063..af7c384419 100644 --- a/common/script/ops/buyQuest.js +++ b/common/script/ops/buyQuest.js @@ -40,11 +40,11 @@ module.exports = function buyQuest (user, req = {}, analytics) { if (req.v2 === true) { return user.items.quests; } else { - return { - data: user.items.quests, - message: i18n.t('messageBought', { + return [ + user.items.quests, + i18n.t('messageBought', { itemText: item.text(req.language), }, req.language), - }; + ]; } }; diff --git a/common/script/ops/buySpecialSpell.js b/common/script/ops/buySpecialSpell.js index 921ffc817b..20ea0251aa 100644 --- a/common/script/ops/buySpecialSpell.js +++ b/common/script/ops/buySpecialSpell.js @@ -25,11 +25,11 @@ module.exports = function buySpecialSpell (user, req = {}) { if (req.v2 === true) { return _.pick(user, splitWhitespace('items stats')); } else { - return { - data: _.pick(user, splitWhitespace('items stats')), - message: i18n.t('messageBought', { + return [ + _.pick(user, splitWhitespace('items stats')), + i18n.t('messageBought', { itemText: item.text(req.language), }, req.language), - }; + ]; } }; diff --git a/common/script/ops/changeClass.js b/common/script/ops/changeClass.js index 520a435ace..4b3eb6b289 100644 --- a/common/script/ops/changeClass.js +++ b/common/script/ops/changeClass.js @@ -71,8 +71,8 @@ module.exports = function changeClass (user, req = {}, analytics) { if (req.v2 === true) { return _.pick(user, splitWhitespace('stats flags items preferences')); } else { - return { - data: _.pick(user, splitWhitespace('stats flags items preferences')), - }; + return [ + _.pick(user, splitWhitespace('stats flags items preferences')), + ]; } }; diff --git a/common/script/ops/clearPMs.js b/common/script/ops/clearPMs.js index 5187354dfc..765ecc3b56 100644 --- a/common/script/ops/clearPMs.js +++ b/common/script/ops/clearPMs.js @@ -1,5 +1,7 @@ module.exports = function clearPMs (user) { user.inbox.messages = {}; user.markModified('inbox.messages'); - return user.inbox.messages; + return [ + user.inbox.messages, + ]; }; diff --git a/common/script/ops/deletePM.js b/common/script/ops/deletePM.js index 826cf9ee1a..84bb7ee33a 100644 --- a/common/script/ops/deletePM.js +++ b/common/script/ops/deletePM.js @@ -3,5 +3,7 @@ import _ from 'lodash'; module.exports = function deletePM (user, req = {}) { delete user.inbox.messages[_.get(req, 'params.id')]; user.markModified(`inbox.messages.${req.params.id}`); - return user.inbox.messages; + return [ + user.inbox.messages, + ]; }; diff --git a/common/script/ops/deleteWebhook.js b/common/script/ops/deleteWebhook.js index 51e94982d4..9c4f67eba8 100644 --- a/common/script/ops/deleteWebhook.js +++ b/common/script/ops/deleteWebhook.js @@ -4,5 +4,7 @@ module.exports = function deleteWebhook (user, req) { delete user.preferences.webhooks[_.get(req, 'params.id')]; user.markModified('preferences.webhooks'); - return user.preferences.webhooks; + return [ + user.preferences.webhooks, + ]; }; diff --git a/common/script/ops/disableClasses.js b/common/script/ops/disableClasses.js index 58f493a13c..e611bb0872 100644 --- a/common/script/ops/disableClasses.js +++ b/common/script/ops/disableClasses.js @@ -13,8 +13,8 @@ module.exports = function disableClasses (user, req = {}) { if (req.v2 === true) { return _.pick(user, splitWhitespace('stats flags preferences')); } else { - return { - data: _.pick(user, splitWhitespace('stats flags preferences')), - }; + return [ + _.pick(user, splitWhitespace('stats flags preferences')), + ]; } }; diff --git a/common/script/ops/equip.js b/common/script/ops/equip.js index ddef7c5483..9c614915a7 100644 --- a/common/script/ops/equip.js +++ b/common/script/ops/equip.js @@ -58,14 +58,11 @@ module.exports = function equip (user, req = {}) { } } - let res = { - data: user.items, - }; - if (message) res.message = message; - if (req.v2 === true) { return user.items; } else { + let res = [user.items]; + if (message) res.push(message); return res; } }; diff --git a/common/script/ops/feed.js b/common/script/ops/feed.js index f555a24dfc..dc06226cf0 100644 --- a/common/script/ops/feed.js +++ b/common/script/ops/feed.js @@ -94,9 +94,9 @@ module.exports = function feed (user, req = {}) { value: userPets[pet], }; } else { - return { - data: userPets[pet], + return [ + userPets[pet], message, - }; + ]; } }; diff --git a/common/script/ops/hatch.js b/common/script/ops/hatch.js index 01b0b68520..87adbf3276 100644 --- a/common/script/ops/hatch.js +++ b/common/script/ops/hatch.js @@ -36,9 +36,9 @@ module.exports = function hatch (user, req = {}) { if (req.v2 === true) { return user.items; } else { - return { - message: i18n.t('messageHatched', req.language), - data: user.items, - }; + return [ + user.items, + i18n.t('messageHatched', req.language), + ]; } }; diff --git a/common/script/ops/hourglassPurchase.js b/common/script/ops/hourglassPurchase.js index 286590517a..e1d07bb482 100644 --- a/common/script/ops/hourglassPurchase.js +++ b/common/script/ops/hourglassPurchase.js @@ -1,12 +1,11 @@ import content from '../content/index'; import i18n from '../i18n'; import _ from 'lodash'; -import splitWhitespace from '../libs/splitWhitespace'; -import pickDeep from '../libs/pickDeep'; import { BadRequest, NotAuthorized, } from '../libs/errors'; +import splitWhitespace from '../libs/splitWhitespace'; module.exports = function purchaseHourglass (user, req = {}, analytics) { let key = _.get(req, 'params.key'); @@ -51,14 +50,12 @@ module.exports = function purchaseHourglass (user, req = {}, analytics) { }); } - let res = { - data: pickDeep(user, splitWhitespace('items purchased.plan.consecutive')), - message: i18n.t('hourglassPurchase', req.language), - }; - if (req.v2 === true) { - return res.data; + return _.pick(user, splitWhitespace('items purchased.plan.consecutive')); } else { - return res; + return [ + { items: user.items, purchasedPlanConsecutive: user.purchased.plan.consecutive }, + i18n.t('hourglassPurchase', req.language), + ]; } }; diff --git a/common/script/ops/index.js b/common/script/ops/index.js index a2775f7d2a..4b06ac93e6 100644 --- a/common/script/ops/index.js +++ b/common/script/ops/index.js @@ -30,6 +30,9 @@ import releasePets from './releasePets'; import releaseMounts from './releaseMounts'; import releaseBoth from './releaseBoth'; import buy from './buy'; +import buyGear from './buyGear'; +import buyPotion from './buyPotion'; +import buyArmoire from './buyArmoire'; import buyQuest from './buyQuest'; import buyMysterySet from './buyMysterySet'; import hourglassPurchase from './hourglassPurchase'; @@ -77,6 +80,9 @@ module.exports = { releaseMounts, releaseBoth, buy, + buyGear, + buyPotion, + buyArmoire, buyQuest, buyMysterySet, hourglassPurchase, diff --git a/common/script/ops/openMysteryItem.js b/common/script/ops/openMysteryItem.js index dc270cace9..743104c48b 100644 --- a/common/script/ops/openMysteryItem.js +++ b/common/script/ops/openMysteryItem.js @@ -36,9 +36,9 @@ module.exports = function openMysteryItem (user, req = {}, analytics) { if (req.v2 === true) { return user.items.gear.owned; } else { - return { - message: i18n.t('mysteryItemOpened', req.language), - data: user.items.gear.owned, - }; + return [ + user.items.gear.owned, + i18n.t('mysteryItemOpened', req.language), + ]; } }; diff --git a/common/script/ops/purchase.js b/common/script/ops/purchase.js index b4a7136646..bb5a71df80 100644 --- a/common/script/ops/purchase.js +++ b/common/script/ops/purchase.js @@ -54,12 +54,10 @@ module.exports = function purchase (user, req = {}, analytics) { }); } - let response = { - data: _.pick(user, splitWhitespace('stats balance')), - message: i18n.t('plusOneGem'), - }; - - return response; + return [ + _.pick(user, splitWhitespace('stats balance')), + i18n.t('plusOneGem'), + ]; } let acceptedTypes = ['eggs', 'hatchingPotions', 'food', 'quests', 'gear']; @@ -119,14 +117,12 @@ module.exports = function purchase (user, req = {}, analytics) { }); } - let response = { - data: _.pick(user, splitWhitespace('items balance')), - message: i18n.t('purchased', {type, key}), - }; - if (req.v2 === true) { - return response.data; + return _.pick(user, splitWhitespace('items balance')); } else { - return response; + return [ + _.pick(user, splitWhitespace('items balance')), + i18n.t('purchased', {type, key}), + ]; } }; diff --git a/common/script/ops/readCard.js b/common/script/ops/readCard.js index d943e40a35..57b0da4b00 100644 --- a/common/script/ops/readCard.js +++ b/common/script/ops/readCard.js @@ -24,9 +24,9 @@ module.exports = function readCard (user, req = {}) { if (req.v2 === true) { return _.pick(user, splitWhitespace('items.special flags.cardReceived')); } else { - return { - message: i18n.t('readCard', {cardType}, req.language), - data: _.pick(user, splitWhitespace('items.special flags.cardReceived')), - }; + return [ + { specialItems: user.items.special, cardReceived: user.flags.cardReceived }, + i18n.t('readCard', {cardType}, req.language), + ]; } }; diff --git a/common/script/ops/rebirth.js b/common/script/ops/rebirth.js index bf29e64d67..40920fb0c7 100644 --- a/common/script/ops/rebirth.js +++ b/common/script/ops/rebirth.js @@ -98,14 +98,12 @@ module.exports = function rebirth (user, tasks = [], req = {}, analytics) { user.stats.buffs = {}; - let response = { - data: user, - message: i18n.t('rebirthComplete'), - }; - if (req.v2 === true) { return user; } else { - return response; + return [ + {user, tasks}, + i18n.t('rebirthComplete'), + ]; } }; diff --git a/common/script/ops/releaseBoth.js b/common/script/ops/releaseBoth.js index cc17b99e44..cf7d2267ca 100644 --- a/common/script/ops/releaseBoth.js +++ b/common/script/ops/releaseBoth.js @@ -57,14 +57,12 @@ module.exports = function releaseBoth (user, req = {}, analytics) { user.achievements.triadBingoCount++; } - let response = { - data: _.pick(user, splitWhitespace('achievements')), - message: i18n.t('mountsAndPetsReleased'), - }; - if (req.v2 === true) { return user; } else { - return response; + return [ + _.pick(user, splitWhitespace('achievements items balance')), + i18n.t('mountsAndPetsReleased'), + ]; } }; diff --git a/common/script/ops/releaseMounts.js b/common/script/ops/releaseMounts.js index a0564dc804..d8b8dde659 100644 --- a/common/script/ops/releaseMounts.js +++ b/common/script/ops/releaseMounts.js @@ -3,8 +3,6 @@ import i18n from '../i18n'; import { NotAuthorized, } from '../libs/errors'; -import splitWhitespace from '../libs/splitWhitespace'; -import _ from 'lodash'; module.exports = function releaseMounts (user, req = {}, analytics) { let mount; @@ -34,14 +32,12 @@ module.exports = function releaseMounts (user, req = {}, analytics) { }); } - let response = { - data: _.pick(user, splitWhitespace('mounts')), - message: i18n.t('mountsReleased'), - }; - if (req.v2 === true) { return user; } else { - return response; + return [ + user.items.mounts, + i18n.t('mountsReleased'), + ]; } }; diff --git a/common/script/ops/releasePets.js b/common/script/ops/releasePets.js index 09303b34e9..9466e1ccda 100644 --- a/common/script/ops/releasePets.js +++ b/common/script/ops/releasePets.js @@ -3,8 +3,6 @@ import i18n from '../i18n'; import { NotAuthorized, } from '../libs/errors'; -import splitWhitespace from '../libs/splitWhitespace'; -import _ from 'lodash'; module.exports = function releasePets (user, req = {}, analytics) { if (user.balance < 1) { @@ -32,14 +30,12 @@ module.exports = function releasePets (user, req = {}, analytics) { }); } - let response = { - data: _.pick(user, splitWhitespace('user.items.pets')), - message: i18n.t('petsReleased'), - }; - if (req.v2 === true) { return user; } else { - return response; + return [ + user.items.pets, + i18n.t('petsReleased'), + ]; } }; diff --git a/common/script/ops/reroll.js b/common/script/ops/reroll.js index 52939551b3..fee26fb88b 100644 --- a/common/script/ops/reroll.js +++ b/common/script/ops/reroll.js @@ -27,14 +27,12 @@ module.exports = function reroll (user, tasks = [], req = {}, analytics) { }); } - let response = { - data: {user, tasks}, - message: i18n.t('rerollComplete'), - }; - if (req.v2 === true) { return user; } else { - return response; + return [ + {user, tasks}, + i18n.t('rerollComplete'), + ]; } }; diff --git a/common/script/ops/reset.js b/common/script/ops/reset.js index 1e59ccf02a..eb8d25033e 100644 --- a/common/script/ops/reset.js +++ b/common/script/ops/reset.js @@ -19,14 +19,12 @@ module.exports = function reset (user, tasks = [], req = {}) { resetGear(user); - let response = { - data: {user, tasksToRemove}, - message: i18n.t('resetComplete'), - }; - if (req.v2 === true) { return user; } else { - return response; + return [ + {user, tasksToRemove}, + i18n.t('resetComplete'), + ]; } }; diff --git a/common/script/ops/revive.js b/common/script/ops/revive.js index 5b48e6fb71..30b29a78fc 100644 --- a/common/script/ops/revive.js +++ b/common/script/ops/revive.js @@ -4,7 +4,6 @@ import _ from 'lodash'; import { NotAuthorized, } from '../libs/errors'; -import splitWhitespace from '../libs/splitWhitespace'; import randomVal from '../fns/randomVal'; module.exports = function revive (user, req = {}, analytics) { @@ -97,14 +96,12 @@ module.exports = function revive (user, req = {}, analytics) { }); } - let response = { - data: _.pick(user, splitWhitespace('user.items')), - message, - }; - if (req.v2 === true) { return user; } else { - return response; + return [ + user.items, + message, + ]; } }; diff --git a/common/script/ops/scoreTask.js b/common/script/ops/scoreTask.js index ddaf0a155c..bfc99344a9 100644 --- a/common/script/ops/scoreTask.js +++ b/common/script/ops/scoreTask.js @@ -4,6 +4,7 @@ import { } from '../libs/errors'; import i18n from '../i18n'; import updateStats from '../fns/updateStats'; +import crit from '../fns/crit'; const MAX_TASK_VALUE = 21.27; const MIN_TASK_VALUE = -47.27; @@ -105,7 +106,7 @@ function _subtractPoints (user, task, stats, delta) { function _addPoints (user, task, stats, direction, delta) { // ===== CRITICAL HITS ===== // allow critical hit only when checking off a task, not when unchecking it: - let _crit = delta > 0 ? user.fns.crit() : 1; + let _crit = delta > 0 ? crit(user) : 1; // if there was a crit, alert the user via notification if (_crit > 1) user._tmp.crit = _crit; @@ -256,5 +257,5 @@ module.exports = function scoreTask (options = {}, req = {}) { } updateStats(user, stats, req); - return delta; + return [delta]; }; diff --git a/common/script/ops/sell.js b/common/script/ops/sell.js index fc3aa9632b..ccde6c552e 100644 --- a/common/script/ops/sell.js +++ b/common/script/ops/sell.js @@ -33,14 +33,12 @@ module.exports = function sell (user, req = {}) { user.items[type][key]--; user.stats.gp += content[type][key].value; - let response = { - data: _.pick(user, splitWhitespace('stats items')), - message: i18n.t('sold', {type, key}), - }; - if (req.v2 === true) { - return response.data; + return _.pick(user, splitWhitespace('stats items')); } else { - return response; + return [ + _.pick(user, splitWhitespace('stats items')), + i18n.t('sold', {type, key}), + ]; } }; diff --git a/common/script/ops/sleep.js b/common/script/ops/sleep.js index 8ef48eeac4..1a531ecb88 100644 --- a/common/script/ops/sleep.js +++ b/common/script/ops/sleep.js @@ -4,10 +4,6 @@ module.exports = function sleep (user, req = {}) { if (req.v2 === true) { return {}; } else { - return { - preferences: { - sleep: user.preferences.sleep, - }, - }; + return [user.preferences.sleep]; } }; diff --git a/common/script/ops/unlock.js b/common/script/ops/unlock.js index e7907f898b..5443b27f30 100644 --- a/common/script/ops/unlock.js +++ b/common/script/ops/unlock.js @@ -64,7 +64,7 @@ module.exports = function unlock (user, req = {}, analytics) { _.set(user, `purchased.${pathPart}`, true); }); } else { - if (alreadyOwns) { + if (alreadyOwns) { // eslint-disable-line no-lonely-if let split = path.split('.'); let value = split.pop(); let key = split.join('.'); @@ -97,14 +97,14 @@ module.exports = function unlock (user, req = {}, analytics) { } } - let response = { - data: _.pick(user, splitWhitespace('purchased preferences items')), - }; + let response = [ + _.pick(user, splitWhitespace('purchased preferences items')), + ]; - if (!alreadyOwns) response.message = i18n.t('unlocked', req.language); + if (!alreadyOwns) response.push(i18n.t('unlocked', req.language)); if (req.v2 === true) { - return response.data; + return response[0]; } else { return response; } diff --git a/common/script/ops/updateTask.js b/common/script/ops/updateTask.js index a128b40fc1..b6dd9f0f90 100644 --- a/common/script/ops/updateTask.js +++ b/common/script/ops/updateTask.js @@ -22,5 +22,5 @@ module.exports = function updateTask (task, req = {}) { _.merge(task, _.omit(req.body, ['_id', 'id', 'type'])); - return task; + return [task]; }; diff --git a/common/script/ops/updateWebhook.js b/common/script/ops/updateWebhook.js index d8ec977308..63fed89b17 100644 --- a/common/script/ops/updateWebhook.js +++ b/common/script/ops/updateWebhook.js @@ -15,6 +15,6 @@ module.exports = function updateWebhook (user, req) { if (req.v2 === true) { return user.preferences.webhooks; } else { - return user.preferences.webhooks[req.params.id]; + return [user.preferences.webhooks[req.params.id]]; } }; diff --git a/test/api/v3/integration/meta/models/GET-model_paths.test.js b/test/api/v3/integration/models/GET-model_paths.test.js similarity index 69% rename from test/api/v3/integration/meta/models/GET-model_paths.test.js rename to test/api/v3/integration/models/GET-model_paths.test.js index f878d391df..205269bcbe 100644 --- a/test/api/v3/integration/meta/models/GET-model_paths.test.js +++ b/test/api/v3/integration/models/GET-model_paths.test.js @@ -1,9 +1,9 @@ import { generateUser, translate as t, -} from '../../../../../helpers/api-integration/v3'; +} from '../../../../helpers/api-integration/v3'; -describe('GET /meta/models/:model/paths', () => { +describe('GET /models/:model/paths', () => { let user; before(async () => { @@ -11,7 +11,7 @@ describe('GET /meta/models/:model/paths', () => { }); it('returns an error when model is not accessible or doesn\'t exists', async () => { - await expect(user.get('/meta/models/1234/paths')).to.eventually.be.rejected.and.eql({ + await expect(user.get('/models/1234/paths')).to.eventually.be.rejected.and.eql({ code: 400, error: 'BadRequest', message: t('invalidReqParams'), @@ -21,7 +21,7 @@ describe('GET /meta/models/:model/paths', () => { let models = ['habit', 'daily', 'todo', 'reward', 'user', 'tag', 'challenge', 'group']; models.forEach(model => { it(`returns the model paths for ${model}`, async () => { - let res = await user.get(`/meta/models/${model}/paths`); + let res = await user.get(`/models/${model}/paths`); expect(res._id).to.equal('String'); expect(res).to.not.have.keys('__v'); diff --git a/test/api/v3/integration/user/POST-user_allocate.test.js b/test/api/v3/integration/user/POST-user_allocate.test.js index d213318534..02d4990092 100644 --- a/test/api/v3/integration/user/POST-user_allocate.test.js +++ b/test/api/v3/integration/user/POST-user_allocate.test.js @@ -36,6 +36,6 @@ describe('POST /user/allocate', () => { await user.sync(); expect(user.stats.con).to.equal(1); expect(user.stats.points).to.equal(0); - expect(res.stats.con).to.equal(1); + expect(res.con).to.equal(1); }); }); diff --git a/test/api/v3/integration/user/POST-user_allocate_now.test.js b/test/api/v3/integration/user/POST-user_allocate_now.test.js index 668c85610e..b45f2156be 100644 --- a/test/api/v3/integration/user/POST-user_allocate_now.test.js +++ b/test/api/v3/integration/user/POST-user_allocate_now.test.js @@ -18,11 +18,7 @@ describe('POST /user/allocate-now', () => { let res = await user.post('/user/allocate-now'); await user.sync(); - expect(res).to.eql({ - data: { - stats: user.stats, - }, - }); + expect(res).to.eql(user.stats); expect(user.stats.points).to.equal(0); expect(user.stats.con).to.equal(9); expect(user.stats.int).to.equal(8); diff --git a/test/api/v3/integration/user/POST-user_buy.test.js b/test/api/v3/integration/user/POST-user_buy.test.js index bca65a2ab7..2478adf7f8 100644 --- a/test/api/v3/integration/user/POST-user_buy.test.js +++ b/test/api/v3/integration/user/POST-user_buy.test.js @@ -26,17 +26,26 @@ describe('POST /user/buy/:key', () => { }); }); - it('buys an item', async () => { + it('buys a potion', async () => { + await user.update({ + 'stats.gp': 400, + }); + let potion = content.potion; let res = await user.post('/user/buy/potion'); await user.sync(); - expect(res.data).to.eql({ - items: JSON.parse(JSON.stringify(user.items)), // otherwise dates can't be compared - achievements: user.achievements, - stats: user.stats, - flags: JSON.parse(JSON.stringify(user.flags)), // otherwise dates can't be compared - }); + expect(user.stats.hp).to.equal(50); + expect(res.data).to.eql(user.stats); expect(res.message).to.equal(t('messageBought', {itemText: potion.text()})); }); + + it('buys a piece of gear', async () => { + let key = 'armor_warrior_1'; + + await user.post(`/user/buy/${key}`); + await user.sync(); + + expect(user.items.gear.owned).to.eql({ armor_warrior_1: true }); // eslint-disable-line camelcase + }); }); diff --git a/test/api/v3/integration/user/POST-user_buy_armoire.test.js b/test/api/v3/integration/user/POST-user_buy_armoire.test.js new file mode 100644 index 0000000000..7538be64b8 --- /dev/null +++ b/test/api/v3/integration/user/POST-user_buy_armoire.test.js @@ -0,0 +1,44 @@ +import { + generateUser, + translate as t, +} from '../../../../helpers/api-integration/v3'; +import shared from '../../../../../common/script'; + +let content = shared.content; + +describe('POST /user/buy-armoire', () => { + let user; + + beforeEach(async () => { + user = await generateUser({ + 'stats.hp': 40, + }); + }); + + // More tests in common code unit tests + + it('returns an error if user does not have enough gold', async () => { + await expect(user.post('/user/buy-potion')) + .to.eventually.be.rejected.and.eql({ + code: 401, + error: 'NotAuthorized', + message: t('messageNotEnoughGold'), + }); + }); + + xit('buys a piece of armoire', async () => { + await user.update({ + 'stats.gp': 400, + }); + + let potion = content.potion; + let res = await user.post('/user/buy-potion'); + await user.sync(); + + expect(user.stats.hp).to.equal(50); + expect(res.data).to.eql({ + stats: user.stats, + }); + expect(res.message).to.equal(t('messageBought', {itemText: potion.text()})); + }); +}); diff --git a/test/api/v3/integration/user/POST-user_buy_gear.test.js b/test/api/v3/integration/user/POST-user_buy_gear.test.js new file mode 100644 index 0000000000..5347b94da9 --- /dev/null +++ b/test/api/v3/integration/user/POST-user_buy_gear.test.js @@ -0,0 +1,34 @@ +import { + generateUser, + translate as t, +} from '../../../../helpers/api-integration/v3'; + +describe('POST /user/buy-gear/:key', () => { + let user; + + beforeEach(async () => { + user = await generateUser({ + 'stats.gp': 400, + }); + }); + + // More tests in common code unit tests + + it('returns an error if the item is not found', async () => { + await expect(user.post('/user/buy-gear/notExisting')) + .to.eventually.be.rejected.and.eql({ + code: 404, + error: 'NotFound', + message: t('itemNotFound', {key: 'notExisting'}), + }); + }); + + it('buys a piece of gear', async () => { + let key = 'armor_warrior_1'; + + await user.post(`/user/buy-gear/${key}`); + await user.sync(); + + expect(user.items.gear.owned).to.eql({ armor_warrior_1: true }); // eslint-disable-line camelcase + }); +}); diff --git a/test/api/v3/integration/user/POST-user_buy_mystery_set.test.js b/test/api/v3/integration/user/POST-user_buy_mystery_set.test.js index 306f1e6677..da7116d732 100644 --- a/test/api/v3/integration/user/POST-user_buy_mystery_set.test.js +++ b/test/api/v3/integration/user/POST-user_buy_mystery_set.test.js @@ -31,11 +31,7 @@ describe('POST /user/buy-mystery-set/:key', () => { expect(res.data).to.eql({ items: JSON.parse(JSON.stringify(user.items)), // otherwise dates can't be compared - purchased: { - plan: { - consecutive: user.purchased.plan.consecutive, - }, - }, + purchasedPlanConsecutive: user.purchased.plan.consecutive, }); expect(res.message).to.equal(t('hourglassPurchaseSet')); }); diff --git a/test/api/v3/integration/user/POST-user_buy_potion.test.js b/test/api/v3/integration/user/POST-user_buy_potion.test.js new file mode 100644 index 0000000000..e37f908e3e --- /dev/null +++ b/test/api/v3/integration/user/POST-user_buy_potion.test.js @@ -0,0 +1,42 @@ +import { + generateUser, + translate as t, +} from '../../../../helpers/api-integration/v3'; +import shared from '../../../../../common/script'; + +let content = shared.content; + +describe('POST /user/buy-potion', () => { + let user; + + beforeEach(async () => { + user = await generateUser({ + 'stats.hp': 40, + }); + }); + + // More tests in common code unit tests + + it('returns an error if user does not have enough gold', async () => { + await expect(user.post('/user/buy-potion')) + .to.eventually.be.rejected.and.eql({ + code: 401, + error: 'NotAuthorized', + message: t('messageNotEnoughGold'), + }); + }); + + it('buys a potion', async () => { + await user.update({ + 'stats.gp': 400, + }); + + let potion = content.potion; + let res = await user.post('/user/buy-potion'); + await user.sync(); + + expect(user.stats.hp).to.equal(50); + expect(res.data).to.eql(user.stats); + expect(res.message).to.equal(t('messageBought', {itemText: potion.text()})); + }); +}); diff --git a/test/api/v3/integration/user/POST-user_change-class.test.js b/test/api/v3/integration/user/POST-user_change-class.test.js index a849ca9382..d4b4192f23 100644 --- a/test/api/v3/integration/user/POST-user_change-class.test.js +++ b/test/api/v3/integration/user/POST-user_change-class.test.js @@ -18,13 +18,13 @@ describe('POST /user/change-class', () => { let res = await user.post('/user/change-class?class=rogue'); await user.sync(); - expect(res).to.eql({ - data: JSON.parse(JSON.stringify({ + expect(res).to.eql(JSON.parse( + JSON.stringify({ preferences: user.preferences, stats: user.stats, flags: user.flags, items: user.items, - })), - }); + }) + )); }); }); diff --git a/test/api/v3/integration/user/POST-user_disable-classes.test.js b/test/api/v3/integration/user/POST-user_disable-classes.test.js index 3c0a88a3ab..0632a8adc7 100644 --- a/test/api/v3/integration/user/POST-user_disable-classes.test.js +++ b/test/api/v3/integration/user/POST-user_disable-classes.test.js @@ -15,12 +15,12 @@ describe('POST /user/disable-classes', () => { let res = await user.post('/user/disable-classes'); await user.sync(); - expect(res).to.eql({ - data: JSON.parse(JSON.stringify({ + expect(res).to.eql(JSON.parse( + JSON.stringify({ preferences: user.preferences, stats: user.stats, flags: user.flags, - })), - }); + }) + )); }); }); diff --git a/test/api/v3/integration/user/POST-user_equip_type_key.test.js b/test/api/v3/integration/user/POST-user_equip_type_key.test.js index f1d697cda7..c5cde777df 100644 --- a/test/api/v3/integration/user/POST-user_equip_type_key.test.js +++ b/test/api/v3/integration/user/POST-user_equip_type_key.test.js @@ -35,8 +35,6 @@ describe('POST /user/equip/:type/:key', () => { let res = await user.post('/user/equip/equipped/weapon_warrior_2'); await user.sync(); - expect(res).to.eql({ - data: JSON.parse(JSON.stringify(user.items)), - }); + expect(res).to.eql(JSON.parse(JSON.stringify(user.items))); }); }); diff --git a/test/api/v3/integration/user/POST-user_sleep.test.js b/test/api/v3/integration/user/POST-user_sleep.test.js index da95ae97b0..0e9773150e 100644 --- a/test/api/v3/integration/user/POST-user_sleep.test.js +++ b/test/api/v3/integration/user/POST-user_sleep.test.js @@ -13,16 +13,12 @@ describe('POST /user/sleep', () => { it('toggles sleep status', async () => { let res = await user.post('/user/sleep'); - expect(res).to.eql({ - preferences: {sleep: true}, - }); + expect(res).to.eql(true); await user.sync(); expect(user.preferences.sleep).to.be.true; let res2 = await user.post('/user/sleep'); - expect(res2).to.eql({ - preferences: {sleep: false}, - }); + expect(res2).to.eql(false); await user.sync(); expect(user.preferences.sleep).to.be.false; }); diff --git a/test/api/v3/integration/user/auth/POST-user_reset_password.test.js b/test/api/v3/integration/user/auth/POST-user_reset_password.test.js index 6116f67a35..773d199db6 100644 --- a/test/api/v3/integration/user/auth/POST-user_reset_password.test.js +++ b/test/api/v3/integration/user/auth/POST-user_reset_password.test.js @@ -16,7 +16,7 @@ describe('POST /user/reset-password', async () => { let response = await user.post(endpoint, { email: user.auth.local.email, }); - expect(response).to.eql({ message: t('passwordReset') }); + expect(response).to.eql({ data: {}, message: t('passwordReset') }); await user.sync(); expect(user.auth.local.hashed_password).to.not.eql(previousPassword); }); @@ -25,7 +25,7 @@ describe('POST /user/reset-password', async () => { let response = await user.post(endpoint, { email: 'nonExistent@email.com', }); - expect(response).to.eql({ message: t('passwordReset') }); + expect(response).to.eql({ data: {}, message: t('passwordReset') }); }); it('errors if email is not provided', async () => { @@ -36,4 +36,3 @@ describe('POST /user/reset-password', async () => { }); }); }); - diff --git a/test/api/v3/unit/middlewares/errorHandler.test.js b/test/api/v3/unit/middlewares/errorHandler.test.js index 7c75be9f28..89ce1b7db6 100644 --- a/test/api/v3/unit/middlewares/errorHandler.test.js +++ b/test/api/v3/unit/middlewares/errorHandler.test.js @@ -38,6 +38,7 @@ describe('errorHandler', () => { expect(res.status).to.be.calledWith(500); expect(res.json).to.be.calledWith({ + success: false, error: 'InternalServerError', message: 'An unexpected error occurred.', }); @@ -54,6 +55,7 @@ describe('errorHandler', () => { expect(res.status).to.be.calledWith(400); expect(res.json).to.be.calledWith({ + success: false, error: 'Error', message: 'Error message', }); @@ -70,6 +72,7 @@ describe('errorHandler', () => { expect(res.status).to.be.calledWith(500); expect(res.json).to.be.calledWith({ + success: false, error: 'InternalServerError', message: 'An unexpected error occurred.', }); @@ -85,6 +88,7 @@ describe('errorHandler', () => { expect(res.status).to.be.calledWith(400); expect(res.json).to.be.calledWith({ + success: false, error: 'BadRequest', message: 'Bad request.', }); @@ -101,6 +105,7 @@ describe('errorHandler', () => { expect(res.status).to.be.calledWith(error.statusCode); expect(res.json).to.be.calledWith({ + success: false, error: error.name, message: error.message, }); @@ -116,6 +121,7 @@ describe('errorHandler', () => { expect(res.status).to.be.calledWith(400); expect(res.json).to.be.calledWith({ + success: false, error: 'BadRequest', message: 'Invalid request parameters.', errors: [ @@ -143,6 +149,7 @@ describe('errorHandler', () => { expect(res.status).to.be.calledWith(400); expect(res.json).to.be.calledWith({ + success: false, error: 'BadRequest', message: 'User validation failed.', errors: [ diff --git a/test/api/v3/unit/middlewares/response.js b/test/api/v3/unit/middlewares/response.js index 25916e1ef3..e46da348c0 100644 --- a/test/api/v3/unit/middlewares/response.js +++ b/test/api/v3/unit/middlewares/response.js @@ -30,7 +30,23 @@ describe('response middleware', () => { expect(res.status).to.be.calledWith(200); expect(res.json).to.be.calledWith({ - field: 1, + success: true, + data: {field: 1}, + }); + }); + + it('can be passed a third parameter to be used as optional message', () => { + responseMiddleware(req, res, next); + res.respond(200, {field: 1}, 'hello'); + + expect(res.status).to.be.calledOnce; + expect(res.json).to.be.calledOnce; + + expect(res.status).to.be.calledWith(200); + expect(res.json).to.be.calledWith({ + success: true, + data: {field: 1}, + message: 'hello', }); }); @@ -43,7 +59,8 @@ describe('response middleware', () => { expect(res.status).to.be.calledWith(403); expect(res.json).to.be.calledWith({ - field: 1, + success: false, + data: {field: 1}, }); }); }); diff --git a/test/api/v3/unit/models/challenge.test.js b/test/api/v3/unit/models/challenge.test.js index e3577a0e2a..00332761f4 100644 --- a/test/api/v3/unit/models/challenge.test.js +++ b/test/api/v3/unit/models/challenge.test.js @@ -110,7 +110,7 @@ describe('Challenge Model', () => { }; Tasks.Task.sanitize(req.body); - _.assign(task, common.ops.updateTask(task.toObject(), req)); + _.assign(task, common.ops.updateTask(task.toObject(), req)[0]); await challenge.updateTask(task); diff --git a/test/common/fns/predictableRandom.js b/test/common/fns/predictableRandom.test.js similarity index 100% rename from test/common/fns/predictableRandom.js rename to test/common/fns/predictableRandom.test.js diff --git a/test/common/fns/randomDrop.test.js b/test/common/fns/randomDrop.test.js new file mode 100644 index 0000000000..9569067ffc --- /dev/null +++ b/test/common/fns/randomDrop.test.js @@ -0,0 +1,165 @@ +// TODO disable until we can find a way to stub predictableRandom + +/* eslint-disable */ + +import randomDrop from '../../../common/script/fns/randomDrop'; +import { + generateUser, + generateTodo, + generateHabit, + generateDaily, + generateReward, +} from '../../helpers/common.helper'; +// import predictableRandom from '../../../common/script/fns/predictableRandom'; // eslint-disable +import content from '../../../common/script/content/index'; + +xdescribe('common.fns.randomDrop', () => { + let user; + let task; + let predictableRandom; + + beforeEach(() => { + user = generateUser(); + user._tmp = user._tmp ? user._tmp : {}; + task = generateTodo({ userId: user._id }); + predictableRandom = () => { + return 0.5; + }; + }); + + /** + * function signature as follows: + * randomDrop(user, modifiers) {} + * modifiers = { task, delta = null } + **/ + + it('drops an item for the user.party.quest.progress', () => { + expect(user.party.quest.progress.collect).to.eql({}); + user.party.quest.key = 'vice2'; + let collectWhat = Object.keys(content.quests[user.party.quest.key].collect)[0]; // lightCrystal + predictableRandom = () => { + return 0.0001; + }; + randomDrop(user, { task }); + expect(user.party.quest.progress.collect[collectWhat]).to.eql(1); + randomDrop(user, { task }); + expect(user.party.quest.progress.collect[collectWhat]).to.eql(2); + }); + + context('drops enabled', () => { + beforeEach(() => { + user.flags.dropsEnabled = true; + task.priority = 100000; + }); + + it('does nothing if user.items.lastDrop.count is exceeded', () => { + user.items.lastDrop.count = 100; + randomDrop(user, { task }); + expect(user._tmp).to.eql({}); + }); + + it('drops something when the task is a todo', () => { + expect(user._tmp).to.eql({}); + user.flags.dropsEnabled = true; + predictableRandom = () => { + return 0.1; + }; + randomDrop(user, { task }); + expect(user._tmp).to.not.eql({}); + }); + + it('drops something when the task is a habit', () => { + task = generateHabit({ userId: user._id }); + expect(user._tmp).to.eql({}); + user.flags.dropsEnabled = true; + predictableRandom = () => { + return 0.1; + }; + randomDrop(user, { task }); + expect(user._tmp).to.not.eql({}); + }); + + it('drops something when the task is a daily', () => { + task = generateDaily({ userId: user._id }); + expect(user._tmp).to.eql({}); + user.flags.dropsEnabled = true; + predictableRandom = () => { + return 0.1; + }; + randomDrop(user, { task }); + expect(user._tmp).to.not.eql({}); + }); + + it('drops something when the task is a reward', () => { + task = generateReward({ userId: user._id }); + expect(user._tmp).to.eql({}); + user.flags.dropsEnabled = true; + predictableRandom = () => { + return 0.1; + }; + randomDrop(user, { task }); + expect(user._tmp).to.not.eql({}); + }); + + it('drops food', () => { + predictableRandom = () => { + return 0.65; + }; + randomDrop(user, { task }); + expect(user._tmp.drop.type).to.eql('Food'); + }); + + it('drops eggs', () => { + predictableRandom = () => { + return 0.35; + }; + randomDrop(user, { task }); + expect(user._tmp.drop.type).to.eql('Egg'); + }); + + context('drops hatching potion', () => { + it('drops a very rare potion', () => { + predictableRandom = () => { + return 0.01; + }; + randomDrop(user, { task }); + expect(user._tmp.drop.type).to.eql('HatchingPotion'); + expect(user._tmp.drop.value).to.eql(5); + expect(user._tmp.drop.key).to.eql('Golden'); + }); + + it('drops a rare potion', () => { + predictableRandom = () => { + return 0.08; + }; + randomDrop(user, { task }); + expect(user._tmp.drop.type).to.eql('HatchingPotion'); + expect(user._tmp.drop.value).to.eql(4); + let acceptableDrops = ['Zombie', 'CottonCandyPink', 'CottonCandyBlue']; + expect(acceptableDrops).to.contain(user._tmp.drop.key); // deterministically 'CottonCandyBlue' + }); + + it('drops an uncommon potion', () => { + predictableRandom = () => { + return 0.17; + }; + randomDrop(user, { task }); + expect(user._tmp.drop.type).to.eql('HatchingPotion'); + expect(user._tmp.drop.value).to.eql(3); + let acceptableDrops = ['Red', 'Shade', 'Skeleton']; + expect(acceptableDrops).to.contain(user._tmp.drop.key); // always skeleton + }); + + it('drops a common potion', () => { + predictableRandom = () => { + return 0.20; + }; + randomDrop(user, { task }); + expect(user._tmp.drop.type).to.eql('HatchingPotion'); + expect(user._tmp.drop.value).to.eql(2); + let acceptableDrops = ['Base', 'White', 'Desert']; + expect(acceptableDrops).to.contain(user._tmp.drop.key); // always Desert + }); + }); + }); +}); diff --git a/test/common/ops/addPushDevice.js b/test/common/ops/addPushDevice.js index 854977b71d..535d288384 100644 --- a/test/common/ops/addPushDevice.js +++ b/test/common/ops/addPushDevice.js @@ -39,9 +39,9 @@ describe('shared.ops.addPushDevice', () => { }); it('adds a push device', () => { - let response = addPushDevice(user, {body: {regId, type}}); + let [, message] = addPushDevice(user, {body: {regId, type}}); - expect(response.message).to.equal(i18n.t('pushDeviceAdded')); + expect(message).to.equal(i18n.t('pushDeviceAdded')); expect(user.pushDevices[0].type).to.equal(type); expect(user.pushDevices[0].regId).to.equal(regId); }); diff --git a/test/common/ops/allocateNow.js b/test/common/ops/allocateNow.js index 21a7f6daf4..4fe473ec9e 100644 --- a/test/common/ops/allocateNow.js +++ b/test/common/ops/allocateNow.js @@ -18,17 +18,13 @@ describe('shared.ops.allocateNow', () => { user.stats.str = 9; user.preferences.allocationMode = 'flat'; - let res = allocateNow(user); + let [data] = allocateNow(user); expect(user.stats.points).to.equal(0); expect(user.stats.con).to.equal(9); expect(user.stats.int).to.equal(8); expect(user.stats.per).to.equal(9); expect(user.stats.str).to.equal(9); - expect(res).to.eql({ - data: { - stats: user.stats, - }, - }); + expect(data).to.eql(user.stats); }); }); diff --git a/test/common/ops/blockUser.test.js b/test/common/ops/blockUser.test.js index 01b5185ed0..950af25d0c 100644 --- a/test/common/ops/blockUser.test.js +++ b/test/common/ops/blockUser.test.js @@ -26,10 +26,10 @@ describe('shared.ops.blockUser', () => { }); it('blocks user', () => { - let result = blockUser(user, { params: { uuid: blockedUser._id } }); + let [result] = blockUser(user, { params: { uuid: blockedUser._id } }); expect(user.inbox.blocks).to.eql([blockedUser._id]); expect(result).to.eql([blockedUser._id]); - result = blockUser(user, { params: { uuid: blockedUser2._id } }); + [result] = blockUser(user, { params: { uuid: blockedUser2._id } }); expect(user.inbox.blocks).to.eql([blockedUser._id, blockedUser2._id]); expect(result).to.eql([blockedUser._id, blockedUser2._id]); }); @@ -37,7 +37,7 @@ describe('shared.ops.blockUser', () => { it('blocks, then unblocks user', () => { blockUser(user, { params: { uuid: blockedUser._id } }); expect(user.inbox.blocks).to.eql([blockedUser._id]); - let result = blockUser(user, { params: { uuid: blockedUser._id } }); + let [result] = blockUser(user, { params: { uuid: blockedUser._id } }); expect(user.inbox.blocks).to.eql([]); expect(result).to.eql([]); }); diff --git a/test/common/ops/buy.js b/test/common/ops/buy.js index b50d160623..abaf3c849d 100644 --- a/test/common/ops/buy.js +++ b/test/common/ops/buy.js @@ -1,15 +1,10 @@ /* eslint-disable camelcase */ - -import sinon from 'sinon'; // eslint-disable-line no-shadow import { generateUser, } from '../../helpers/common.helper'; -import count from '../../../common/script/count'; import buy from '../../../common/script/ops/buy'; -import shared from '../../../common/script'; -import content from '../../../common/script/content/index'; import { - NotAuthorized, + BadRequest, } from '../../../common/script/libs/errors'; import i18n from '../../../common/script/i18n'; @@ -30,277 +25,27 @@ describe('shared.ops.buy', () => { }, stats: { gp: 200 }, }); - - sinon.stub(shared.fns, 'randomVal'); - sinon.stub(shared.fns, 'predictableRandom'); }); - afterEach(() => { - shared.fns.randomVal.restore(); - shared.fns.predictableRandom.restore(); + it('returns error when key is not provided', (done) => { + try { + buy(user); + } catch (err) { + expect(err).to.be.an.instanceof(BadRequest); + expect(err.message).to.equal(i18n.t('missingKeyParam')); + done(); + } }); - context('Potion', () => { - it('recovers 15 hp', () => { - user.stats.hp = 30; - buy(user, {params: {key: 'potion'}}); - expect(user.stats.hp).to.eql(45); - }); - - it('does not increase hp above 50', () => { - user.stats.hp = 45; - buy(user, {params: {key: 'potion'}}); - expect(user.stats.hp).to.eql(50); - }); - - it('deducts 25 gp', () => { - user.stats.hp = 45; - buy(user, {params: {key: 'potion'}}); - - expect(user.stats.gp).to.eql(175); - }); - - it('does not purchase if not enough gp', (done) => { - user.stats.hp = 45; - user.stats.gp = 5; - try { - buy(user, {params: {key: 'potion'}}); - } catch (err) { - expect(err).to.be.an.instanceof(NotAuthorized); - expect(err.message).to.equal(i18n.t('messageNotEnoughGold')); - expect(user.stats.hp).to.eql(45); - expect(user.stats.gp).to.eql(5); - - done(); - } - }); + it('recovers 15 hp', () => { + user.stats.hp = 30; + buy(user, {params: {key: 'potion'}}); + expect(user.stats.hp).to.eql(45); }); - context('Gear', () => { - it('adds equipment to inventory', () => { - user.stats.gp = 31; - - buy(user, {params: {key: 'armor_warrior_1'}}); - - expect(user.items.gear.owned).to.eql({ weapon_warrior_0: true, armor_warrior_1: true }); - }); - - it('deducts gold from user', () => { - user.stats.gp = 31; - - buy(user, {params: {key: 'armor_warrior_1'}}); - - expect(user.stats.gp).to.eql(1); - }); - - it('auto equips equipment if user has auto-equip preference turned on', () => { - user.stats.gp = 31; - user.preferences.autoEquip = true; - - buy(user, {params: {key: 'armor_warrior_1'}}); - - expect(user.items.gear.equipped).to.have.property('armor', 'armor_warrior_1'); - }); - - it('buys equipment but does not auto-equip', () => { - user.stats.gp = 31; - user.preferences.autoEquip = false; - - buy(user, {params: {key: 'armor_warrior_1'}}); - - expect(user.items.gear.equipped.property).to.not.equal('armor_warrior_1'); - }); - - // TODO after user.ops.equip is done - xit('removes one-handed weapon and shield if auto-equip is on and a two-hander is bought', () => { - user.stats.gp = 100; - user.preferences.autoEquip = true; - buy(user, {params: {key: 'shield_warrior_1'}}); - user.ops.equip({params: {key: 'shield_warrior_1'}}); - buy(user, {params: {key: 'weapon_warrior_1'}}); - user.ops.equip({params: {key: 'weapon_warrior_1'}}); - - buy(user, {params: {key: 'weapon_wizard_1'}}); - - expect(user.items.gear.equipped).to.have.property('shield', 'shield_base_0'); - expect(user.items.gear.equipped).to.have.property('weapon', 'weapon_wizard_1'); - }); - - // TODO after user.ops.equip is done - xit('buys two-handed equipment but does not automatically remove sword or shield', () => { - user.stats.gp = 100; - user.preferences.autoEquip = false; - buy(user, {params: {key: 'shield_warrior_1'}}); - user.ops.equip({params: {key: 'shield_warrior_1'}}); - buy(user, {params: {key: 'weapon_warrior_1'}}); - user.ops.equip({params: {key: 'weapon_warrior_1'}}); - - buy(user, {params: {key: 'weapon_wizard_1'}}); - - expect(user.items.gear.equipped).to.have.property('shield', 'shield_warrior_1'); - expect(user.items.gear.equipped).to.have.property('weapon', 'weapon_warrior_1'); - }); - - it('does not buy equipment without enough Gold', (done) => { - user.stats.gp = 20; - - try { - buy(user, {params: {key: 'armor_warrior_1'}}); - } catch (err) { - expect(err).to.be.an.instanceof(NotAuthorized); - expect(err.message).to.equal(i18n.t('messageNotEnoughGold')); - expect(user.items.gear.owned).to.not.have.property('armor_warrior_1'); - done(); - } - }); - }); - - context('Enchanted Armoire', () => { - let YIELD_EQUIPMENT = 0.5; - let YIELD_FOOD = 0.7; - let YIELD_EXP = 0.9; - - let fullArmoire = {}; - - _(content.gearTypes).each((type) => { - _(content.gear.tree[type].armoire).each((gearObject) => { - let armoireKey = gearObject.key; - - fullArmoire[armoireKey] = true; - }).value(); - }).value(); - - beforeEach(() => { - user.achievements.ultimateGearSets = { rogue: true }; - user.flags.armoireOpened = true; - user.stats.exp = 0; - user.items.food = {}; - }); - - context('failure conditions', () => { - it('does not open if user does not have enough gold', (done) => { - shared.fns.predictableRandom.returns(YIELD_EQUIPMENT); - user.stats.gp = 50; - - try { - buy(user, {params: {key: 'armoire'}}); - } catch (err) { - expect(err).to.be.an.instanceof(NotAuthorized); - expect(err.message).to.equal(i18n.t('messageNotEnoughGold')); - expect(user.items.gear.owned).to.eql({weapon_warrior_0: true}); - expect(user.items.food).to.be.empty; - expect(user.stats.exp).to.eql(0); - done(); - } - }); - - it('does not open without Ultimate Gear achievement', (done) => { - shared.fns.predictableRandom.returns(YIELD_EQUIPMENT); - user.achievements.ultimateGearSets = {healer: false, wizard: false, rogue: false, warrior: false}; - - try { - buy(user, {params: {key: 'armoire'}}); - } catch (err) { - expect(err).to.be.an.instanceof(NotAuthorized); - expect(err.message).to.equal(i18n.t('cannoyBuyItem')); - expect(user.items.gear.owned).to.eql({weapon_warrior_0: true}); - expect(user.items.food).to.be.empty; - expect(user.stats.exp).to.eql(0); - done(); - } - }); - }); - - context('non-gear awards', () => { - // Skipped because can't stub predictableRandom correctly - xit('gives Experience', () => { - shared.fns.predictableRandom.returns(YIELD_EXP); - - buy(user, {params: {key: 'armoire'}}); - - expect(user.items.gear.owned).to.eql({weapon_warrior_0: true}); - expect(user.items.food).to.be.empty; - expect(user.stats.exp).to.eql(46); - expect(user.stats.gp).to.eql(100); - }); - - // Skipped because can't stub predictableRandom correctly - xit('gives food', () => { - let honey = content.food.Honey; - - shared.fns.randomVal.returns(honey); - shared.fns.predictableRandom.returns(YIELD_FOOD); - - buy(user, {params: {key: 'armoire'}}); - - expect(user.items.gear.owned).to.eql({weapon_warrior_0: true}); - expect(user.items.food).to.eql({Honey: 1}); - expect(user.stats.exp).to.eql(0); - expect(user.stats.gp).to.eql(100); - }); - - // Skipped because can't stub predictableRandom correctly - xit('does not give equipment if all equipment has been found', () => { - shared.fns.predictableRandom.returns(YIELD_EQUIPMENT); - user.items.gear.owned = fullArmoire; - user.stats.gp = 150; - - buy(user, {params: {key: 'armoire'}}); - - expect(user.items.gear.owned).to.eql(fullArmoire); - let armoireCount = count.remainingGearInSet(user.items.gear.owned, 'armoire'); - - expect(armoireCount).to.eql(0); - - expect(user.stats.exp).to.eql(30); - expect(user.stats.gp).to.eql(50); - }); - }); - - context('gear awards', () => { - beforeEach(() => { - let shield = content.gear.tree.shield.armoire.gladiatorShield; - - shared.fns.randomVal.returns(shield); - }); - - // Skipped because can't stub predictableRandom correctly - xit('always drops equipment the first time', () => { - delete user.flags.armoireOpened; - shared.fns.predictableRandom.returns(YIELD_EXP); - - buy(user, {params: {key: 'armoire'}}); - - expect(user.items.gear.owned).to.eql({ - weapon_warrior_0: true, - shield_armoire_gladiatorShield: true, - }); - - let armoireCount = count.remainingGearInSet(user.items.gear.owned, 'armoire'); - - expect(armoireCount).to.eql(_.size(fullArmoire) - 1); - expect(user.items.food).to.be.empty; - expect(user.stats.exp).to.eql(0); - expect(user.stats.gp).to.eql(100); - }); - - // Skipped because can't stub predictableRandom correctly - xit('gives more equipment', () => { - shared.fns.predictableRandom.returns(YIELD_EQUIPMENT); - user.items.gear.owned = { - weapon_warrior_0: true, - head_armoire_hornedIronHelm: true, - }; - user.stats.gp = 200; - - buy(user, {params: {key: 'armoire'}}); - - expect(user.items.gear.owned).to.eql({weapon_warrior_0: true, shield_armoire_gladiatorShield: true, head_armoire_hornedIronHelm: true}); - let armoireCount = count.remainingGearInSet(user.items.gear.owned, 'armoire'); - - expect(armoireCount).to.eql(_.size(fullArmoire) - 2); - expect(user.stats.gp).to.eql(100); - }); - }); + it('adds equipment to inventory', () => { + user.stats.gp = 31; + buy(user, {params: {key: 'armor_warrior_1'}}); + expect(user.items.gear.owned).to.eql({ weapon_warrior_0: true, armor_warrior_1: true }); }); }); diff --git a/test/common/ops/buyArmoire.js b/test/common/ops/buyArmoire.js new file mode 100644 index 0000000000..2c71c9b428 --- /dev/null +++ b/test/common/ops/buyArmoire.js @@ -0,0 +1,187 @@ +/* eslint-disable camelcase */ + +import sinon from 'sinon'; // eslint-disable-line no-shadow +import { + generateUser, +} from '../../helpers/common.helper'; +import count from '../../../common/script/count'; +import buyArmoire from '../../../common/script/ops/buyArmoire'; +import shared from '../../../common/script'; +import content from '../../../common/script/content/index'; +import { + NotAuthorized, +} from '../../../common/script/libs/errors'; +import i18n from '../../../common/script/i18n'; + +describe('shared.ops.buyArmoire', () => { + let user; + let YIELD_EQUIPMENT = 0.5; + let YIELD_FOOD = 0.7; + let YIELD_EXP = 0.9; + + let fullArmoire = {}; + + _(content.gearTypes).each((type) => { + _(content.gear.tree[type].armoire).each((gearObject) => { + let armoireKey = gearObject.key; + + fullArmoire[armoireKey] = true; + }).value(); + }).value(); + + + beforeEach(() => { + user = generateUser({ + items: { + gear: { + owned: { + weapon_warrior_0: true, + }, + equipped: { + weapon_warrior_0: true, + }, + }, + }, + stats: { gp: 200 }, + }); + + user.achievements.ultimateGearSets = { rogue: true }; + user.flags.armoireOpened = true; + user.stats.exp = 0; + user.items.food = {}; + + sinon.stub(shared.fns, 'randomVal'); + sinon.stub(shared.fns, 'predictableRandom'); + }); + + afterEach(() => { + shared.fns.randomVal.restore(); + shared.fns.predictableRandom.restore(); + }); + + context('failure conditions', () => { + it('does not open if user does not have enough gold', (done) => { + shared.fns.predictableRandom.returns(YIELD_EQUIPMENT); + user.stats.gp = 50; + + try { + buyArmoire(user); + } catch (err) { + expect(err).to.be.an.instanceof(NotAuthorized); + expect(err.message).to.equal(i18n.t('messageNotEnoughGold')); + expect(user.items.gear.owned).to.eql({weapon_warrior_0: true}); + expect(user.items.food).to.be.empty; + expect(user.stats.exp).to.eql(0); + done(); + } + }); + + it('does not open without Ultimate Gear achievement', (done) => { + shared.fns.predictableRandom.returns(YIELD_EQUIPMENT); + user.achievements.ultimateGearSets = {healer: false, wizard: false, rogue: false, warrior: false}; + + try { + buyArmoire(user); + } catch (err) { + expect(err).to.be.an.instanceof(NotAuthorized); + expect(err.message).to.equal(i18n.t('cannotBuyItem')); + expect(user.items.gear.owned).to.eql({weapon_warrior_0: true}); + expect(user.items.food).to.be.empty; + expect(user.stats.exp).to.eql(0); + done(); + } + }); + }); + + context('non-gear awards', () => { + // Skipped because can't stub predictableRandom correctly + xit('gives Experience', () => { + shared.fns.predictableRandom.returns(YIELD_EXP); + + buyArmoire(user); + + expect(user.items.gear.owned).to.eql({weapon_warrior_0: true}); + expect(user.items.food).to.be.empty; + expect(user.stats.exp).to.eql(46); + expect(user.stats.gp).to.eql(100); + }); + + // Skipped because can't stub predictableRandom correctly + xit('gives food', () => { + let honey = content.food.Honey; + + shared.fns.randomVal.returns(honey); + shared.fns.predictableRandom.returns(YIELD_FOOD); + + buyArmoire(user); + + expect(user.items.gear.owned).to.eql({weapon_warrior_0: true}); + expect(user.items.food).to.eql({Honey: 1}); + expect(user.stats.exp).to.eql(0); + expect(user.stats.gp).to.eql(100); + }); + + // Skipped because can't stub predictableRandom correctly + xit('does not give equipment if all equipment has been found', () => { + shared.fns.predictableRandom.returns(YIELD_EQUIPMENT); + user.items.gear.owned = fullArmoire; + user.stats.gp = 150; + + buyArmoire(user); + + expect(user.items.gear.owned).to.eql(fullArmoire); + let armoireCount = count.remainingGearInSet(user.items.gear.owned, 'armoire'); + + expect(armoireCount).to.eql(0); + + expect(user.stats.exp).to.eql(30); + expect(user.stats.gp).to.eql(50); + }); + }); + + context('gear awards', () => { + beforeEach(() => { + let shield = content.gear.tree.shield.armoire.gladiatorShield; + + shared.fns.randomVal.returns(shield); + }); + + // Skipped because can't stub predictableRandom correctly + xit('always drops equipment the first time', () => { + delete user.flags.armoireOpened; + shared.fns.predictableRandom.returns(YIELD_EXP); + + buyArmoire(user); + + expect(user.items.gear.owned).to.eql({ + weapon_warrior_0: true, + shield_armoire_gladiatorShield: true, + }); + + let armoireCount = count.remainingGearInSet(user.items.gear.owned, 'armoire'); + + expect(armoireCount).to.eql(_.size(fullArmoire) - 1); + expect(user.items.food).to.be.empty; + expect(user.stats.exp).to.eql(0); + expect(user.stats.gp).to.eql(100); + }); + + // Skipped because can't stub predictableRandom correctly + xit('gives more equipment', () => { + shared.fns.predictableRandom.returns(YIELD_EQUIPMENT); + user.items.gear.owned = { + weapon_warrior_0: true, + head_armoire_hornedIronHelm: true, + }; + user.stats.gp = 200; + + buyArmoire(user); + + expect(user.items.gear.owned).to.eql({weapon_warrior_0: true, shield_armoire_gladiatorShield: true, head_armoire_hornedIronHelm: true}); + let armoireCount = count.remainingGearInSet(user.items.gear.owned, 'armoire'); + + expect(armoireCount).to.eql(_.size(fullArmoire) - 2); + expect(user.stats.gp).to.eql(100); + }); + }); +}); diff --git a/test/common/ops/buyGear.js b/test/common/ops/buyGear.js new file mode 100644 index 0000000000..fc26057ef8 --- /dev/null +++ b/test/common/ops/buyGear.js @@ -0,0 +1,132 @@ +/* eslint-disable camelcase */ + +import sinon from 'sinon'; // eslint-disable-line no-shadow +import { + generateUser, +} from '../../helpers/common.helper'; +import buyGear from '../../../common/script/ops/buyGear'; +import shared from '../../../common/script'; +import { + NotAuthorized, +} from '../../../common/script/libs/errors'; +import i18n from '../../../common/script/i18n'; + +describe('shared.ops.buyGear', () => { + let user; + + beforeEach(() => { + user = generateUser({ + items: { + gear: { + owned: { + weapon_warrior_0: true, + }, + equipped: { + weapon_warrior_0: true, + }, + }, + }, + stats: { gp: 200 }, + }); + + sinon.stub(shared.fns, 'randomVal'); + sinon.stub(shared.fns, 'predictableRandom'); + }); + + afterEach(() => { + shared.fns.randomVal.restore(); + shared.fns.predictableRandom.restore(); + }); + + context('Gear', () => { + it('adds equipment to inventory', () => { + user.stats.gp = 31; + + buyGear(user, {params: {key: 'armor_warrior_1'}}); + + expect(user.items.gear.owned).to.eql({ weapon_warrior_0: true, armor_warrior_1: true }); + }); + + it('deducts gold from user', () => { + user.stats.gp = 31; + + buyGear(user, {params: {key: 'armor_warrior_1'}}); + + expect(user.stats.gp).to.eql(1); + }); + + it('auto equips equipment if user has auto-equip preference turned on', () => { + user.stats.gp = 31; + user.preferences.autoEquip = true; + + buyGear(user, {params: {key: 'armor_warrior_1'}}); + + expect(user.items.gear.equipped).to.have.property('armor', 'armor_warrior_1'); + }); + + it('buyGears equipment but does not auto-equip', () => { + user.stats.gp = 31; + user.preferences.autoEquip = false; + + buyGear(user, {params: {key: 'armor_warrior_1'}}); + + expect(user.items.gear.equipped.property).to.not.equal('armor_warrior_1'); + }); + + it('does not buyGear equipment twice', (done) => { + user.stats.gp = 62; + buyGear(user, {params: {key: 'armor_warrior_1'}}); + + try { + buyGear(user, {params: {key: 'armor_warrior_1'}}); + } catch (err) { + expect(err).to.be.an.instanceof(NotAuthorized); + expect(err.message).to.equal(i18n.t('equipmentAlreadyOwned')); + done(); + } + }); + + // TODO after user.ops.equip is done + xit('removes one-handed weapon and shield if auto-equip is on and a two-hander is bought', () => { + user.stats.gp = 100; + user.preferences.autoEquip = true; + buyGear(user, {params: {key: 'shield_warrior_1'}}); + user.ops.equip({params: {key: 'shield_warrior_1'}}); + buyGear(user, {params: {key: 'weapon_warrior_1'}}); + user.ops.equip({params: {key: 'weapon_warrior_1'}}); + + buyGear(user, {params: {key: 'weapon_wizard_1'}}); + + expect(user.items.gear.equipped).to.have.property('shield', 'shield_base_0'); + expect(user.items.gear.equipped).to.have.property('weapon', 'weapon_wizard_1'); + }); + + // TODO after user.ops.equip is done + xit('buyGears two-handed equipment but does not automatically remove sword or shield', () => { + user.stats.gp = 100; + user.preferences.autoEquip = false; + buyGear(user, {params: {key: 'shield_warrior_1'}}); + user.ops.equip({params: {key: 'shield_warrior_1'}}); + buyGear(user, {params: {key: 'weapon_warrior_1'}}); + user.ops.equip({params: {key: 'weapon_warrior_1'}}); + + buyGear(user, {params: {key: 'weapon_wizard_1'}}); + + expect(user.items.gear.equipped).to.have.property('shield', 'shield_warrior_1'); + expect(user.items.gear.equipped).to.have.property('weapon', 'weapon_warrior_1'); + }); + + it('does not buyGear equipment without enough Gold', (done) => { + user.stats.gp = 20; + + try { + buyGear(user, {params: {key: 'armor_warrior_1'}}); + } catch (err) { + expect(err).to.be.an.instanceof(NotAuthorized); + expect(err.message).to.equal(i18n.t('messageNotEnoughGold')); + expect(user.items.gear.owned).to.not.have.property('armor_warrior_1'); + done(); + } + }); + }); +}); diff --git a/test/common/ops/buyPotion.js b/test/common/ops/buyPotion.js new file mode 100644 index 0000000000..5230040a35 --- /dev/null +++ b/test/common/ops/buyPotion.js @@ -0,0 +1,65 @@ +/* eslint-disable camelcase */ +import { + generateUser, +} from '../../helpers/common.helper'; +import buyPotion from '../../../common/script/ops/buyPotion'; +import { + NotAuthorized, +} from '../../../common/script/libs/errors'; +import i18n from '../../../common/script/i18n'; + +describe('shared.ops.buyPotion', () => { + let user; + + beforeEach(() => { + user = generateUser({ + items: { + gear: { + owned: { + weapon_warrior_0: true, + }, + equipped: { + weapon_warrior_0: true, + }, + }, + }, + stats: { gp: 200 }, + }); + }); + + context('Potion', () => { + it('recovers 15 hp', () => { + user.stats.hp = 30; + buyPotion(user); + expect(user.stats.hp).to.eql(45); + }); + + it('does not increase hp above 50', () => { + user.stats.hp = 45; + buyPotion(user); + expect(user.stats.hp).to.eql(50); + }); + + it('deducts 25 gp', () => { + user.stats.hp = 45; + buyPotion(user); + + expect(user.stats.gp).to.eql(175); + }); + + it('does not purchase if not enough gp', (done) => { + user.stats.hp = 45; + user.stats.gp = 5; + try { + buyPotion(user); + } catch (err) { + expect(err).to.be.an.instanceof(NotAuthorized); + expect(err.message).to.equal(i18n.t('messageNotEnoughGold')); + expect(user.stats.hp).to.eql(45); + expect(user.stats.gp).to.eql(5); + + done(); + } + }); + }); +}); diff --git a/test/common/ops/buySpecialSpell.js b/test/common/ops/buySpecialSpell.js index f688f4d3d4..249f4bc8a6 100644 --- a/test/common/ops/buySpecialSpell.js +++ b/test/common/ops/buySpecialSpell.js @@ -60,7 +60,7 @@ describe('shared.ops.buySpecialSpell', () => { user.stats.gp = 11; let item = content.special.thankyou; - let res = buySpecialSpell(user, { + let [data, message] = buySpecialSpell(user, { params: { key: 'thankyou', }, @@ -68,11 +68,11 @@ describe('shared.ops.buySpecialSpell', () => { expect(user.stats.gp).to.equal(1); expect(user.items.special.thankyou).to.equal(1); - expect(res.data).to.eql({ + expect(data).to.eql({ items: user.items, stats: user.stats, }); - expect(res.message).to.equal(i18n.t('messageBought', { + expect(message).to.equal(i18n.t('messageBought', { itemText: item.text(), })); }); diff --git a/test/common/ops/changeClass.js b/test/common/ops/changeClass.js index 498dde18f2..ae4a180178 100644 --- a/test/common/ops/changeClass.js +++ b/test/common/ops/changeClass.js @@ -46,14 +46,12 @@ describe('shared.ops.changeClass', () => { user.stats.class = 'healer'; user.items.gear.owned.armor_rogue_1 = true; // eslint-disable-line camelcase - let res = changeClass(user, {query: {class: 'rogue'}}); - expect(res).to.eql({ - data: { - preferences: user.preferences, - stats: user.stats, - flags: user.flags, - items: user.items, - }, + let [data] = changeClass(user, {query: {class: 'rogue'}}); + expect(data).to.eql({ + preferences: user.preferences, + stats: user.stats, + flags: user.flags, + items: user.items, }); expect(user.stats.class).to.equal('rogue'); @@ -80,14 +78,12 @@ describe('shared.ops.changeClass', () => { user.stats.int = 4; user.flags.classSelected = true; - let res = changeClass(user); - expect(res).to.eql({ - data: { - preferences: user.preferences, - stats: user.stats, - flags: user.flags, - items: user.items, - }, + let [data] = changeClass(user); + expect(data).to.eql({ + preferences: user.preferences, + stats: user.stats, + flags: user.flags, + items: user.items, }); expect(user.preferences.disableClasses).to.be.false; @@ -122,14 +118,12 @@ describe('shared.ops.changeClass', () => { user.stats.int = 4; user.flags.classSelected = true; - let res = changeClass(user); - expect(res).to.eql({ - data: { - preferences: user.preferences, - stats: user.stats, - flags: user.flags, - items: user.items, - }, + let [data] = changeClass(user); + expect(data).to.eql({ + preferences: user.preferences, + stats: user.stats, + flags: user.flags, + items: user.items, }); expect(user.balance).to.equal(0.25); diff --git a/test/common/ops/clearPMs.test.js b/test/common/ops/clearPMs.test.js index a2ff2a7a0b..cf1408e5a6 100644 --- a/test/common/ops/clearPMs.test.js +++ b/test/common/ops/clearPMs.test.js @@ -13,7 +13,7 @@ describe('shared.ops.clearPMs', () => { it('clears messages', () => { expect(user.inbox.messages).to.not.eql({}); - let result = clearPMs(user); + let [result] = clearPMs(user); expect(user.inbox.messages).to.eql({}); expect(result).to.eql({}); }); diff --git a/test/common/ops/deletePM.test.js b/test/common/ops/deletePM.test.js index 472bede6a3..109595eca9 100644 --- a/test/common/ops/deletePM.test.js +++ b/test/common/ops/deletePM.test.js @@ -3,7 +3,7 @@ import { generateUser, } from '../../helpers/common.helper'; -describe('shared.ops.clearPMs', () => { +describe('shared.ops.deletePM', () => { let user; beforeEach(() => { @@ -13,7 +13,7 @@ describe('shared.ops.clearPMs', () => { it('delete message', () => { expect(user.inbox.messages).to.not.eql({ second: 'message' }); - let response = deletePM(user, { params: { id: 'first' } }); + let [response] = deletePM(user, { params: { id: 'first' } }); expect(user.inbox.messages).to.eql({ second: 'message' }); expect(response).to.eql({ second: 'message' }); }); diff --git a/test/common/ops/deleteWebhook.test.js b/test/common/ops/deleteWebhook.test.js index e72bf22269..8e27a09e3e 100644 --- a/test/common/ops/deleteWebhook.test.js +++ b/test/common/ops/deleteWebhook.test.js @@ -14,8 +14,8 @@ describe('shared.ops.deleteWebhook', () => { it('succeeds', () => { user.preferences.webhooks = { 'some-id': {}, 'another-id': {} }; - let res = deleteWebhook(user, req); + let [data] = deleteWebhook(user, req); expect(user.preferences.webhooks).to.eql({'another-id': {}}); - expect(res).to.equal(user.preferences.webhooks); + expect(data).to.equal(user.preferences.webhooks); }); }); diff --git a/test/common/ops/disableClasses.js b/test/common/ops/disableClasses.js index 59f0643c65..81ac1a9792 100644 --- a/test/common/ops/disableClasses.js +++ b/test/common/ops/disableClasses.js @@ -18,13 +18,11 @@ describe('shared.ops.disableClasses', () => { user.preferences.autoAllocate = false; user.stats.points = 2; - let res = disableClasses(user); - expect(res).to.eql({ - data: { - preferences: user.preferences, - stats: user.stats, - flags: user.flags, - }, + let [data] = disableClasses(user); + expect(data).to.eql({ + preferences: user.preferences, + stats: user.stats, + flags: user.flags, }); expect(user.stats.class).to.equal('warrior'); diff --git a/test/common/ops/equip.js b/test/common/ops/equip.js index 77110f7f40..8641aa102e 100644 --- a/test/common/ops/equip.js +++ b/test/common/ops/equip.js @@ -37,20 +37,20 @@ describe('shared.ops.equip', () => { equip(user, {params: {key: 'weapon_warrior_1'}}); // one-handed to one-handed - let res = equip(user, {params: {key: 'weapon_warrior_2'}}); - expect(res.message).to.not.exists; + let [, message] = equip(user, {params: {key: 'weapon_warrior_2'}}); + expect(message).to.not.exists; // one-handed to two-handed - res = equip(user, {params: {key: 'weapon_wizard_1'}}); - expect(res.message).to.not.exists; + [, message] = equip(user, {params: {key: 'weapon_wizard_1'}}); + expect(message).to.not.exists; // two-handed to two-handed - res = equip(user, {params: {key: 'weapon_wizard_2'}}); - expect(res.message).to.not.exists; + [, message] = equip(user, {params: {key: 'weapon_wizard_2'}}); + expect(message).to.not.exists; // two-handed to one-handed - res = equip(user, {params: {key: 'weapon_warrior_2'}}); - expect(res.message).to.not.exists; + [, message] = equip(user, {params: {key: 'weapon_warrior_2'}}); + expect(message).to.not.exists; }); it('should send messages if equipping a two-hander causes the off-hander to be unequipped', () => { @@ -58,10 +58,11 @@ describe('shared.ops.equip', () => { equip(user, {params: {key: 'shield_warrior_1'}}); // equipping two-hander - let res = equip(user, {params: {key: 'weapon_wizard_1'}}); + let [data, message] = equip(user, {params: {key: 'weapon_wizard_1'}}); let weapon = content.gear.flat.weapon_wizard_1; let item = content.gear.flat.shield_warrior_1; + let res = {data, message}; expect(res).to.eql({ message: i18n.t('messageTwoHandedEquip', {twoHandedText: weapon.text(), offHandedText: item.text()}), data: user.items, @@ -74,8 +75,9 @@ describe('shared.ops.equip', () => { let weapon = content.gear.flat.weapon_wizard_1; let shield = content.gear.flat.shield_warrior_1; - let res = equip(user, {params: {key: 'shield_warrior_1'}}); + let [data, message] = equip(user, {params: {key: 'shield_warrior_1'}}); + let res = {data, message}; expect(res).to.eql({ message: i18n.t('messageTwoHandedUnequip', {twoHandedText: weapon.text(), offHandedText: shield.text()}), data: user.items, diff --git a/test/common/ops/feed.js b/test/common/ops/feed.js index 40d28169c4..0b726f5ec7 100644 --- a/test/common/ops/feed.js +++ b/test/common/ops/feed.js @@ -105,16 +105,14 @@ describe('shared.ops.feed', () => { let potionText = content.hatchingPotions[potion] ? content.hatchingPotions[potion].text() : potion; let eggText = content.eggs[egg] ? content.eggs[egg].text() : egg; - let res = feed(user, {params: {pet: 'Wolf-Base', food: 'Saddle'}}); - expect(res).to.eql({ - data: user.items.pets['Wolf-Base'], - message: i18n.t('messageEvolve', { - egg: i18n.t('petName', { - potion: potionText, - egg: eggText, - }), + let [data, message] = feed(user, {params: {pet: 'Wolf-Base', food: 'Saddle'}}); + expect(data).to.eql(user.items.pets['Wolf-Base']); + expect(message).to.eql(i18n.t('messageEvolve', { + egg: i18n.t('petName', { + potion: potionText, + egg: eggText, }), - }); + })); expect(user.items.food.Saddle).to.equal(1); expect(user.items.pets['Wolf-Base']).to.equal(-1); @@ -131,17 +129,15 @@ describe('shared.ops.feed', () => { let potionText = content.hatchingPotions[potion] ? content.hatchingPotions[potion].text() : potion; let eggText = content.eggs[egg] ? content.eggs[egg].text() : egg; - let res = feed(user, {params: {pet: 'Wolf-Base', food: 'Meat'}}); - expect(res).to.eql({ - data: user.items.pets['Wolf-Base'], - message: i18n.t('messageLikesFood', { - egg: i18n.t('petName', { - potion: potionText, - egg: eggText, - }), - foodText: food.text(), + let [data, message] = feed(user, {params: {pet: 'Wolf-Base', food: 'Meat'}}); + expect(data).to.eql(user.items.pets['Wolf-Base']); + expect(message).to.eql(i18n.t('messageLikesFood', { + egg: i18n.t('petName', { + potion: potionText, + egg: eggText, }), - }); + foodText: food.text(), + })); expect(user.items.food.Meat).to.equal(1); expect(user.items.pets['Wolf-Base']).to.equal(10); @@ -156,17 +152,15 @@ describe('shared.ops.feed', () => { let potionText = content.hatchingPotions[potion] ? content.hatchingPotions[potion].text() : potion; let eggText = content.eggs[egg] ? content.eggs[egg].text() : egg; - let res = feed(user, {params: {pet: 'Wolf-Spooky', food: 'Milk'}}); - expect(res).to.eql({ - data: user.items.pets['Wolf-Spooky'], - message: i18n.t('messageLikesFood', { - egg: i18n.t('petName', { - potion: potionText, - egg: eggText, - }), - foodText: food.text(), + let [data, message] = feed(user, {params: {pet: 'Wolf-Spooky', food: 'Milk'}}); + expect(data).to.eql(user.items.pets['Wolf-Spooky']); + expect(message).to.eql(i18n.t('messageLikesFood', { + egg: i18n.t('petName', { + potion: potionText, + egg: eggText, }), - }); + foodText: food.text(), + })); expect(user.items.food.Milk).to.equal(1); expect(user.items.pets['Wolf-Spooky']).to.equal(10); @@ -181,17 +175,15 @@ describe('shared.ops.feed', () => { let potionText = content.hatchingPotions[potion] ? content.hatchingPotions[potion].text() : potion; let eggText = content.eggs[egg] ? content.eggs[egg].text() : egg; - let res = feed(user, {params: {pet: 'Wolf-Base', food: 'Milk'}}); - expect(res).to.eql({ - data: user.items.pets['Wolf-Base'], - message: i18n.t('messageDontEnjoyFood', { - egg: i18n.t('petName', { - potion: potionText, - egg: eggText, - }), - foodText: food.text(), + let [data, message] = feed(user, {params: {pet: 'Wolf-Base', food: 'Milk'}}); + expect(data).to.eql(user.items.pets['Wolf-Base']); + expect(message).to.eql(i18n.t('messageDontEnjoyFood', { + egg: i18n.t('petName', { + potion: potionText, + egg: eggText, }), - }); + foodText: food.text(), + })); expect(user.items.food.Milk).to.equal(1); expect(user.items.pets['Wolf-Base']).to.equal(7); @@ -206,16 +198,14 @@ describe('shared.ops.feed', () => { let potionText = content.hatchingPotions[potion] ? content.hatchingPotions[potion].text() : potion; let eggText = content.eggs[egg] ? content.eggs[egg].text() : egg; - let res = feed(user, {params: {pet: 'Wolf-Base', food: 'Milk'}}); - expect(res).to.eql({ - data: user.items.pets['Wolf-Base'], - message: i18n.t('messageEvolve', { - egg: i18n.t('petName', { - potion: potionText, - egg: eggText, - }), + let [data, message] = feed(user, {params: {pet: 'Wolf-Base', food: 'Milk'}}); + expect(data).to.eql(user.items.pets['Wolf-Base']); + expect(message).to.eql(i18n.t('messageEvolve', { + egg: i18n.t('petName', { + potion: potionText, + egg: eggText, }), - }); + })); expect(user.items.food.Milk).to.equal(1); expect(user.items.pets['Wolf-Base']).to.equal(-1); diff --git a/test/common/ops/hatch.js b/test/common/ops/hatch.js index 0176b46b5f..87131db13b 100644 --- a/test/common/ops/hatch.js +++ b/test/common/ops/hatch.js @@ -99,9 +99,9 @@ describe('shared.ops.hatch', () => { user.items.eggs = {Wolf: 1}; user.items.hatchingPotions = {Base: 1}; user.items.pets = {}; - let res = hatch(user, {params: {egg: 'Wolf', hatchingPotion: 'Base'}}); - expect(res.message).to.equal(i18n.t('messageHatched')); - expect(res.data).to.eql(user.items); + let [data, message] = hatch(user, {params: {egg: 'Wolf', hatchingPotion: 'Base'}}); + expect(message).to.equal(i18n.t('messageHatched')); + expect(data).to.eql(user.items); expect(user.items.pets).to.eql({'Wolf-Base': 5}); expect(user.items.eggs).to.eql({Wolf: 0}); expect(user.items.hatchingPotions).to.eql({Base: 0}); @@ -111,9 +111,9 @@ describe('shared.ops.hatch', () => { user.items.eggs = {Cheetah: 1}; user.items.hatchingPotions = {Base: 1}; user.items.pets = {}; - let res = hatch(user, {params: {egg: 'Cheetah', hatchingPotion: 'Base'}}); - expect(res.message).to.equal(i18n.t('messageHatched')); - expect(res.data).to.eql(user.items); + let [data, message] = hatch(user, {params: {egg: 'Cheetah', hatchingPotion: 'Base'}}); + expect(message).to.equal(i18n.t('messageHatched')); + expect(data).to.eql(user.items); expect(user.items.pets).to.eql({'Cheetah-Base': 5}); expect(user.items.eggs).to.eql({Cheetah: 0}); expect(user.items.hatchingPotions).to.eql({Base: 0}); @@ -123,9 +123,9 @@ describe('shared.ops.hatch', () => { user.items.eggs = {Wolf: 1}; user.items.hatchingPotions = {Spooky: 1}; user.items.pets = {}; - let res = hatch(user, {params: {egg: 'Wolf', hatchingPotion: 'Spooky'}}); - expect(res.message).to.equal(i18n.t('messageHatched')); - expect(res.data).to.eql(user.items); + let [data, message] = hatch(user, {params: {egg: 'Wolf', hatchingPotion: 'Spooky'}}); + expect(message).to.equal(i18n.t('messageHatched')); + expect(data).to.eql(user.items); expect(user.items.pets).to.eql({'Wolf-Spooky': 5}); expect(user.items.eggs).to.eql({Wolf: 0}); expect(user.items.hatchingPotions).to.eql({Spooky: 0}); @@ -135,9 +135,9 @@ describe('shared.ops.hatch', () => { user.items.eggs = {Wolf: 1}; user.items.hatchingPotions = {Base: 1}; user.items.pets = {'Wolf-Base': -1}; - let res = hatch(user, {params: {egg: 'Wolf', hatchingPotion: 'Base'}}); - expect(res.message).to.eql(i18n.t('messageHatched')); - expect(res.data).to.eql(user.items); + let [data, message] = hatch(user, {params: {egg: 'Wolf', hatchingPotion: 'Base'}}); + expect(message).to.eql(i18n.t('messageHatched')); + expect(data).to.eql(user.items); expect(user.items.pets).to.eql({'Wolf-Base': 5}); expect(user.items.eggs).to.eql({Wolf: 0}); expect(user.items.hatchingPotions).to.eql({Base: 0}); diff --git a/test/common/ops/hourglassPurchase.js b/test/common/ops/hourglassPurchase.js index 258e0c6f01..98400f82b5 100644 --- a/test/common/ops/hourglassPurchase.js +++ b/test/common/ops/hourglassPurchase.js @@ -126,9 +126,9 @@ describe('user.ops.hourglassPurchase', () => { it('buys a pet', () => { user.purchased.plan.consecutive.trinkets = 2; - let response = hourglassPurchase(user, {params: {type: 'pets', key: 'MantisShrimp-Base'}}); + let [, message] = hourglassPurchase(user, {params: {type: 'pets', key: 'MantisShrimp-Base'}}); - expect(response.message).to.eql(i18n.t('hourglassPurchase')); + expect(message).to.eql(i18n.t('hourglassPurchase')); expect(user.purchased.plan.consecutive.trinkets).to.eql(1); expect(user.items.pets).to.eql({'MantisShrimp-Base': 5}); }); @@ -136,8 +136,8 @@ describe('user.ops.hourglassPurchase', () => { it('buys a mount', () => { user.purchased.plan.consecutive.trinkets = 2; - let response = hourglassPurchase(user, {params: {type: 'mounts', key: 'MantisShrimp-Base'}}); - expect(response.message).to.eql(i18n.t('hourglassPurchase')); + let [, message] = hourglassPurchase(user, {params: {type: 'mounts', key: 'MantisShrimp-Base'}}); + expect(message).to.eql(i18n.t('hourglassPurchase')); expect(user.purchased.plan.consecutive.trinkets).to.eql(1); expect(user.items.mounts).to.eql({'MantisShrimp-Base': true}); }); diff --git a/test/common/ops/openMysteryItem.js b/test/common/ops/openMysteryItem.js index c45146a585..712c032254 100644 --- a/test/common/ops/openMysteryItem.js +++ b/test/common/ops/openMysteryItem.js @@ -29,10 +29,10 @@ describe('shared.ops.openMysteryItem', () => { user.purchased.plan.mysteryItems = [mysteryItemKey]; - let response = openMysteryItem(user); + let [data, message] = openMysteryItem(user); expect(user.items.gear.owned[mysteryItemKey]).to.be.true; - expect(response.message).to.equal(i18n.t('mysteryItemOpened')); - expect(response.data).to.equal(user.items.gear.owned); + expect(message).to.equal(i18n.t('mysteryItemOpened')); + expect(data).to.equal(user.items.gear.owned); }); }); diff --git a/test/common/ops/purchase.js b/test/common/ops/purchase.js index 557ee006cf..5e32442c76 100644 --- a/test/common/ops/purchase.js +++ b/test/common/ops/purchase.js @@ -10,7 +10,7 @@ import { generateUser, } from '../../helpers/common.helper'; -describe('shared.ops.feed', () => { +describe('shared.ops.purchase', () => { let user; let goldPoints = 40; let gemsBought = 40; @@ -128,7 +128,7 @@ describe('shared.ops.feed', () => { }); }); - context('successful feeding', () => { + context('successful purchase', () => { let userGemAmount = 10; before(() => { @@ -138,9 +138,9 @@ describe('shared.ops.feed', () => { }); it('purchases gems', () => { - let purchaseResponse = purchase(user, {params: {type: 'gems', key: 'gem'}}); + let [, message] = purchase(user, {params: {type: 'gems', key: 'gem'}}); - expect(purchaseResponse.message).to.equal(i18n.t('plusOneGem')); + expect(message).to.equal(i18n.t('plusOneGem')); expect(user.balance).to.equal(userGemAmount + 0.25); expect(user.purchased.plan.gemsBought).to.equal(1); expect(user.stats.gp).to.equal(goldPoints - planGemLimits.convRate); @@ -150,9 +150,9 @@ describe('shared.ops.feed', () => { let type = 'eggs'; let key = 'Wolf'; - let purchaseResponse = purchase(user, {params: {type, key}}); + let [, message] = purchase(user, {params: {type, key}}); - expect(purchaseResponse.message).to.equal(i18n.t('purchased', {type, key})); + expect(message).to.equal(i18n.t('purchased', {type, key})); expect(user.items[type][key]).to.equal(1); }); @@ -160,9 +160,9 @@ describe('shared.ops.feed', () => { let type = 'hatchingPotions'; let key = 'Base'; - let purchaseResponse = purchase(user, {params: {type, key}}); + let [, message] = purchase(user, {params: {type, key}}); - expect(purchaseResponse.message).to.equal(i18n.t('purchased', {type, key})); + expect(message).to.equal(i18n.t('purchased', {type, key})); expect(user.items[type][key]).to.equal(1); }); @@ -170,9 +170,9 @@ describe('shared.ops.feed', () => { let type = 'food'; let key = 'Meat'; - let purchaseResponse = purchase(user, {params: {type, key}}); + let [, message] = purchase(user, {params: {type, key}}); - expect(purchaseResponse.message).to.equal(i18n.t('purchased', {type, key})); + expect(message).to.equal(i18n.t('purchased', {type, key})); expect(user.items[type][key]).to.equal(1); }); @@ -180,9 +180,9 @@ describe('shared.ops.feed', () => { let type = 'quests'; let key = 'gryphon'; - let purchaseResponse = purchase(user, {params: {type, key}}); + let [, message] = purchase(user, {params: {type, key}}); - expect(purchaseResponse.message).to.equal(i18n.t('purchased', {type, key})); + expect(message).to.equal(i18n.t('purchased', {type, key})); expect(user.items[type][key]).to.equal(1); }); @@ -190,9 +190,9 @@ describe('shared.ops.feed', () => { let type = 'gear'; let key = 'headAccessory_special_tigerEars'; - let purchaseResponse = purchase(user, {params: {type, key}}); + let [, message] = purchase(user, {params: {type, key}}); - expect(purchaseResponse.message).to.equal(i18n.t('purchased', {type, key})); + expect(message).to.equal(i18n.t('purchased', {type, key})); expect(user.items.gear.owned[key]).to.be.true; }); }); diff --git a/test/common/ops/readCard.js b/test/common/ops/readCard.js index 27f78ea5cd..5d771ab0d6 100644 --- a/test/common/ops/readCard.js +++ b/test/common/ops/readCard.js @@ -39,9 +39,9 @@ describe('shared.ops.readCard', () => { }); it('reads a card', () => { - let response = readCard(user, {params: {cardType: 'greeting'}}); + let [, message] = readCard(user, {params: {cardType: 'greeting'}}); - expect(response.message).to.equal(i18n.t('readCard', {cardType})); + expect(message).to.equal(i18n.t('readCard', {cardType})); expect(user.items.special[`${cardType}Received`]).to.be.empty; expect(user.flags.cardReceived).to.be.false; }); diff --git a/test/common/ops/rebirth.js b/test/common/ops/rebirth.js index 61d1334569..0ab66674b3 100644 --- a/test/common/ops/rebirth.js +++ b/test/common/ops/rebirth.js @@ -35,18 +35,18 @@ describe('shared.ops.rebirth', () => { }); it('rebirths a user with enough gems', () => { - let response = rebirth(user); + let [, message] = rebirth(user); - expect(response.message).to.equal(i18n.t('rebirthComplete')); + expect(message).to.equal(i18n.t('rebirthComplete')); }); it('rebirths a user with not enough gems but max level', () => { user.balance = 0; user.stats.lvl = MAX_LEVEL; - let response = rebirth(user); + let [, message] = rebirth(user); - expect(response.message).to.equal(i18n.t('rebirthComplete')); + expect(message).to.equal(i18n.t('rebirthComplete')); }); it('resets user\'s taks values except for rewards to 0', () => { diff --git a/test/common/ops/releaseBoth.js b/test/common/ops/releaseBoth.js index 309734e7d4..41e1bf6efb 100644 --- a/test/common/ops/releaseBoth.js +++ b/test/common/ops/releaseBoth.js @@ -33,9 +33,9 @@ describe('shared.ops.releaseBoth', () => { }); it('grants triad bingo with gems', () => { - let response = releaseBoth(user); + let [, message] = releaseBoth(user); - expect(response.message).to.equal(i18n.t('mountsAndPetsReleased')); + expect(message).to.equal(i18n.t('mountsAndPetsReleased')); expect(user.achievements.triadBingoCount).to.equal(1); }); @@ -44,24 +44,24 @@ describe('shared.ops.releaseBoth', () => { user.achievements.triadBingo = 1; user.achievements.triadBingoCount = 1; - let response = releaseBoth(user); + let [, message] = releaseBoth(user); - expect(response.message).to.equal(i18n.t('mountsAndPetsReleased')); + expect(message).to.equal(i18n.t('mountsAndPetsReleased')); expect(user.achievements.triadBingoCount).to.equal(2); }); it('releases pets', () => { - let response = releaseBoth(user); + let [, message] = releaseBoth(user); - expect(response.message).to.equal(i18n.t('mountsAndPetsReleased')); + expect(message).to.equal(i18n.t('mountsAndPetsReleased')); expect(user.items.pets[animal]).to.be.empty; expect(user.items.mounts[animal]).to.equal(null); }); it('releases mounts', () => { - let response = releaseBoth(user); + let [, message] = releaseBoth(user); - expect(response.message).to.equal(i18n.t('mountsAndPetsReleased')); + expect(message).to.equal(i18n.t('mountsAndPetsReleased')); expect(user.items.mounts[animal]).to.equal(null); }); diff --git a/test/common/ops/releaseMounts.js b/test/common/ops/releaseMounts.js index 80429b726f..29cb3cf6ac 100644 --- a/test/common/ops/releaseMounts.js +++ b/test/common/ops/releaseMounts.js @@ -31,9 +31,9 @@ describe('shared.ops.releaseMounts', () => { }); it('releases mounts', () => { - let response = releaseMounts(user); + let [, message] = releaseMounts(user); - expect(response.message).to.equal(i18n.t('mountsReleased')); + expect(message).to.equal(i18n.t('mountsReleased')); expect(user.items.mounts[animal]).to.equal(null); }); diff --git a/test/common/ops/releasePets.js b/test/common/ops/releasePets.js index 11d69a5a31..af175736cf 100644 --- a/test/common/ops/releasePets.js +++ b/test/common/ops/releasePets.js @@ -31,9 +31,9 @@ describe('shared.ops.releasePets', () => { }); it('releases pets', () => { - let response = releasePets(user); + let [, message] = releasePets(user); - expect(response.message).to.equal(i18n.t('petsReleased')); + expect(message).to.equal(i18n.t('petsReleased')); expect(user.items.pets[animal]).to.equal(0); }); diff --git a/test/common/ops/reroll.js b/test/common/ops/reroll.js index 8cadd3fa6c..ede0449ee8 100644 --- a/test/common/ops/reroll.js +++ b/test/common/ops/reroll.js @@ -32,9 +32,9 @@ describe('shared.ops.reroll', () => { }); it('rerolls a user with enough gems', () => { - let response = reroll(user); + let [, message] = reroll(user); - expect(response.message).to.equal(i18n.t('rerollComplete')); + expect(message).to.equal(i18n.t('rerollComplete')); }); it('reduces a user\'s balance', () => { diff --git a/test/common/ops/reset.js b/test/common/ops/reset.js index 2243cfa127..50ebf90cb5 100644 --- a/test/common/ops/reset.js +++ b/test/common/ops/reset.js @@ -31,9 +31,9 @@ describe('shared.ops.reset', () => { it('resets a user', () => { - let response = reset(user); + let [, message] = reset(user); - expect(response.message).to.equal(i18n.t('resetComplete')); + expect(message).to.equal(i18n.t('resetComplete')); }); it('resets user\'s health', () => { diff --git a/test/common/ops/revive.js b/test/common/ops/revive.js index 42e1915b07..efd6968b42 100644 --- a/test/common/ops/revive.js +++ b/test/common/ops/revive.js @@ -57,9 +57,9 @@ describe('shared.ops.revive', () => { let weaponKey = 'weapon_warrior_0'; user.items.gear.owned[weaponKey] = true; - let reviveRequest = revive(user); + let [, message] = revive(user); - expect(reviveRequest.message).to.equal(i18n.t('messageLostItem', { itemText: content.gear.flat[weaponKey].text()})); + expect(message).to.equal(i18n.t('messageLostItem', { itemText: content.gear.flat[weaponKey].text()})); expect(user.items.gear.owned[weaponKey]).to.be.false; }); @@ -70,9 +70,9 @@ describe('shared.ops.revive', () => { user.items.gear.owned[weaponKey] = true; user.items.gear.equipped[itemToLose.type] = itemToLose.key; - let reviveRequest = revive(user); + let [, message] = revive(user); - expect(reviveRequest.message).to.equal(i18n.t('messageLostItem', { itemText: itemToLose.text()})); + expect(message).to.equal(i18n.t('messageLostItem', { itemText: itemToLose.text()})); expect(user.items.gear.equipped[itemToLose.type]).to.equal(`${itemToLose.type}_base_0`); }); @@ -83,9 +83,9 @@ describe('shared.ops.revive', () => { user.items.gear.owned[weaponKey] = true; user.items.gear.costume[itemToLose.type] = itemToLose.key; - let reviveRequest = revive(user); + let [, message] = revive(user); - expect(reviveRequest.message).to.equal(i18n.t('messageLostItem', { itemText: itemToLose.text()})); + expect(message).to.equal(i18n.t('messageLostItem', { itemText: itemToLose.text()})); expect(user.items.gear.costume[itemToLose.type]).to.equal(`${itemToLose.type}_base_0`); }); }); diff --git a/test/common/ops/sell.js b/test/common/ops/sell.js index c5499b00d2..e294f43e54 100644 --- a/test/common/ops/sell.js +++ b/test/common/ops/sell.js @@ -66,16 +66,16 @@ describe('shared.ops.sell', () => { }); it('reduces item count from user', () => { - let response = sell(user, {params: { type, key } }); + let [, message] = sell(user, {params: { type, key } }); - expect(response.message).to.equal(i18n.t('sold', {type, key})); + expect(message).to.equal(i18n.t('sold', {type, key})); expect(user.items[type][key]).to.equal(0); }); it('increases user\'s gold', () => { - let response = sell(user, {params: { type, key } }); + let [, message] = sell(user, {params: { type, key } }); - expect(response.message).to.equal(i18n.t('sold', {type, key})); + expect(message).to.equal(i18n.t('sold', {type, key})); expect(user.stats.gp).to.equal(content[type][key].value); }); }); diff --git a/test/common/ops/sleep.js b/test/common/ops/sleep.js index 5466631f75..f1e15625c9 100644 --- a/test/common/ops/sleep.js +++ b/test/common/ops/sleep.js @@ -7,12 +7,12 @@ describe('shared.ops.sleep', () => { it('toggles user.preferences.sleep', () => { let user = generateUser(); - let res = sleep(user); - expect(res).to.eql({preferences: {sleep: true}}); + let [res] = sleep(user); + expect(res).to.eql(true); expect(user.preferences.sleep).to.equal(true); - let res2 = sleep(user); - expect(res2).to.eql({preferences: {sleep: false}}); + let [res2] = sleep(user); + expect(res2).to.eql(false); expect(user.preferences.sleep).to.equal(false); }); }); diff --git a/test/common/ops/unlock.js b/test/common/ops/unlock.js index 2f9f7d3aea..cc9d286d42 100644 --- a/test/common/ops/unlock.js +++ b/test/common/ops/unlock.js @@ -91,30 +91,30 @@ describe('shared.ops.unlock', () => { }); it('unlocks a full set', () => { - let response = unlock(user, {query: {path: unlockPath}}); + let [, message] = unlock(user, {query: {path: unlockPath}}); - expect(response.message).to.equal(i18n.t('unlocked')); + expect(message).to.equal(i18n.t('unlocked')); expect(user.purchased.shirt.convict).to.be.true; }); it('unlocks a full set of gear', () => { - let response = unlock(user, {query: {path: unlockGearSetPath}}); + let [, message] = unlock(user, {query: {path: unlockGearSetPath}}); - expect(response.message).to.equal(i18n.t('unlocked')); + expect(message).to.equal(i18n.t('unlocked')); expect(user.items.gear.owned.headAccessory_special_wolfEars).to.be.true; }); it('unlocks a an item', () => { - let response = unlock(user, {query: {path: backgroundUnlockPath}}); + let [, message] = unlock(user, {query: {path: backgroundUnlockPath}}); - expect(response.message).to.equal(i18n.t('unlocked')); + expect(message).to.equal(i18n.t('unlocked')); expect(user.purchased.background.giant_florals).to.be.true; }); it('reduces a user\'s balance', () => { - let response = unlock(user, {query: {path: unlockPath}}); + let [, message] = unlock(user, {query: {path: unlockPath}}); - expect(response.message).to.equal(i18n.t('unlocked')); + expect(message).to.equal(i18n.t('unlocked')); expect(user.balance).to.equal(usersStartingGems - unlockCost); }); }); diff --git a/test/common/ops/updateTask.js b/test/common/ops/updateTask.js index 834aa0c419..d476421f7c 100644 --- a/test/common/ops/updateTask.js +++ b/test/common/ops/updateTask.js @@ -19,7 +19,7 @@ describe('shared.ops.updateTask', () => { }], }); - let res = updateTask(habit, { + let [res] = updateTask(habit, { body: { text: 'updated', id: '123', diff --git a/test/helpers/api-integration/requester.js b/test/helpers/api-integration/requester.js index d56593548a..1be38efe16 100644 --- a/test/helpers/api-integration/requester.js +++ b/test/helpers/api-integration/requester.js @@ -61,7 +61,7 @@ function _requestMaker (user, method, additionalSets = {}) { let parsedError = _parseError(err); - reject(parsedError); + return reject(parsedError); } // if any cookies was sent, save it for the next request @@ -71,13 +71,38 @@ function _requestMaker (user, method, additionalSets = {}) { }).join('; '); } - let contentType = response.headers['content-type'] || ''; - resolve(contentType.indexOf('json') !== -1 ? response.body : response.text); + resolve(_parseRes(response)); }); }); }; } +function _parseRes (res) { + let contentType = res.headers['content-type'] || ''; + let contentDisposition = res.headers['content-disposition'] || ''; + + if (contentType.indexOf('json') === -1) { // not a json response + return res.text; + } + + if (contentDisposition.indexOf('attachment') !== -1) { + return res.body; + } + + if (apiVersion === 'v2') { + return res.body; + } else if (apiVersion === 'v3') { + if (res.body.message) { + return { + data: res.body.data, + message: res.body.message, + }; + } else { + return res.body.data; + } + } +} + function _parseError (err) { let parsedError; diff --git a/vagrant_scripts/vagrant.sh b/vagrant_scripts/vagrant.sh index a53b97bad4..e366328d2a 100644 --- a/vagrant_scripts/vagrant.sh +++ b/vagrant_scripts/vagrant.sh @@ -38,7 +38,7 @@ apt-get update -qq echo Installing Unix build tools - needed for node-gyp to use make... apt-get install -qq build-essential -echo Installing python sofrware properties... +echo Installing python software properties... apt-get install -qq python-software-properties echo Installing sprite dependencies... @@ -57,7 +57,7 @@ echo Installing curl... apt-get install -qq curl echo Installing test dependencies... -/vagrant/vagrant_scripts/install_gcc.sh +/vagrant/vagrant_scripts/install_test_dependencies.sh echo Installing ntp... apt-get install -qq ntp diff --git a/website/public/js/controllers/footerCtrl.js b/website/public/js/controllers/footerCtrl.js index 42fd279944..665f054f9d 100644 --- a/website/public/js/controllers/footerCtrl.js +++ b/website/public/js/controllers/footerCtrl.js @@ -70,7 +70,8 @@ function($scope, $rootScope, User, $http, Notification, ApiUrl, Social) { /** * Debug functions. Note that the server route for gems is only available if process.env.DEBUG=true */ - if (_.contains(['development','test'],window.env.NODE_ENV)) { + // enable debug menu to test v3 TODO remove + if (true || _.contains(['development','test'],window.env.NODE_ENV)) { $scope.setHealthLow = function(){ User.set({ diff --git a/website/src/controllers/api-v2/user.js b/website/src/controllers/api-v2/user.js index 721feb72b4..c11c371c01 100644 --- a/website/src/controllers/api-v2/user.js +++ b/website/src/controllers/api-v2/user.js @@ -124,7 +124,7 @@ api.score = function(req, res, next) { task.completed = direction === 'up'; } - var delta = shared.ops.scoreTask({ + var [delta] = shared.ops.scoreTask({ user, task, direction, @@ -612,7 +612,7 @@ api.deleteTag = function (req, res, next) { api.cast = async function(req, res, next) { try { let user = res.locals.user; - let spellId = req.params.spellId; + let spellId = req.params.spell; let targetId = req.query.targetId; let klass = shared.content.spells.special[spellId] ? 'special' : user.stats.class; @@ -835,7 +835,7 @@ api.updateTask = function(req, res, next) { if(!task) return res.status(404).json({err: 'Task not found.'}) try { - _.assign(task, shared.ops.updateTask(task.toObject(), req)); + _.assign(task, shared.ops.updateTask(task.toObject(), req)[0]); task.save(function(err, task){ if(err) return next(err); @@ -876,7 +876,7 @@ api.addTask = function(req, res, next) { */ _.each(shared.ops, function(op,k){ var kv3; - + if (['rebirth', 'reroll', 'reset'].indexOf(k) !== -1) { // proxy ops that change tasks directly to v3 if (k === 'rebirth') kv3 = 'userRebirth'; // the name is different in v3 if (k === 'reroll') kv3 = 'userReroll'; @@ -892,6 +892,9 @@ _.each(shared.ops, function(op,k){ try { req.v2 = true; // Used to indicate to the shared code that the old response data should be returned opResponse = shared.ops[k](res.locals.user, req, analytics); + if (Array.isArray(opResponse) && opResponse.length < 3) { + opResponse = opResponse[0]; + } } catch (err) { if (!err.code) return next(err); if (err.code >= 400) return res.status(err.code).json({err:err.message}); diff --git a/website/src/controllers/api-v3/auth.js b/website/src/controllers/api-v3/auth.js index 640003bb6d..4b41448f97 100644 --- a/website/src/controllers/api-v3/auth.js +++ b/website/src/controllers/api-v3/auth.js @@ -62,7 +62,7 @@ async function _handleGroupInvitation (user, invite) { * @apiParam {String} password Body parameter - Password for the new user * @apiParam {String} confirmPassword Body parameter - Password confirmation * - * @apiSuccess {Object} user The user object, if local auth was just attached to a social user then only user.auth.local + * @apiSuccess {Object} data The user object, if local auth was just attached to a social user then only user.auth.local */ api.registerLocal = { method: 'POST', @@ -174,8 +174,8 @@ function _loginRes (user, req, res) { * @apiParam {String} username Body parameter - Username or email of the user * @apiParam {String} password Body parameter - The user's password * - * @apiSuccess {String} _id The user's unique identifier - * @apiSuccess {String} apiToken The user's api token that must be used to authenticate requests. + * @apiSuccess {String} data._id The user's unique identifier + * @apiSuccess {String} data.apiToken The user's api token that must be used to authenticate requests. */ api.loginLocal = { method: 'POST', @@ -229,6 +229,7 @@ function _passportFbProfile (accessToken) { } // Called as a callback by Facebook (or other social providers). Internal route +// TODO move to top-level/auth? api.loginSocial = { method: 'POST', url: '/user/auth/social', // this isn't the most appropriate url but must be the same as v2 @@ -290,7 +291,7 @@ api.loginSocial = { * @apiParam {string} password Body parameter - The current user password * @apiParam {string} username Body parameter - The new username - * @apiSuccess {String} username The new username + * @apiSuccess {String} data.username The new username **/ api.updateUsername = { method: 'PUT', @@ -339,7 +340,7 @@ api.updateUsername = { * @apiParam {string} newPassword Body parameter - The new password * @apiParam {string} confirmPassword Body parameter - New password confirmation * - * @apiSuccess {Object} emoty An empty object + * @apiSuccess {Object} data An empty object **/ api.updatePassword = { method: 'PUT', @@ -419,7 +420,7 @@ api.resetPassword = { }); await user.save(); } - res.respond(200, { message: res.t('passwordReset') }); + res.respond(200, {}, res.t('passwordReset')); }, }; @@ -433,7 +434,7 @@ api.resetPassword = { * @apiParam {string} Body parameter - newEmail The new email address. * @apiParam {string} Body parameter - password The user password. * - * @apiSuccess {string} email The updated email address + * @apiSuccess {string} data.email The updated email address */ api.updateEmail = { method: 'PUT', @@ -488,7 +489,7 @@ api.getFirebaseToken = { * @apiName UserDeleteSocial * @apiGroup User * - * @apiSuccess {Object} empty Empty object + * @apiSuccess {Object} data Empty object */ api.deleteSocial = { method: 'DELETE', diff --git a/website/src/controllers/api-v3/challenges.js b/website/src/controllers/api-v3/challenges.js index 50249b0faf..8ea8558fb3 100644 --- a/website/src/controllers/api-v3/challenges.js +++ b/website/src/controllers/api-v3/challenges.js @@ -29,7 +29,7 @@ let api = {}; * @apiName CreateChallenge * @apiGroup Challenge * - * @apiSuccess {object} challenge The newly created challenge + * @apiSuccess {object} data The newly created challenge */ api.createChallenge = { method: 'POST', @@ -119,7 +119,7 @@ api.createChallenge = { * @apiGroup Challenge * @apiParam {UUID} challengeId The challenge _id * - * @apiSuccess {object} challenge The challenge the user joined + * @apiSuccess {object} data The challenge the user joined */ api.joinChallenge = { method: 'POST', @@ -165,7 +165,7 @@ api.joinChallenge = { * @apiGroup Challenge * @apiParam {UUID} challengeId The challenge _id * - * @apiSuccess {object} empty An empty object + * @apiSuccess {object} data An empty object */ api.leaveChallenge = { method: 'POST', @@ -202,7 +202,7 @@ api.leaveChallenge = { * @apiName GetUserChallenges * @apiGroup Challenge * - * @apiSuccess {Array} challenges An array of challenges + * @apiSuccess {Array} data An array of challenges */ api.getUserChallenges = { method: 'GET', @@ -220,12 +220,13 @@ api.getUserChallenges = { _id: {$ne: '95533e05-1ff9-4e46-970b-d77219f199e9'}, // remove the Spread the Word Challenge for now, will revisit when we fix the closing-challenge bug TODO revisit }) .sort('-official -timestamp') + // see below why we're not using populate // .populate('group', basicGroupFields) // .populate('leader', nameFields) .exec(); let resChals = challenges.map(challenge => challenge.toJSON()); - // TODO Instead of populate we make a find call manually because of https://github.com/Automattic/mongoose/issues/3833 + // Instead of populate we make a find call manually because of https://github.com/Automattic/mongoose/issues/3833 await Q.all(resChals.map((chal, index) => { return Q.all([ User.findById(chal.leader).select(nameFields).exec(), @@ -242,13 +243,14 @@ api.getUserChallenges = { /** * @api {get} /api/v3/challenges/group/group:Id Get challenges for a group + * @apiDescription Get challenges that the user is a member, public challenges and the ones from the user's groups. * @apiVersion 3.0.0 * @apiName GetGroupChallenges * @apiGroup Challenge * * @apiParam {groupId} groupId The group _id * - * @apiSuccess {Array} challenges An array of challenges + * @apiSuccess {Array} data An array of challenges */ api.getGroupChallenges = { method: 'GET', @@ -272,7 +274,7 @@ api.getGroupChallenges = { .exec(); let resChals = challenges.map(challenge => challenge.toJSON()); - // TODO Instead of populate we make a find call manually because of https://github.com/Automattic/mongoose/issues/3833 + // Instead of populate we make a find call manually because of https://github.com/Automattic/mongoose/issues/3833 await Q.all(resChals.map((chal, index) => { return User.findById(chal.leader).select(nameFields).exec().then(populatedLeader => { resChals[index].leader = populatedLeader.toJSON({minimize: true}); @@ -291,7 +293,7 @@ api.getGroupChallenges = { * * @apiParam {UUID} challengeId The challenge _id * - * @apiSuccess {object} challenge The challenge object + * @apiSuccess {object} data The challenge object */ api.getChallenge = { method: 'GET', @@ -318,7 +320,7 @@ api.getChallenge = { let chalRes = challenge.toJSON(); chalRes.group = group.toJSON({minimize: true}); - // TODO Instead of populate we make a find call manually because of https://github.com/Automattic/mongoose/issues/3833 + // Instead of populate we make a find call manually because of https://github.com/Automattic/mongoose/issues/3833 chalRes.leader = (await User.findById(chalRes.leader).select(nameFields).exec()).toJSON({minimize: true}); res.respond(200, chalRes); @@ -333,7 +335,7 @@ api.getChallenge = { * * @apiParam {UUID} challengeId The challenge _id * - * @apiSuccess {object} challenge The challenge object + * @apiSuccess {string} challenge A csv file */ api.exportChallengeCsv = { method: 'GET', @@ -406,7 +408,7 @@ api.exportChallengeCsv = { * * @apiParam {UUID} challengeId The challenge _id * - * @apiSuccess {object} challenge The updated challenge object + * @apiSuccess {object} data The updated challenge */ api.updateChallenge = { method: 'PUT', @@ -507,7 +509,9 @@ export async function _closeChal (challenge, broken = {}) { * @apiName DeleteChallenge * @apiGroup Challenge * - * @apiSuccess {object} empty An empty object + * challengeId {UUID} The _id for the challenge to delete + * + * @apiSuccess {object} data An empty object */ api.deleteChallenge = { method: 'DELETE', @@ -537,7 +541,10 @@ api.deleteChallenge = { * @apiName SelectChallengeWinner * @apiGroup Challenge * - * @apiSuccess {object} empty An empty object + * challengeId {UUID} The _id for the challenge to close with a winner + * winnerId {UUID} The _id of the winning user + * + * @apiSuccess {object} data An empty object */ api.selectChallengeWinner = { method: 'POST', diff --git a/website/src/controllers/api-v3/chat.js b/website/src/controllers/api-v3/chat.js index 24e4ea8bab..42864fdab7 100644 --- a/website/src/controllers/api-v3/chat.js +++ b/website/src/controllers/api-v3/chat.js @@ -27,7 +27,7 @@ let api = {}; * * @apiParam {string} groupId The group _id ('party' for the user party and 'habitrpg' for tavern are accepted) * - * @apiSuccess {Array} chat An array of chat messages + * @apiSuccess {Array} data An array of chat messages */ api.getChat = { method: 'GET', @@ -54,11 +54,11 @@ api.getChat = { * @apiName PostCat * @apiGroup Chat * - * @apiParam {UUID} groupId The group _id - * @apiParam {message} message The chat's message - * @apiParam {previousMsg} previousMsg The previous chat message which will force a return of the full group chat + * @apiParam {UUID} groupId The group _id ('party' for the user party and 'habitrpg' for tavern are accepted) + * @apiParam {message} Body parameter - message The message to post + * @apiParam {previousMsg} previousMsg Query parameter - The previous chat message which will force a return of the full group chat * - * @apiSuccess {Array} chat An array of chat messages + * @apiSuccess data An array of chat messages if a new message was posted after previousMsg, otherwise the posted message */ api.postChat = { method: 'POST', @@ -107,10 +107,10 @@ api.postChat = { * @apiName LikeChat * @apiGroup Chat * - * @apiParam {groupId} groupId The group _id + * @apiParam {groupId} groupId The group _id ('party' for the user party and 'habitrpg' for tavern are accepted) * @apiParam {chatId} chatId The chat message _id * - * @apiSuccess {Array} chat An array of chat messages + * @apiSuccess {Object} data The liked chat message */ api.likeChat = { method: 'POST', @@ -154,10 +154,10 @@ api.likeChat = { * @apiName LikeChat * @apiGroup Chat * - * @apiParam {groupId} groupId The group _id - * @apiParam {chatId} chatId The chat message _id + * @apiParam {groupId} groupId The group _id ('party' for the user party and 'habitrpg' for tavern are accepted) + * @apiParam {chatId} chatId The chat message id * - * @apiSuccess {Array} chat An array of chat messages + * @apiSuccess {object} data The flagged chat message */ api.flagChat = { method: 'POST', @@ -255,14 +255,15 @@ api.flagChat = { /** * @api {post} /api/v3/groups/:groupId/chat/:chatId/clear-flags Clear a group chat message's flags + * @apiDescription Admin-only * @apiVersion 3.0.0 * @apiName ClearFlags * @apiGroup Chat * - * @apiParam {groupId} groupId The group _id - * @apiParam {chatId} chatId The chat message _id + * @apiParam {groupId} groupId The group _id ('party' for the user party and 'habitrpg' for tavern are accepted) + * @apiParam {chatId} chatId The chat message id * - * @apiSuccess {Object} An empty object + * @apiSuccess {Object} data An empty object */ api.clearChatFlags = { method: 'Post', @@ -306,7 +307,9 @@ api.clearChatFlags = { * @apiName SeenChat * @apiGroup Chat * - * @apiParam {groupId} groupId The group _id + * @apiParam {groupId} groupId The group _id ('party' for the user party and 'habitrpg' for tavern are accepted) + * + * @apiSuccess {Object} data An empty object */ api.seenChat = { method: 'POST', @@ -328,7 +331,7 @@ api.seenChat = { update.$unset[`newMessages.${groupId}`] = true; await User.update({_id: user._id}, update).exec(); - res.respond(200); + res.respond(200, {}); }, }; @@ -338,11 +341,12 @@ api.seenChat = { * @apiName DeleteChat * @apiGroup Chat * + * @apiParam {string} previousMsg Query parameter - The last message fetched by the client so that the whole chat will be returned only if new messages have been posted in the meantime * @apiParam {string} groupId The group _id ('party' for the user party and 'habitrpg' for tavern are accepted) - * @apiParam {string} chatId The chat _id + * @apiParam {string} chatId The chat message id * - * @apiSuccess {Array} The update chat array - * @apiSuccess {Object} An empty object when the previous message was deleted + * @apiSuccess data The updated chat array or an empty object if no message was posted after previousMsg + * @apiSuccess {Object} data An empty object when the previous message was deleted */ api.deleteChat = { method: 'DELETE', diff --git a/website/src/controllers/api-v3/content.js b/website/src/controllers/api-v3/content.js index 780758cf48..b9d7495a97 100644 --- a/website/src/controllers/api-v3/content.js +++ b/website/src/controllers/api-v3/content.js @@ -61,14 +61,15 @@ async function saveContentToDisk (language, content) { } /** - * @api {get} /api/v3/content Get all available content objects. Does not require authentication. + * @api {get} /api/v3/content Get all available content objects. + * @apiDescription Does not require authentication. * @apiVersion 3.0.0 * @apiName ContentGet * @apiGroup Content * - * @apiParam {string} language Optional query parameter, the language code used for the items' strings. Defaulting to english + * @apiParam {string} language Query parameter, the language code used for the items' strings. Defaulting to english * - * @apiSuccess {Object} content All the content available on Habitica + * @apiSuccess {Object} data All the content available on Habitica */ api.getContent = { method: 'GET', @@ -95,7 +96,9 @@ api.getContent = { res.set({ 'Content-Type': 'application/json', }); - res.status(200).send(content); + + let jsonResString = `{"success": true, "data": ${content}}`; + res.status(200).send(jsonResString); // save the file in background unless it's already cached or being written right now if (cachedContentResponses[language] !== true && cacheBeingWritten[language] !== true) { diff --git a/website/src/controllers/api-v3/coupon.js b/website/src/controllers/api-v3/coupon.js index 8ecae368ee..4dc434aa8c 100644 --- a/website/src/controllers/api-v3/coupon.js +++ b/website/src/controllers/api-v3/coupon.js @@ -11,12 +11,13 @@ import couponCode from 'coupon-code'; let api = {}; /** - * @api {get} /api/v3/coupons Get coupons (sudo users only) + * @api {get} /api/v3/coupons Get coupons + * @apiDescription Sudo users only * @apiVersion 3.0.0 * @apiName GetCoupons * @apiGroup Coupon * - * @apiSuccess string Coupons in CSV format + * @apiSuccess {string} Coupons in CSV format */ api.getCoupons = { method: 'GET', @@ -39,7 +40,8 @@ api.getCoupons = { }; /** - * @api {post} /api/v3/coupons/generate/:event Generate coupons for an event (sudo users only) + * @api {post} /api/v3/coupons/generate/:event Generate coupons for an event + * @apiDescription Sudo users only * @apiVersion 3.0.0 * @apiName GenerateCoupons * @apiGroup Coupon @@ -47,7 +49,7 @@ api.getCoupons = { * @apiParam {string} event The event for which the coupon should be generated * @apiParam {number} count Query parameter to specify the number of coupon codes to generate * - * @apiSuccess array Generated coupons + * @apiSuccess {array} data Generated coupons */ api.generateCoupons = { method: 'POST', @@ -73,7 +75,7 @@ api.generateCoupons = { * * @apiParam {string} code The coupon code to apply * - * @apiSuccess object User object + * @apiSuccess {object} data User object */ api.enterCouponCode = { method: 'POST', @@ -98,7 +100,7 @@ api.enterCouponCode = { * @apiName ValidateCoupon * @apiGroup Coupon * - * @apiSuccess valid {boolean} true or false + * @apiSuccess {boolean} data.valid True or false */ api.validateCoupon = { method: 'POST', diff --git a/website/src/controllers/api-v3/debug.js b/website/src/controllers/api-v3/debug.js index a9d9c0cb08..dfd462a7e7 100644 --- a/website/src/controllers/api-v3/debug.js +++ b/website/src/controllers/api-v3/debug.js @@ -4,12 +4,13 @@ import ensureDevelpmentMode from '../../middlewares/api-v3/ensureDevelpmentMode' let api = {}; /** - * @api {post} /api/v3/debug/add-ten-gems Add ten gems to the current user + * @api {post} /api/v3/debug/add-ten-gems Add ten gems to the current user. + * @apiDescription Only available in development mode. * @apiVersion 3.0.0 * @apiName AddTenGems * @apiGroup Development * - * @apiSuccess {Object} empty An empty Object + * @apiSuccess {Object} data An empty Object */ api.addTenGems = { method: 'POST', @@ -27,12 +28,13 @@ api.addTenGems = { }; /** - * @api {post} /api/v3/debug/add-hourglass Add Hourglass to the current user + * @api {post} /api/v3/debug/add-hourglass Add Hourglass to the current user. + * @apiDescription Only available in development mode. * @apiVersion 3.0.0 * @apiName AddHourglass * @apiGroup Development * - * @apiSuccess {Object} empty An empty Object + * @apiSuccess {Object} data An empty Object */ api.addHourglass = { method: 'POST', diff --git a/website/src/controllers/api-v3/email.js b/website/src/controllers/api-v3/email.js index 01b7109e19..f8e5e4effe 100644 --- a/website/src/controllers/api-v3/email.js +++ b/website/src/controllers/api-v3/email.js @@ -7,21 +7,22 @@ import { let api = {}; +// TODO move to top-level controllers? /** * @api {get} /api/v3/email/unsubscribe Unsubscribe an email or user from email notifications + * @apiDescription Does not require authentication * @apiVersion 3.0.0 * @apiName UnsubscribeEmail * @apiGroup Unsubscribe * @apiDescription This is a GET method so that you can put the unsubscribe link in emails. * - * @apiParam {String} code An unsubscription code + * @apiParam {String} code Query parameter - An unsubscription code * - * @apiSuccess {String} okRes An message stating the user/email unsubscribed successfully + * @apiSuccess {String} An html success message */ api.unsubscribe = { method: 'GET', url: '/email/unsubscribe', - middlewares: [], async handler (req, res) { req.checkQuery({ code: { diff --git a/website/src/controllers/api-v3/groups.js b/website/src/controllers/api-v3/groups.js index 6563f1289e..60df7d1d15 100644 --- a/website/src/controllers/api-v3/groups.js +++ b/website/src/controllers/api-v3/groups.js @@ -24,15 +24,13 @@ import common from '../../../../common'; import sendPushNotification from '../../libs/api-v3/pushNotifications'; let api = {}; -// TODO shall we accept party as groupId in all routes? - /** * @api {post} /api/v3/groups Create group * @apiVersion 3.0.0 * @apiName CreateGroup * @apiGroup Group * - * @apiSuccess {Object} group The group object + * @apiSuccess {Object} data The create group */ api.createGroup = { method: 'POST', @@ -40,7 +38,7 @@ api.createGroup = { middlewares: [authWithHeaders()], async handler (req, res) { let user = res.locals.user; - let group = new Group(Group.sanitize(req.body)); // TODO validate empty req.body + let group = new Group(Group.sanitize(req.body)); group.leader = user._id; if (group.type === 'guild') { @@ -60,7 +58,7 @@ api.createGroup = { let results = await Q.all([user.save(), group.save()]); let savedGroup = results[1]; - // TODO Instead of populate we make a find call manually because of https://github.com/Automattic/mongoose/issues/3833 + // Instead of populate we make a find call manually because of https://github.com/Automattic/mongoose/issues/3833 // await Q.ninvoke(savedGroup, 'populate', ['leader', nameFields]); // doc.populate doesn't return a promise let response = savedGroup.toJSON(); // the leader is the authenticated user @@ -76,14 +74,14 @@ api.createGroup = { }; /** - * @api {get} /api/v3/groups Get groups + * @api {get} /api/v3/groups Get groups for a user * @apiVersion 3.0.0 * @apiName GetGroups * @apiGroup Group * * @apiParam {string} type The type of groups to retrieve. Must be a query string representing a list of values like 'tavern,party'. Possible values are party, privateGuilds, publicGuilds, tavern * - * @apiSuccess {Array} groups An array of the requested groups + * @apiSuccess {Array} data An array of the requested groups */ api.getGroups = { method: 'GET', @@ -92,7 +90,7 @@ api.getGroups = { async handler (req, res) { let user = res.locals.user; - req.checkQuery('type', res.t('groupTypesRequired')).notEmpty(); // TODO better validation + req.checkQuery('type', res.t('groupTypesRequired')).notEmpty(); let validationErrors = req.validationErrors(); if (validationErrors) throw validationErrors; @@ -119,7 +117,7 @@ api.getGroups = { * * @apiParam {string} groupId The group _id ('party' for the user party and 'habitrpg' for tavern are accepted) * - * @apiSuccess {Object} group The group object + * @apiSuccess {Object} data The group object */ api.getGroup = { method: 'GET', @@ -137,7 +135,7 @@ api.getGroup = { if (!group) throw new NotFound(res.t('groupNotFound')); group = Group.toJSONCleanChat(group, user); - // TODO Instead of populate we make a find call manually because of https://github.com/Automattic/mongoose/issues/3833 + // Instead of populate we make a find call manually because of https://github.com/Automattic/mongoose/issues/3833 let leader = await User.findById(group.leader).select(nameFields).exec(); if (leader) group.leader = leader.toJSON({minimize: true}); @@ -153,7 +151,7 @@ api.getGroup = { * * @apiParam {string} groupId The group _id ('party' for the user party and 'habitrpg' for tavern are accepted) * - * @apiSuccess {Object} group The updated group object + * @apiSuccess {Object} data The updated group */ api.updateGroup = { method: 'PUT', @@ -197,9 +195,9 @@ api.updateGroup = { * @apiName JoinGroup * @apiGroup Group * - * @apiParam {UUID} groupId The group _id + * @apiParam {UUID} groupId The group _id ('party' for the user party and 'habitrpg' for tavern are accepted) * - * @apiSuccess {Object} group The group + * @apiSuccess {Object} data The joined group */ api.joinGroup = { method: 'POST', @@ -288,9 +286,9 @@ api.joinGroup = { * @apiName RejectGroupInvite * @apiGroup Group * - * @apiParam {UUID} groupId The group _id + * @apiParam {UUID} groupId The group _id ('party' for the user party and 'habitrpg' for tavern are accepted) * - * @apiSuccess {Object} group The group + * @apiSuccess {Object} data An empty object */ api.rejectGroupInvite = { method: 'POST', @@ -334,9 +332,9 @@ api.rejectGroupInvite = { * @apiGroup Group * * @apiParam {string} groupId The group _id ('party' for the user party and 'habitrpg' for tavern are accepted) - * @apiParam {string="remove-all","keep-all"} keep Wheter to keep or not challenges' tasks, as an optional query string + * @apiParam {string="remove-all","keep-all"} keep Query parameter - Whether to keep or not challenges' tasks. Defaults to keep-all * - * @apiSuccess {Object} empty An empty object + * @apiSuccess {Object} data An empty object */ api.leaveGroup = { method: 'POST', @@ -391,9 +389,9 @@ function _sendMessageToRemoved (group, removedUser, message) { * * @apiParam {string} groupId The group _id ('party' for the user party and 'habitrpg' for tavern are accepted) * @apiParam {UUID} memberId The _id of the member to remove - * @apiParam {string} message The message to send to the removed members, as a query string // TODO in req.body? + * @apiParam {string} message Query parameter - The message to send to the removed members * - * @apiSuccess {Object} empty An empty object + * @apiSuccess {Object} data An empty object */ api.removeGroupMember = { method: 'POST', @@ -448,7 +446,7 @@ api.removeGroupMember = { if (isInGroup === 'guild') { removeFromArray(member.guilds, group._id); } - if (isInGroup === 'party') member.party._id = undefined; // TODO remove quest information too? + if (isInGroup === 'party') member.party._id = undefined; // TODO remove quest information too? Use group.leave()? if (member.newMessages[group._id]) { member.newMessages[group._id] = undefined; @@ -456,13 +454,16 @@ api.removeGroupMember = { } if (group.quest && group.quest.active && group.quest.leader === member._id) { - member.items.quests[group.quest.key] += 1; // TODO why this? + member.items.quests[group.quest.key] += 1; } } else if (isInvited) { if (isInvited === 'guild') { removeFromArray(member.invitations.guilds, { id: group._id }); } - if (isInvited === 'party') user.invitations.party = {}; // TODO mark modified? + if (isInvited === 'party') { + user.invitations.party = {}; + user.markModified('invitations.party'); + } } else { throw new NotFound(res.t('groupMemberNotFound')); } @@ -592,11 +593,11 @@ async function _inviteByEmail (invite, group, inviter, req, res) { * * @apiParam {string} groupId The group _id ('party' for the user party and 'habitrpg' for tavern are accepted) * - * @apiParam {array} emails An array of emails addresses to invite (optional) (inside body) - * @apiParam {array} uuids An array of uuids to invite (optional) (inside body) - * @apiParam {string} inviter The inviters' name (optional) (inside body) + * @apiParam {array} emails Body parameter - An array of emails addresses to invite (optional) + * @apiParam {array} uuids Body parameter - An array of uuids to invite (optional) + * @apiParam {string} inviter Body parameter - The inviters' name (optional) * - * @apiSuccess {Object} empty An empty object + * @apiSuccess {array} data The invites */ api.inviteToGroup = { method: 'POST', diff --git a/website/src/controllers/api-v3/hall.js b/website/src/controllers/api-v3/hall.js index 55bc191063..c8f11fdfa8 100644 --- a/website/src/controllers/api-v3/hall.js +++ b/website/src/controllers/api-v3/hall.js @@ -9,14 +9,15 @@ import _ from 'lodash'; let api = {}; /** - * @api {get} /api/v3/hall/patrons Get all Patrons. Only the first 50 patrons are returned. More can be accessed passing ?page=n. + * @api {get} /api/v3/hall/patrons Get all Patrons. + * @apiDescription Only the first 50 patrons are returned. More can be accessed passing ?page=n. * @apiVersion 3.0.0 * @apiName GetPatrons * @apiGroup Hall * - * @apiParam {Number} page The result page. Default is 0 + * @apiParam {Number} page Query Parameter - The result page. Default is 0 * - * @apiSuccess {Array} patron An array of patrons + * @apiSuccess {Array} data An array of patrons */ api.getPatrons = { method: 'GET', @@ -52,7 +53,7 @@ api.getPatrons = { * @apiName GetHeroes * @apiGroup Hall * - * @apiSuccess {Array} hero An array of heroes + * @apiSuccess {Array} data An array of heroes */ api.getHeroes = { method: 'GET', @@ -74,17 +75,17 @@ api.getHeroes = { // Note, while the following routes are called getHero / updateHero // they can be used by admins to get/update any user -// TODO rename? const heroAdminFields = 'contributor balance profile.name purchased items auth'; /** - * @api {get} /api/v3/hall/heroes/:heroId Get an hero given his _id. Must be an admin to make this request + * @api {get} /api/v3/hall/heroes/:heroId Get an hero given his _id. + * @apiDescription Must be an admin to make this request * @apiVersion 3.0.0 * @apiName GetHero * @apiGroup Hall * - * @apiSuccess {Object} hero The hero object + * @apiSuccess {Object} data The hero object */ api.getHero = { method: 'GET', @@ -116,12 +117,13 @@ api.getHero = { const gemsPerTier = {1: 3, 2: 3, 3: 3, 4: 4, 5: 4, 6: 4, 7: 4, 8: 0, 9: 0}; /** - * @api {put} /api/v3/hall/heroes/:heroId Update an hero. Must be an admin to make this request + * @api {put} /api/v3/hall/heroes/:heroId Update an hero. + * @apiDescription Must be an admin to make this request * @apiVersion 3.0.0 * @apiName UpdateHero * @apiGroup Hall * - * @apiSuccess {Object} hero The updated hero object + * @apiSuccess {Object} data The updated hero object */ api.updateHero = { method: 'PUT', @@ -162,7 +164,7 @@ api.updateHero = { if (updateData.itemPath && updateData.itemVal && updateData.itemPath.indexOf('items.') === 0 && User.schema.paths[updateData.itemPath]) { - _.set(hero, updateData.itemPath, updateData.itemVal); // Sanitization at 5c30944 (deemed unnecessary) TODO review + _.set(hero, updateData.itemPath, updateData.itemVal); // Sanitization at 5c30944 (deemed unnecessary) } if (updateData.auth && _.isBoolean(updateData.auth.blocked)) hero.auth.blocked = updateData.auth.blocked; diff --git a/website/src/controllers/api-v3/members.js b/website/src/controllers/api-v3/members.js index 9e4c45d5d2..1a2257f5fe 100644 --- a/website/src/controllers/api-v3/members.js +++ b/website/src/controllers/api-v3/members.js @@ -27,7 +27,7 @@ let api = {}; * * @apiParam {UUID} memberId The member's id * - * @apiSuccess {object} member The member object + * @apiSuccess {object} data The member object */ api.getMember = { method: 'GET', @@ -129,7 +129,8 @@ function _getMembersForItem (type) { } /** - * @api {get} /api/v3/groups/:groupId/members Get members for a group with a limit of 30 member per request. To get all members run requests against this routes (updating the lastId query parameter) until you get less than 30 results. + * @api {get} /api/v3/groups/:groupId/members Get members for a group + * @apiDescription With a limit of 30 member per request. To get all members run requests against this routes (updating the lastId query parameter) until you get less than 30 results. * @apiVersion 3.0.0 * @apiName GetMembersForGroup * @apiGroup Member @@ -138,7 +139,7 @@ function _getMembersForItem (type) { * @apiParam {UUID} lastId Query parameter to specify the last member returned in a previous request to this route and get the next batch of results * @apiParam {boolean} includeAllPublicFields Query parameter available only when fetching a party. If === `true` then all public fields for members will be returned (liek when making a request for a single member) * - * @apiSuccess {array} members An array of members, sorted by _id + * @apiSuccess {array} data An array of members, sorted by _id */ api.getMembersForGroup = { method: 'GET', @@ -148,7 +149,8 @@ api.getMembersForGroup = { }; /** - * @api {get} /api/v3/groups/:groupId/invites Get invites for a group with a limit of 30 member per request. To get all invites run requests against this routes (updating the lastId query parameter) until you get less than 30 results. + * @api {get} /api/v3/groups/:groupId/invites Get invites for a group + * @apiDescription With a limit of 30 member per request. To get all invites run requests against this routes (updating the lastId query parameter) until you get less than 30 results. * @apiVersion 3.0.0 * @apiName GetInvitesForGroup * @apiGroup Member @@ -156,7 +158,7 @@ api.getMembersForGroup = { * @apiParam {UUID} groupId The group id * @apiParam {UUID} lastId Query parameter to specify the last invite returned in a previous request to this route and get the next batch of results * - * @apiSuccess {array} invites An array of invites, sorted by _id + * @apiSuccess {array} data An array of invites, sorted by _id */ api.getInvitesForGroup = { method: 'GET', @@ -166,7 +168,8 @@ api.getInvitesForGroup = { }; /** - * @api {get} /api/v3/challenges/:challengeId/members Get members for a challenge with a limit of 30 member per request. To get all members run requests against this routes (updating the lastId query parameter) until you get less than 30 results. + * @api {get} /api/v3/challenges/:challengeId/members Get members for a challenge + * @apiDescription With a limit of 30 member per request. To get all members run requests against this routes (updating the lastId query parameter) until you get less than 30 results. * @apiVersion 3.0.0 * @apiName GetMembersForChallenge * @apiGroup Member @@ -174,7 +177,7 @@ api.getInvitesForGroup = { * @apiParam {UUID} challengeId The challenge id * @apiParam {UUID} lastId Query parameter to specify the last member returned in a previous request to this route and get the next batch of results * - * @apiSuccess {array} members An array of members, sorted by _id + * @apiSuccess {array} data An array of members, sorted by _id */ api.getMembersForChallenge = { method: 'GET', @@ -192,7 +195,7 @@ api.getMembersForChallenge = { * @apiParam {UUID} challengeId The challenge _id * @apiParam {UUID} member The member _id * - * @apiSuccess {object} member Return an object with member _id, profile.name and a tasks object with the challenge tasks for the member + * @apiSuccess {object} data Return an object with member _id, profile.name and a tasks object with the challenge tasks for the member */ api.getChallengeMemberProgress = { method: 'GET', @@ -242,10 +245,10 @@ api.getChallengeMemberProgress = { * @apiName SendPrivateMessage * @apiGroup Members * - * @apiParam {String} message The message - * @apiParam {UUID} toUserId The toUser _id + * @apiParam {String} message Body parameter - The message + * @apiParam {UUID} toUserId Body parameter - The user to contact * - * @apiSuccess {Object} empty An empty Object + * @apiSuccess {Object} data An empty Object */ api.sendPrivateMessage = { method: 'POST', @@ -291,10 +294,10 @@ api.sendPrivateMessage = { * @apiName TransferGems * @apiGroup Members * - * @apiParam {String} message The message - * @apiParam {UUID} toUserId The toUser _id + * @apiParam {String} message Body parameter The message + * @apiParam {UUID} toUserId Body parameter The toUser _id * - * @apiSuccess {Object} empty An empty Object + * @apiSuccess {Object} data An empty Object */ api.transferGems = { method: 'POST', @@ -346,8 +349,8 @@ api.transferGems = { ]); } - // @TODO: Add push notifications - // pushNotify.sendNotify(sender, res.t('giftedGems'), res.t('giftedGemsInfo', { amount: gemAmount, name: byUsername })); + // TODO: Add push notifications + // pushNotify.sendNotify(sender, res.t('giftedGems'), res.t('giftedGemsInfo', { amount: gemAmount, name: byUsername })); res.respond(200, {}); }, diff --git a/website/src/controllers/api-v3/modelsPaths.js b/website/src/controllers/api-v3/modelsPaths.js index b023521722..b14d88b2b7 100644 --- a/website/src/controllers/api-v3/modelsPaths.js +++ b/website/src/controllers/api-v3/modelsPaths.js @@ -6,18 +6,19 @@ let tasksModels = ['habit', 'daily', 'todo', 'reward']; let allModels = ['user', 'tag', 'challenge', 'group'].concat(tasksModels); /** - * @api {get} /api/v3/meta/models/:model/paths Get all paths for the specified model. Doesn't require authentication + * @api {get} /api/v3s/models/:model/paths Get all paths for the specified model. + * @apiDescription Doesn't require authentication * @apiVersion 3.0.0 * @apiName GetUserModelPaths * @apiGroup Meta * * @apiParam {string="user","group","challenge","tag","habit","daily","todo","reward"} model The name of the model * - * @apiSuccess {object} paths A key-value object made of fieldPath: fieldType (like {'field.nested': Boolean}) + * @apiSuccess {object} data A key-value object made of fieldPath: fieldType (like {'field.nested': Boolean}) */ api.getModelPaths = { method: 'GET', - url: '/meta/models/:model/paths', + url: '/models/:model/paths', async handler (req, res) { req.checkParams('model', res.t('modelNotFound')).notEmpty().isIn(allModels); diff --git a/website/src/controllers/api-v3/quests.js b/website/src/controllers/api-v3/quests.js index bd076610e6..05b3020f86 100644 --- a/website/src/controllers/api-v3/quests.js +++ b/website/src/controllers/api-v3/quests.js @@ -35,8 +35,9 @@ let api = {}; * @apiGroup Group * * @apiParam {string} groupId The group _id (or 'party') + * @apiParam {string} questKey * - * @apiSuccess {Object} quest Quest Object + * @apiSuccess {Object} data Quest object */ api.inviteToQuest = { method: 'POST', @@ -139,7 +140,7 @@ api.inviteToQuest = { * * @apiParam {string} groupId The group _id (or 'party') * - * @apiSuccess {Object} quest Quest Object + * @apiSuccess {Object} data Quest Object */ api.acceptQuest = { method: 'POST', @@ -196,7 +197,7 @@ api.acceptQuest = { * * @apiParam {string} groupId The group _id (or 'party') * - * @apiSuccess {Object} quest Quest Object + * @apiSuccess {Object} data Quest Object */ api.rejectQuest = { method: 'POST', @@ -250,12 +251,12 @@ api.rejectQuest = { /** * @api {post} /api/v3/groups/:groupId/quests/force-start Accept a pending quest * @apiVersion 3.0.0 - * @apiName forceStart + * @apiName ForceQuestStart * @apiGroup Group * * @apiParam {string} groupId The group _id (or 'party') * - * @apiSuccess {Object} quest Quest Object + * @apiSuccess {Object} data Quest Object */ api.forceStart = { method: 'POST', @@ -307,7 +308,7 @@ api.forceStart = { * * @apiParam {string} groupId The group _id (or 'party') * - * @apiSuccess {Object} quest Quest Object + * @apiSuccess {Object} data Quest Object */ api.cancelQuest = { method: 'POST', @@ -356,7 +357,7 @@ api.cancelQuest = { * * @apiParam {string} groupId The group _id (or 'party') * - * @apiSuccess {Object} quest Quest Object + * @apiSuccess {Object} data Quest Object */ api.abortQuest = { method: 'POST', @@ -410,7 +411,7 @@ api.abortQuest = { * * @apiParam {string} groupId The group _id (or 'party') * - * @apiSuccess {Object} quest Quest Object + * @apiSuccess {Object} data Quest Object */ api.leaveQuest = { method: 'POST', diff --git a/website/src/controllers/api-v3/status.js b/website/src/controllers/api-v3/status.js index a3f59726a4..94bcf63ed0 100644 --- a/website/src/controllers/api-v3/status.js +++ b/website/src/controllers/api-v3/status.js @@ -6,7 +6,7 @@ let api = {}; * @apiName GetStatus * @apiGroup Status * - * @apiSuccess {status} string 'up' if everything is ok + * @apiSuccess {status} data.status 'up' if everything is ok */ api.getStatus = { method: 'GET', diff --git a/website/src/controllers/api-v3/tags.js b/website/src/controllers/api-v3/tags.js index 3028ee568c..03170b96b3 100644 --- a/website/src/controllers/api-v3/tags.js +++ b/website/src/controllers/api-v3/tags.js @@ -14,7 +14,7 @@ let api = {}; * @apiName CreateTag * @apiGroup Tag * - * @apiSuccess {Object} tag The newly created tag + * @apiSuccess {Object} data The newly created tag */ api.createTag = { method: 'POST', @@ -38,7 +38,7 @@ api.createTag = { * @apiName GetTags * @apiGroup Tag * - * @apiSuccess {Array} tags An array of tag objects + * @apiSuccess {Array} data An array of tags */ api.getTags = { method: 'GET', @@ -58,7 +58,7 @@ api.getTags = { * * @apiParam {UUID} tagId The tag _id * - * @apiSuccess {object} tag The tag object + * @apiSuccess {object} data The tag object */ api.getTag = { method: 'GET', @@ -86,7 +86,7 @@ api.getTag = { * * @apiParam {UUID} tagId The tag _id * - * @apiSuccess {object} tag The updated tag + * @apiSuccess {object} data The updated tag */ api.updateTag = { method: 'PUT', @@ -120,7 +120,7 @@ api.updateTag = { * * @apiParam {UUID} tagId The tag _id * - * @apiSuccess {object} empty An empty object + * @apiSuccess {object} data An empty object */ api.deleteTag = { method: 'DELETE', diff --git a/website/src/controllers/api-v3/tasks.js b/website/src/controllers/api-v3/tasks.js index 5c293bdd49..3af9d91090 100644 --- a/website/src/controllers/api-v3/tasks.js +++ b/website/src/controllers/api-v3/tasks.js @@ -54,13 +54,13 @@ async function _createTasks (req, res, user, challenge) { } /** - * @api {post} /api/v3/tasks/user Create a new task belonging to the autheticated user. Can be passed an object to create a single task or an array of objects to create multiple tasks. + * @api {post} /api/v3/tasks/user Create a new task the user. + * @apiDescription Can be passed an object to create a single task or an array of objects to create multiple tasks. * @apiVersion 3.0.0 * @apiName CreateUserTasks * @apiGroup Task * - * @apiSuccess {Object} task The newly created task - * @apiSuccess {Object[]} tasks The newly created tasks (if more than one was created) + * @apiSuccess data An object if a single task was created, otherwise an array of tasks */ api.createUserTasks = { method: 'POST', @@ -73,15 +73,15 @@ api.createUserTasks = { }; /** - * @api {post} /api/v3/tasks/challenge/:challengeId Create a new task belonging to the challenge. Can be passed an object to create a single task or an array of objects to create multiple tasks. + * @api {post} /api/v3/tasks/challenge/:challengeId Create a new task belonging to a challenge. + * @apiDescription Can be passed an object to create a single task or an array of objects to create multiple tasks. * @apiVersion 3.0.0 * @apiName CreateChallengeTasks * @apiGroup Task * * @apiParam {UUID} challengeId The id of the challenge the new task(s) will belong to. * - * @apiSuccess {Object} task The newly created task - * @apiSuccess {Object[]} tasks The newly created tasks (if more than one was created) + * @apiSuccess data An object if a single task was created, otherwise an array of tasks */ api.createChallengeTasks = { method: 'POST', @@ -171,7 +171,7 @@ async function _getTasks (req, res, user, challenge) { * * @apiParam {string="habits","dailys","todos","rewards","completedTodos"} type Optional query parameter to return just a type of tasks. By default all types will be returned except completed todos that requested separately. * - * @apiSuccess {Array} tasks An array of task objects + * @apiSuccess {Array} data An array of tasks */ api.getUserTasks = { method: 'GET', @@ -198,7 +198,7 @@ api.getUserTasks = { * @apiParam {UUID} challengeId The id of the challenge from which to retrieve the tasks. * @apiParam {string="habits","dailys","todos","rewards"} type Optional query parameter to return just a type of tasks * - * @apiSuccess {Array} tasks An array of task objects + * @apiSuccess {Array} data An array of tasks */ api.getChallengeTasks = { method: 'GET', @@ -225,14 +225,14 @@ api.getChallengeTasks = { }; /** - * @api {get} /api/v3/task/:taskId Get a task given its id + * @api {get} /api/v3/task/:taskId Get a task * @apiVersion 3.0.0 * @apiName GetTask * @apiGroup Task * * @apiParam {UUID} taskId The task _id * - * @apiSuccess {object} task The task object + * @apiSuccess {object} data The task object */ api.getTask = { method: 'GET', @@ -273,7 +273,7 @@ api.getTask = { * * @apiParam {UUID} taskId The task _id * - * @apiSuccess {object} task The updated task + * @apiSuccess {object} data The updated task */ api.updateTask = { method: 'PUT', @@ -284,8 +284,6 @@ api.updateTask = { let challenge; req.checkParams('taskId', res.t('taskIdRequired')).notEmpty().isUUID(); - // TODO check that req.body isn't empty - // TODO make sure tags are updated correctly (they aren't set as modified!) maybe use specific routes let validationErrors = req.validationErrors(); if (validationErrors) throw validationErrors; @@ -304,10 +302,11 @@ api.updateTask = { throw new NotFound(res.t('taskNotFound')); } - // TODO we have to convert task to an object because otherwise things don't get merged correctly. Bad for performances? + // we have to convert task to an object because otherwise things don't get merged correctly. Bad for performances? // TODO regarding comment above, make sure other models with nested fields are using this trick too - _.assign(task, Tasks.Task.sanitize(common.ops.updateTask(task.toObject(), req))); - // TODO console.log(task.modifiedPaths(), task.toObject().repeat === tep) + let [updatedTaskObj] = common.ops.updateTask(task.toObject(), req); + _.assign(task, Tasks.Task.sanitize(updatedTaskObj)); + // console.log(task.modifiedPaths(), task.toObject().repeat === tep) // repeat is always among modifiedPaths because mongoose changes the other of the keys when using .toObject() // see https://github.com/Automattic/mongoose/issues/2749 @@ -351,7 +350,9 @@ function _generateWebhookTaskData (task, direction, delta, stats, user) { * @apiParam {UUID} taskId The task _id * @apiParam {string="up","down"} direction The direction for scoring the task * - * @apiSuccess {object} empty An empty object + * @apiSuccess {object} data._tmp If an item was dropped it'll be returned in te _tmp object + * @apiSuccess {number} data.delta + * @apiSuccess {object} data The user stats */ api.scoreTask = { method: 'POST', @@ -376,7 +377,7 @@ api.scoreTask = { let wasCompleted = task.completed; - let delta = common.ops.scoreTask({task, user, direction}, req); + let [delta] = common.ops.scoreTask({task, user, direction}, req); // Drop system (don't run on the client, as it would only be discarded since ops are sent to the API, not the results) if (direction === 'up') user.fns.randomDrop({task, delta}, req); @@ -389,7 +390,7 @@ api.scoreTask = { let hasTask = removeFromArray(user.tasksOrder.todos, task._id); if (!hasTask) { user.tasksOrder.todos.push(task._id); // TODO push at the top? - } // If for some reason it hadn't been removed previously don't do anything TODO ok? + } // If for some reason it hadn't been removed previously don't do anything } } @@ -406,7 +407,6 @@ api.scoreTask = { sendTaskWebhook(user.preferences.webhooks, _generateWebhookTaskData(task, direction, delta, userStats, user)); - // TODO test? if (task.challenge.id && task.challenge.taskId && !task.challenge.broken && task.type !== 'reward') { // Wrapping everything in a try/catch block because if an error occurs using `await` it MUST NOT bubble up because the request has already been handled try { @@ -423,7 +423,6 @@ api.scoreTask = { }; // completed todos cannot be moved, they'll be returned ordered by date of completion -// TODO check that it works when a tag is selected or todos are split between dated and due // TODO support challenges? /** * @api {post} /api/v3/tasks/:taskId/move/to/:position Move a task to a new position @@ -432,9 +431,9 @@ api.scoreTask = { * @apiGroup Task * * @apiParam {UUID} taskId The task _id - * @apiParam {Number} position Where to move the task (-1 means push to bottom). First position is 0 + * @apiParam {Number} position Query parameter - Where to move the task (-1 means push to bottom). First position is 0 * - * @apiSuccess {object} tasksOrder The new tasks order (user.tasksOrder.{task.type}s) + * @apiSuccess {array} data The new tasks order (user.tasksOrder.{task.type}s) */ api.moveTask = { method: 'POST', @@ -481,14 +480,14 @@ api.moveTask = { }; /** - * @api {post} /api/v3/tasks/:taskId/checklist Add an item to a checklist, creating the checklist if it doesn't exist + * @api {post} /api/v3/tasks/:taskId/checklist Add an item to the task's checklist * @apiVersion 3.0.0 * @apiName AddChecklistItem * @apiGroup Task * * @apiParam {UUID} taskId The task _id * - * @apiSuccess {object} task The updated task + * @apiSuccess {object} data The updated task */ api.addChecklistItem = { method: 'POST', @@ -499,7 +498,6 @@ api.addChecklistItem = { let challenge; req.checkParams('taskId', res.t('taskIdRequired')).notEmpty().isUUID(); - // TODO check that req.body isn't empty and is an array let validationErrors = req.validationErrors(); if (validationErrors) throw validationErrors; @@ -523,7 +521,7 @@ api.addChecklistItem = { task.checklist.push(Tasks.Task.sanitizeChecklist(req.body)); // TODO why not allow to supply _id on creation? let savedTask = await task.save(); - res.respond(200, savedTask); // TODO what to return + res.respond(200, savedTask); if (challenge) challenge.updateTask(savedTask); }, }; @@ -537,7 +535,7 @@ api.addChecklistItem = { * @apiParam {UUID} taskId The task _id * @apiParam {UUID} itemId The checklist item _id * - * @apiSuccess {object} task The updated task + * @apiSuccess {object} data The updated task */ api.scoreCheckListItem = { method: 'POST', @@ -566,7 +564,7 @@ api.scoreCheckListItem = { item.completed = !item.completed; let savedTask = await task.save(); - res.respond(200, savedTask); // TODO what to return + res.respond(200, savedTask); }, }; @@ -579,7 +577,7 @@ api.scoreCheckListItem = { * @apiParam {UUID} taskId The task _id * @apiParam {UUID} itemId The checklist item _id * - * @apiSuccess {object} task The updated task + * @apiSuccess {object} data The updated task */ api.updateChecklistItem = { method: 'PUT', @@ -616,7 +614,7 @@ api.updateChecklistItem = { _.merge(item, Tasks.Task.sanitizeChecklist(req.body)); let savedTask = await task.save(); - res.respond(200, savedTask); // TODO what to return + res.respond(200, savedTask); if (challenge) challenge.updateTask(savedTask); }, }; @@ -630,7 +628,7 @@ api.updateChecklistItem = { * @apiParam {UUID} taskId The task _id * @apiParam {UUID} itemId The checklist item _id * - * @apiSuccess {object} empty An empty object + * @apiSuccess {object} data The updated task */ api.removeChecklistItem = { method: 'DELETE', @@ -665,7 +663,7 @@ api.removeChecklistItem = { if (!hasItem) throw new NotFound(res.t('checklistItemNotFound')); let savedTask = await task.save(); - res.respond(200, {}); // TODO what to return + res.respond(200, savedTask); if (challenge) challenge.updateTask(savedTask); }, }; @@ -679,7 +677,7 @@ api.removeChecklistItem = { * @apiParam {UUID} taskId The task _id * @apiParam {UUID} tagId The tag id * - * @apiSuccess {object} task The updated task + * @apiSuccess {object} data The updated task */ api.addTagToTask = { method: 'POST', @@ -709,12 +707,12 @@ api.addTagToTask = { task.tags.push(tagId); let savedTask = await task.save(); - res.respond(200, savedTask); // TODO what to return + res.respond(200, savedTask); }, }; /** - * @api {delete} /api/v3/tasks/:taskId/tags/:tagId Remove a tag + * @api {delete} /api/v3/tasks/:taskId/tags/:tagId Remove a tag from atask * @apiVersion 3.0.0 * @apiName RemoveTagFromTask * @apiGroup Task @@ -722,7 +720,7 @@ api.addTagToTask = { * @apiParam {UUID} taskId The task _id * @apiParam {UUID} tagId The tag id * - * @apiSuccess {object} empty An empty object + * @apiSuccess {object} data The updated task */ api.removeTagFromTask = { method: 'DELETE', @@ -747,8 +745,8 @@ api.removeTagFromTask = { let hasTag = removeFromArray(task.tags, req.params.tagId); if (!hasTag) throw new NotFound(res.t('tagNotFound')); - await task.save(); - res.respond(200, {}); // TODO what to return + let savedTask = await task.save(); + res.respond(200, savedTask); }, }; @@ -761,7 +759,7 @@ api.removeTagFromTask = { * * @apiParam {UUID} taskId The task _id * - * @apiSuccess {object} empty An empty object + * @apiSuccess {object} data An empty object */ api.unlinkTask = { method: 'POST', @@ -798,7 +796,7 @@ api.unlinkTask = { } } - res.respond(200, {}); // TODO what to return + res.respond(200, {}); }, }; @@ -808,7 +806,7 @@ api.unlinkTask = { * @apiName ClearCompletedTodos * @apiGroup Task * - * @apiSuccess {object} empty An empty object + * @apiSuccess {object} data An empty object */ api.clearCompletedTodos = { method: 'POST', @@ -841,7 +839,7 @@ api.clearCompletedTodos = { * * @apiParam {UUID} taskId The task _id * - * @apiSuccess {object} empty An empty object + * @apiSuccess {object} data An empty object */ api.deleteTask = { method: 'DELETE', diff --git a/website/src/controllers/api-v3/user.js b/website/src/controllers/api-v3/user.js index f0d4b8d925..f76c785369 100644 --- a/website/src/controllers/api-v3/user.js +++ b/website/src/controllers/api-v3/user.js @@ -24,7 +24,7 @@ let api = {}; * @apiName UserGet * @apiGroup User * - * @apiSuccess {Object} user The user object + * @apiSuccess {Object} data The user object */ api.getUser = { method: 'GET', @@ -51,7 +51,7 @@ api.getUser = { * @apiName UserGetBuyList * @apiGroup User * - * @apiSuccess {Object} list The buy list + * @apiSuccess {Object} data The buy list */ api.getBuyList = { method: 'GET', @@ -141,12 +141,13 @@ let checkPreferencePurchase = (user, path, item) => { }; /** - * @api {put} /api/v3/user Update the user. Example body: {'stats.hp':50, 'preferences.background': 'beach'} + * @api {put} /api/v3/user Update the user. + * @apiDescription Example body: {'stats.hp':50, 'preferences.background': 'beach'} * @apiVersion 3.0.0 * @apiName UserUpdate * @apiGroup User * - * @apiSuccess user object The updated user object + * @apiSuccess {object} data The updated user object */ api.updateUser = { method: 'PUT', @@ -175,14 +176,14 @@ api.updateUser = { }; /** - * @api {delete} /api/v3/user DELETE an authenticated user's profile + * @api {delete} /api/v3/user DELETE an authenticated user's account * @apiVersion 3.0.0 * @apiName UserDelete * @apiGroup User * - * @apiParam {string} password The user's password unless it's a Facebook account + * @apiParam {string} password The user's password (unless it's a Facebook account) * - * @apiSuccess {Object} empty An empty Object + * @apiSuccess {Object} data An empty Object */ api.deleteUser = { method: 'DELETE', @@ -242,7 +243,9 @@ function _cleanChecklist (task) { * @apiVersion 3.0.0 * @apiName UserGetAnonymized * @apiGroup User - * @apiSuccess {Object} object The object { user, tasks } + * + * @apiSuccess {Object} data.user + * @apiSuccess {Array} data.tasks **/ api.getUserAnonymized = { method: 'GET', @@ -309,7 +312,7 @@ const partyMembersFields = 'profile.name stats achievements items.special'; * @apiParam {string} spellId The spell to cast. * @apiParam {UUID} targetId Optional query parameter, the id of the target when casting a spell on a party member or a task. * - * @apiSuccess mixed Will return the modified targets. For party members only the necessary fields will be populated. + * @apiSuccess data Will return the modified targets. For party members only the necessary fields will be populated. */ api.castSpell = { method: 'POST', @@ -419,7 +422,7 @@ api.castSpell = { * @apiName UserSleep * @apiGroup User * - * @apiSuccess {Object} Will return an object with the new `user.preferences.sleep` value. Example `{preferences: {sleep: true}}` + * @apiSuccess {boolean} data user.preferences.sleep */ api.sleep = { method: 'POST', @@ -429,7 +432,7 @@ api.sleep = { let user = res.locals.user; let sleepRes = common.ops.sleep(user); await user.save(); - res.respond(200, sleepRes); + res.respond(200, ...sleepRes); }, }; @@ -439,7 +442,9 @@ api.sleep = { * @apiName UserAllocate * @apiGroup User * - * @apiSuccess {Object} Returs `user.stats` + * @apiParam {string} stat Query parameter - Defaults to 'str', mast be one of be of str, con, int or per + * + * @apiSuccess {Object} data user.stats */ api.allocate = { method: 'POST', @@ -449,7 +454,7 @@ api.allocate = { let user = res.locals.user; let allocateRes = common.ops.allocate(user, req); await user.save(); - res.respond(200, allocateRes); + res.respond(200, ...allocateRes); }, }; @@ -459,7 +464,7 @@ api.allocate = { * @apiName UserAllocateNow * @apiGroup User * - * @apiSuccess {Object} data `stats` + * @apiSuccess {Object} data user.stats */ api.allocateNow = { method: 'POST', @@ -469,21 +474,18 @@ api.allocateNow = { let user = res.locals.user; let allocateNowRes = common.ops.allocateNow(user, req); await user.save(); - res.respond(200, allocateNowRes); + res.respond(200, ...allocateNowRes); }, }; /** - * @api {post} /api/v3/user/buy/:key Buy a content item. + * @api {post} /user/buy/:key Buy gear, armoire or potion + * @apiDescription Under the hood uses UserBuyGear, UserBuyPotion and UserBuyArmoire * @apiVersion 3.0.0 * @apiName UserBuy * @apiGroup User * * @apiParam {string} key The item to buy. - * - * @apiSuccess {Object} data `items, achievements, stats, flags` - * @apiSuccess {object} armoireResp Optional extra item given by the armoire - * @apiSuccess {string} message */ api.buy = { method: 'POST', @@ -493,20 +495,95 @@ api.buy = { let user = res.locals.user; let buyRes = common.ops.buy(user, req, res.analytics); await user.save(); - res.respond(200, buyRes); + res.respond(200, ...buyRes); }, }; /** - * @api {post} /api/v3/user/buy-mystery-set/:key Buy a mystery set. + * @api {post} /user/buy-gear/:key Buy a piece of gear. + * @apiVersion 3.0.0 + * @apiName UserBuyGear + * @apiGroup User + * + * @apiParam {string} key The item to buy. + * + * @apiSuccess {object} data.items user.items + * @apiSuccess {object} data.flags user.flags + * @apiSuccess {object} data.achievements user.achievements + * @apiSuccess {object} data.stats user.stats + * @apiSuccess {string} message Success message + */ +api.buyGear = { + method: 'POST', + middlewares: [authWithHeaders()], + url: '/user/buy-gear/:key', + async handler (req, res) { + let user = res.locals.user; + let buyGearRes = common.ops.buyGear(user, req, res.analytics); + await user.save(); + res.respond(200, ...buyGearRes); + }, +}; + +/** + * @api {post} /user/buy-armoire Buy an armoire item. + * @apiVersion 3.0.0 + * @apiName UserBuyArmoire + * @apiGroup User + * + * @apiParam {string} key The item to buy. + * + * @apiSuccess {object} data.items user.items + * @apiSuccess {object} data.flags user.flags + * @apiSuccess {object} data.armoire Extra item given by the armoire + * @apiSuccess {string} message Success message + */ +api.buyArmoire = { + method: 'POST', + middlewares: [authWithHeaders()], + url: '/user/buy-armoire', + async handler (req, res) { + let user = res.locals.user; + let buyArmoireResponse = common.ops.buyArmoire(user, req, res.analytics); + await user.save(); + res.respond(200, ...buyArmoireResponse); + }, +}; + +/** + * @api {post} /user/buy-potion Buy a potion. + * @apiVersion 3.0.0 + * @apiName UserBuyPotion + * @apiGroup User + * + * @apiParam {string} key The item to buy. + * + * @apiSuccess {Object} data user.stats + * @apiSuccess {string} message Success message + */ +api.buyPotion = { + method: 'POST', + middlewares: [authWithHeaders()], + url: '/user/buy-potion', + async handler (req, res) { + let user = res.locals.user; + let buyPotionResponse = common.ops.buyPotion(user, req, res.analytics); + await user.save(); + res.respond(200, ...buyPotionResponse); + }, +}; + +/** + * @api {post} /user/buy-mystery-set/:key Buy a mystery set. * @apiVersion 3.0.0 * @apiName UserBuyMysterySet * @apiGroup User * * @apiParam {string} key The mystery set to buy. * - * @apiSuccess {Object} data `items, purchased.plan.consecutive` - * @apiSuccess {string} message + * @apiSuccess {Object} data.items user.items + * @apiSuccess {Object} data.purchasedPlanConsecutive user.purchased.plan.consecutive + * @apiSuccess {string} message Success message */ api.buyMysterySet = { method: 'POST', @@ -516,7 +593,7 @@ api.buyMysterySet = { let user = res.locals.user; let buyMysterySetRes = common.ops.buyMysterySet(user, req, res.analytics); await user.save(); - res.respond(200, buyMysterySetRes); + res.respond(200, ...buyMysterySetRes); }, }; @@ -528,8 +605,8 @@ api.buyMysterySet = { * * @apiParam {string} key The quest spell to buy. * - * @apiSuccess {Object} data `items.quests` - * @apiSuccess {string} message + * @apiSuccess {Object} data `user.items.quests` + * @apiSuccess {string} message Success message */ api.buyQuest = { method: 'POST', @@ -539,7 +616,7 @@ api.buyQuest = { let user = res.locals.user; let buyQuestRes = common.ops.buyQuest(user, req, res.analytics); await user.save(); - res.respond(200, buyQuestRes); + res.respond(200, ...buyQuestRes); }, }; @@ -551,8 +628,9 @@ api.buyQuest = { * * @apiParam {string} key The special spell to buy. * - * @apiSuccess {Object} data `items, stats` - * @apiSuccess {string} message + * @apiSuccess {Object} data.stats user.stats + * @apiSuccess {Object} data.items user.items + * @apiSuccess {string} message Success message */ api.buySpecialSpell = { method: 'POST', @@ -562,7 +640,7 @@ api.buySpecialSpell = { let user = res.locals.user; let buySpecialSpellRes = common.ops.buySpecialSpell(user, req); await user.save(); - res.respond(200, buySpecialSpellRes); + res.respond(200, ...buySpecialSpellRes); }, }; @@ -575,7 +653,7 @@ api.buySpecialSpell = { * @apiParam {string} egg The egg to use. * @apiParam {string} hatchingPotion The hatching potion to use. * - * @apiSuccess {Object} data `user.items` + * @apiSuccess {Object} data user.items * @apiSuccess {string} message */ api.hatch = { @@ -586,7 +664,7 @@ api.hatch = { let user = res.locals.user; let hatchRes = common.ops.hatch(user, req); await user.save(); - res.respond(200, hatchRes); + res.respond(200, ...hatchRes); }, }; @@ -596,11 +674,11 @@ api.hatch = { * @apiName UserEquip * @apiGroup User * - * @apiParam {string} type - * @apiParam {string} key + * @apiParam {string} type The type of item to equip (mount, pet, costume or equipped) + * @apiParam {string} key The item to equip * - * @apiSuccess {Object} data `user.items` - * @apiSuccess {string} message Optional + * @apiSuccess {Object} data user.items + * @apiSuccess {string} message Optional success message */ api.equip = { method: 'POST', @@ -610,7 +688,7 @@ api.equip = { let user = res.locals.user; let equipRes = common.ops.equip(user, req); await user.save(); - res.respond(200, equipRes); + res.respond(200, ...equipRes); }, }; @@ -623,8 +701,8 @@ api.equip = { * @apiParam {string} pet * @apiParam {string} food * - * @apiSuccess {Object} data The fed pet - * @apiSuccess {string} message + * @apiSuccess {number} data The pet value + * @apiSuccess {string} message Success message */ api.feed = { method: 'POST', @@ -634,19 +712,23 @@ api.feed = { let user = res.locals.user; let feedRes = common.ops.feed(user, req); await user.save(); - res.respond(200, feedRes); + res.respond(200, ...feedRes); }, }; /** * @api {post} /api/v3/user/change-class Change class. +* @apiDescription User must be at least level 10. If ?class is defined and user.flags.classSelected is false it'll change the class. If user.preferences.disableClasses it'll enable classes, otherwise it sets user.flags.classSelected to false (costs 3 gems) * @apiVersion 3.0.0 * @apiName UserChangeClass * @apiGroup User * -* @apiParam {string} class ?class={warrior|rogue|wizard|healer}. If missing will +* @apiParam {string} class Query parameter - ?class={warrior|rogue|wizard|healer}. * -* @apiSuccess {Object} data `stats flags items preferences` +* @apiSuccess {object} data.flags user.flags +* @apiSuccess {object} data.stats user.stats +* @apiSuccess {object} data.preferences user.preferences +* @apiSuccess {object} data.items user.items */ api.changeClass = { method: 'POST', @@ -656,7 +738,7 @@ api.changeClass = { let user = res.locals.user; let changeClassRes = common.ops.changeClass(user, req, res.analytics); await user.save(); - res.respond(200, changeClassRes); + res.respond(200, ...changeClassRes); }, }; @@ -666,7 +748,9 @@ api.changeClass = { * @apiName UserDisableClasses * @apiGroup User * -* @apiSuccess {Object} data `stats flags preferences` +* @apiSuccess {object} data.flags user.flags +* @apiSuccess {object} data.stats user.stats +* @apiSuccess {object} data.preferences user.preferences */ api.disableClasses = { method: 'POST', @@ -676,7 +760,7 @@ api.disableClasses = { let user = res.locals.user; let disableClassesRes = common.ops.disableClasses(user, req); await user.save(); - res.respond(200, disableClassesRes); + res.respond(200, ...disableClassesRes); }, }; @@ -686,10 +770,12 @@ api.disableClasses = { * @apiName UserPurchase * @apiGroup User * -* @apiParam {string} type Type of item to purchase +* @apiParam {string} type Type of item to purchase. Must be one of: gem, gems, eggs, hatchingPotions, food, quests or gear * @apiParam {string} key Item's key * -* @apiSuccess {Object} data `items balance` +* @apiSuccess {object} data.items user.items +* @apiSuccess {number} data.balance user.balance +* @apiSuccess {string} message Success message */ api.purchase = { method: 'POST', @@ -697,9 +783,9 @@ api.purchase = { url: '/user/purchase/:type/:key', async handler (req, res) { let user = res.locals.user; - let purchaseResponse = common.ops.purchase(user, req, res.analytics); + let purchaseRes = common.ops.purchase(user, req, res.analytics); await user.save(); - res.respond(200, purchaseResponse); + res.respond(200, ...purchaseRes); }, }; @@ -709,10 +795,12 @@ api.purchase = { * @apiName UserPurchaseHourglass * @apiGroup User * -* @apiParam {string} type {pets|mounts}. The type of item to purchase +* @apiParam {string} type The type of item to purchase (pets or mounts) * @apiParam {string} key Ex: {MantisShrimp-Base}. The key for the mount/pet * -* @apiSuccess {Object} data `items purchased.plan.consecutive` +* @apiSuccess {object} data.items user.items +* @apiSuccess {object} data.purchasedPlanConsecutive user.purchased.plan.consecutive +* @apiSuccess {string} message Success message */ api.userPurchaseHourglass = { method: 'POST', @@ -720,9 +808,9 @@ api.userPurchaseHourglass = { url: '/user/purchase-hourglass/:type/:key', async handler (req, res) { let user = res.locals.user; - let purchaseHourglassResponse = common.ops.purchaseHourglass(user, req, res.analytics); + let purchaseHourglassRes = common.ops.purchaseHourglass(user, req, res.analytics); await user.save(); - res.respond(200, purchaseHourglassResponse); + res.respond(200, ...purchaseHourglassRes); }, }; @@ -734,7 +822,9 @@ api.userPurchaseHourglass = { * * @apiParam {string} cardType Type of card to read * -* @apiSuccess {Object} data `items.special flags.cardReceived` +* @apiSuccess {object} data.specialItems user.items.special +* @apiSuccess {boolean} data.cardReceived user.flags.cardReceived +* @apiSuccess {string} message Success message */ api.readCard = { method: 'POST', @@ -742,9 +832,9 @@ api.readCard = { url: '/user/read-card/:cardType', async handler (req, res) { let user = res.locals.user; - let readCardResponse = common.ops.readCard(user, req); + let readCardRes = common.ops.readCard(user, req); await user.save(); - res.respond(200, readCardResponse); + res.respond(200, ...readCardRes); }, }; @@ -754,7 +844,8 @@ api.readCard = { * @apiName UserOpenMysteryItem * @apiGroup User * -* @apiSuccess {Object} data `user.items.gear.owned` +* @apiSuccess {Object} data user.items.gear.owned +* @apiSuccess {string} message Success message */ api.userOpenMysteryItem = { method: 'POST', @@ -762,66 +853,78 @@ api.userOpenMysteryItem = { url: '/user/open-mystery-item', async handler (req, res) { let user = res.locals.user; - let openMysteryItemResponse = common.ops.openMysteryItem(user, req, res.analytics); + let openMysteryItemRes = common.ops.openMysteryItem(user, req, res.analytics); await user.save(); - res.respond(200, openMysteryItemResponse); + res.respond(200, ...openMysteryItemRes); }, }; -/** - * @api {post} /api/v3/user/webhook - * @apiVersion 3.0.0 - * @apiName UserAddWebhook - * @apiGroup User - * @apiSuccess {Object} webhook The created webhook - **/ +/* +* @api {post} /api/v3/user/webhook +* @apiVersion 3.0.0 +* @apiName UserAddWebhook +* @apiGroup User +* +* @apiParam {string} url Body parameter - The webhook's urò +* @apiParam {boolean} enabled Body parameter - If the webhook should be enabled +* +* @apiSuccess {Object} data The created webhook +*/ api.addWebhook = { method: 'POST', middlewares: [authWithHeaders()], url: '/user/webhook', async handler (req, res) { let user = res.locals.user; - let result = common.ops.addWebhook(user, req); + let addWebhookRes = common.ops.addWebhook(user, req); await user.save(); - res.respond(200, result); + res.respond(200, ...addWebhookRes); }, }; -/** - * @api {put} /api/v3/user/webhook/:id - * @apiVersion 3.0.0 - * @apiName UserUpdateWebhook - * @apiGroup User - * @apiSuccess {Object} webhook The updated webhook - **/ +/* +* @api {put} /api/v3/user/webhook/:id +* @apiVersion 3.0.0 +* @apiName UserUpdateWebhook +* @apiGroup User +* +* @apiParam {UUID} id The id of the webhook to update +* @apiParam {string} url Body parameter - The webhook's urò +* @apiParam {boolean} enabled Body parameter - If the webhook should be enabled +* +* @apiSuccess {Object} data The updated webhook +*/ api.updateWebhook = { method: 'PUT', middlewares: [authWithHeaders()], url: '/user/webhook/:id', async handler (req, res) { let user = res.locals.user; - let result = common.ops.updateWebhook(user, req); + let updateWebhookRes = common.ops.updateWebhook(user, req); await user.save(); - res.respond(200, result); + res.respond(200, ...updateWebhookRes); }, }; -/** - * @api {delete} /api/v3/user/webhook/:id - * @apiVersion 3.0.0 - * @apiName UserDeleteWebhook - * @apiGroup User - * @apiSuccess {Object} webhooks The user webhooks - **/ +/* +* @api {delete} /api/v3/user/webhook/:id +* @apiVersion 3.0.0 +* @apiName UserDeleteWebhook +* @apiGroup User +* +* @apiParam {UUID} id The id of the webhook to delete +* +* @apiSuccess {Object} data The user webhooks +*/ api.deleteWebhook = { method: 'DELETE', middlewares: [authWithHeaders()], url: '/user/webhook/:id', async handler (req, res) { let user = res.locals.user; - common.ops.deleteWebhook(user, req); + let deleteWebhookRes = common.ops.deleteWebhook(user, req); await user.save(); - res.respond(200, {}); + res.respond(200, ...deleteWebhookRes); }, }; @@ -831,7 +934,8 @@ api.deleteWebhook = { * @apiName UserReleasePets * @apiGroup User * -* @apiSuccess {Object} data `user.items.pets` +* @apiSuccess {Object} data.items `user.items.pets` +* @apiSuccess {string} message Success message */ api.userReleasePets = { method: 'POST', @@ -839,9 +943,9 @@ api.userReleasePets = { url: '/user/release-pets', async handler (req, res) { let user = res.locals.user; - let releasePetsResponse = common.ops.releasePets(user, req, res.analytics); + let releasePetsRes = common.ops.releasePets(user, req, res.analytics); await user.save(); - res.respond(200, releasePetsResponse); + res.respond(200, ...releasePetsRes); }, }; @@ -850,8 +954,11 @@ api.userReleasePets = { * @apiVersion 3.0.0 * @apiName UserReleaseBoth * @apiGroup User -* -* @apiSuccess {Object} data `user.items.gear.owned` + +* @apiSuccess {Object} data.achievements +* @apiSuccess {Object} data.items +* @apiSuccess {number} data.balance +* @apiSuccess {string} message Success message */ api.userReleaseBoth = { method: 'POST', @@ -859,9 +966,9 @@ api.userReleaseBoth = { url: '/user/release-both', async handler (req, res) { let user = res.locals.user; - let releaseBothResponse = common.ops.releaseBoth(user, req, res.analytics); + let releaseBothRes = common.ops.releaseBoth(user, req, res.analytics); await user.save(); - res.respond(200, releaseBothResponse); + res.respond(200, ...releaseBothRes); }, }; @@ -871,7 +978,8 @@ api.userReleaseBoth = { * @apiName UserReleaseMounts * @apiGroup User * -* @apiSuccess {Object} data `mounts` +* @apiSuccess {Object} data user.items.mounts +* @apiSuccess {string} message Success message */ api.userReleaseMounts = { method: 'POST', @@ -879,19 +987,24 @@ api.userReleaseMounts = { url: '/user/release-mounts', async handler (req, res) { let user = res.locals.user; - let releaseMountsResponse = common.ops.releaseMounts(user, req, res.analytics); + let releaseMountsRes = common.ops.releaseMounts(user, req, res.analytics); await user.save(); - res.respond(200, releaseMountsResponse); + res.respond(200, ...releaseMountsRes); }, }; /* -* @api {post} /api/v3/user/sell/:type/:key Sells user's items. +* @api {post} /api/v3/user/sell/:type/:key Sells a gold item owned by the user. * @apiVersion 3.0.0 * @apiName UserSell * @apiGroup User * -* @apiSuccess {Object} data `stats items` +* @apiParam {string} type The type of item to sell. Acceptable types are eggs, hatchingPotions, food +* @apiParam {string} key The key of the item +* +* @apiSuccess {Object} data.stats +* @apiSuccess {Object} data.items +* @apiSuccess {string} message Success message */ api.userSell = { method: 'POST', @@ -899,9 +1012,9 @@ api.userSell = { url: '/user/sell/:type/:key', async handler (req, res) { let user = res.locals.user; - let sellResponse = common.ops.sell(user, req); + let sellRes = common.ops.sell(user, req); await user.save(); - res.respond(200, sellResponse); + res.respond(200, ...sellRes); }, }; @@ -911,7 +1024,12 @@ api.userSell = { * @apiName UserUnlock * @apiGroup User * -* @apiSuccess {Object} data `purchased preferences items` +* @apiParam {string} path Query parameter. The path to unlock +* +* @apiSuccess {Object} data.purchased +* @apiSuccess {Object} data.items` +* @apiSuccess {Object} data.preferences` +* @apiSuccess {string} message` */ api.userUnlock = { method: 'POST', @@ -919,9 +1037,9 @@ api.userUnlock = { url: '/user/unlock', async handler (req, res) { let user = res.locals.user; - let unlockResponse = common.ops.unlock(user, req); + let unlockRes = common.ops.unlock(user, req); await user.save(); - res.respond(200, unlockResponse); + res.respond(200, ...unlockRes); }, }; @@ -931,7 +1049,8 @@ api.userUnlock = { * @apiName UserRevive * @apiGroup User * -* @apiSuccess {Object} data `user.items` +* @apiSuccess {Object} data user.items +* @apiSuccess {string} message Success message */ api.userRevive = { method: 'POST', @@ -939,9 +1058,9 @@ api.userRevive = { url: '/user/revive', async handler (req, res) { let user = res.locals.user; - let reviveResponse = common.ops.revive(user, req, res.analytics); + let reviveRes = common.ops.revive(user, req, res.analytics); await user.save(); - res.respond(200, reviveResponse); + res.respond(200, ...reviveRes); }, }; @@ -951,7 +1070,9 @@ api.userRevive = { * @apiName UserRebirth * @apiGroup User * -* @apiSuccess {Object} data `user` +* @apiSuccess {Object} data.userr +* @apiSuccess {array} data.tasks User's modified tasks (no rewards) +* @apiSuccess {string} message Success message */ api.userRebirth = { method: 'POST', @@ -964,22 +1085,25 @@ api.userRebirth = { type: {$in: ['daily', 'habit', 'todo']}, }; let tasks = await Tasks.Task.find(query).exec(); - let rebirthResponse = common.ops.rebirth(user, tasks, req, res.analytics); + let rebirthRes = common.ops.rebirth(user, tasks, req, res.analytics); await user.save(); await Q.all(tasks.map(task => task.save())); - res.respond(200, rebirthResponse); + res.respond(200, ...rebirthRes); }, }; /** - * @api {post} /api/v3/user/block/:uuid blocks and unblocks a user + * @api {post} /api/v3/user/block/:uuid Blocks and unblocks a user * @apiVersion 3.0.0 * @apiName BlockUser * @apiGroup User - * @apiSuccess user.inbox.blocks + * + * @apiParam {UUID} uuid The uuid of the user to block / unblock + * + * @apiSuccess {array} data user.inbox.blocks **/ api.blockUser = { method: 'POST', @@ -987,18 +1111,21 @@ api.blockUser = { url: '/user/block/:uuid', async handler (req, res) { let user = res.locals.user; - let blocks = common.ops.blockUser(user, req); + let blockUserRes = common.ops.blockUser(user, req); await user.save(); - res.respond(200, blocks); + res.respond(200, ...blockUserRes); }, }; /** - * @api {delete} /api/v3/user/messages/:id delete this message + * @api {delete} /api/v3/user/messages/:id Delete a message * @apiVersion 3.0.0 * @apiName deleteMessage * @apiGroup User - * @apiSuccess user.inbox.messages + * + * @apiParam {UUID} id The id of the message to delete + * + * @apiSuccess {object} data user.inbox.messages **/ api.deleteMessage = { method: 'DELETE', @@ -1006,18 +1133,19 @@ api.deleteMessage = { url: '/user/messages/:id', async handler (req, res) { let user = res.locals.user; - let messages = common.ops.deletePM(user, req); + let deletePMRes = common.ops.deletePM(user, req); await user.save(); - res.respond(200, messages); + res.respond(200, ...deletePMRes); }, }; /** - * @api {delete} /api/v3/user/messages delete all messages + * @api {delete} /api/v3/user/messages Delete all messages * @apiVersion 3.0.0 * @apiName clearMessages * @apiGroup User - * @apiSuccess user.inbox.messages + * + * @apiSuccess {object} data user.inbox.messages **/ api.clearMessages = { method: 'DELETE', @@ -1025,9 +1153,9 @@ api.clearMessages = { url: '/user/messages', async handler (req, res) { let user = res.locals.user; - let PMs = common.ops.clearPMs(user, req); + let clearPMsRes = common.ops.clearPMs(user, req); await user.save(); - res.respond(200, PMs); + res.respond(200, ...clearPMsRes); }, }; @@ -1037,7 +1165,9 @@ api.clearMessages = { * @apiName UserReroll * @apiGroup User * -* @apiSuccess {Object} data `user` +* @apiSuccess {Object} data.user +* @apiSuccess {Object} data.tasks User's modified tasks (no rewards) +* @apiSuccess {Object} message Success message */ api.userReroll = { method: 'POST', @@ -1050,14 +1180,14 @@ api.userReroll = { type: {$in: ['daily', 'habit', 'todo']}, }; let tasks = await Tasks.Task.find(query).exec(); - let rerollResponse = common.ops.reroll(user, tasks, req, res.analytics); + let rerollRes = common.ops.reroll(user, tasks, req, res.analytics); let promises = tasks.map(task => task.save()); promises.push(user.save()); await Q.all(promises); - res.respond(200, rerollResponse); + res.respond(200, ...rerollRes); }, }; @@ -1067,7 +1197,11 @@ api.userReroll = { * @apiName UserAddPushDevice * @apiGroup User * -* @apiSuccess {Object} data `pushDevices` +* @apiParam {string} regId The id of the push device +* @apiParam {string} uuid The type of push device +* +* @apiSuccess {Object} data List of push devices +* @apiSuccess {string} message Success message */ api.userAddPushDevice = { method: 'POST', @@ -1076,10 +1210,10 @@ api.userAddPushDevice = { async handler (req, res) { let user = res.locals.user; - let addPushDeviceResponse = common.ops.addPushDevice(user, req); + let addPushDeviceRes = common.ops.addPushDevice(user, req); await user.save(); - res.respond(200, addPushDeviceResponse); + res.respond(200, ...addPushDeviceRes); }, }; @@ -1089,7 +1223,9 @@ api.userAddPushDevice = { * @apiName UserReset * @apiGroup User * -* @apiSuccess {Object} data `user` +* @apiSuccess {Object} data.user +* @apiSuccess {Object} data.tasksToRemove IDs of removed tasks +* @apiSuccess {string} message Success message */ api.userReset = { method: 'POST', @@ -1100,11 +1236,11 @@ api.userReset = { let tasks = await Tasks.Task.find({userId: user._id}).select('_id type challenge').exec(); - let resetResponse = common.ops.reset(user, tasks); + let resetRes = common.ops.reset(user, tasks); - await Q.all([Tasks.Task.remove({_id: {$in: resetResponse.data.tasksToRemove}, userId: user._id}), user.save()]); + await Q.all([Tasks.Task.remove({_id: {$in: resetRes[0].tasksToRemove}, userId: user._id}), user.save()]); - res.respond(200, resetResponse); + res.respond(200, ...resetRes); }, }; diff --git a/website/src/controllers/top-level/auth.js b/website/src/controllers/top-level/auth.js index cf66b5996f..90724ab1f4 100644 --- a/website/src/controllers/top-level/auth.js +++ b/website/src/controllers/top-level/auth.js @@ -1,7 +1,3 @@ -import { - authWithSession, -} from '../../middlewares/api-v3/auth'; - let api = {}; // Internal authentication routes diff --git a/website/src/controllers/top-level/dataexport.js b/website/src/controllers/top-level/dataexport.js index f76e11421c..33e2fee5c2 100644 --- a/website/src/controllers/top-level/dataexport.js +++ b/website/src/controllers/top-level/dataexport.js @@ -26,11 +26,11 @@ const BASE_URL = nconf.get('BASE_URL'); let api = {}; /** - * @api {get} /export/history.csv Export user tasks history in CSV format. History is only available for habits and dailys so todos and rewards won't be included + * @api {get} /export/history.csv Export user tasks history in CSV format. + * @apiDescription History is only available for habits and dailys so todos and rewards won't be included NOTE: Part of the private API that may change at any time. * @apiVersion 3.0.0 * @apiName ExportUserHistory * @apiGroup DataExport - * @apiDescription NOTE: Part of the private API that may change at any time. * * @apiSuccess {string} A cvs file */ diff --git a/website/src/libs/api-v3/i18n.js b/website/src/libs/api-v3/i18n.js index 0486cce3f6..4c424ace39 100644 --- a/website/src/libs/api-v3/i18n.js +++ b/website/src/libs/api-v3/i18n.js @@ -68,8 +68,7 @@ langCodes.forEach((code) => { momentLangs[code] = f; } catch (e) { // eslint-disable-lint no-empty - // TODO implement some type of error loggin? - // The catch block is mandatory so can't be removed + // The catch block is mandatory so it won't crash the server } }); diff --git a/website/src/middlewares/api-v3/errorHandler.js b/website/src/middlewares/api-v3/errorHandler.js index a4194435c4..d775292a5b 100644 --- a/website/src/middlewares/api-v3/errorHandler.js +++ b/website/src/middlewares/api-v3/errorHandler.js @@ -62,6 +62,7 @@ module.exports = function errorHandler (err, req, res, next) { // eslint-disable } let jsonRes = { + success: false, error: responseErr.name, message: responseErr.message, }; @@ -72,5 +73,5 @@ module.exports = function errorHandler (err, req, res, next) { // eslint-disable // In some occasions like when invalid JSON is supplied `res.respond` might be not yet avalaible, // in this case we use the standard res.status(...).json(...) - return res.respond ? res.respond(responseErr.httpCode, jsonRes) : res.status(responseErr.httpCode).json(jsonRes); + return res.status(responseErr.httpCode).json(jsonRes); }; diff --git a/website/src/middlewares/api-v3/response.js b/website/src/middlewares/api-v3/response.js index a3a84fd818..335d51a2ff 100644 --- a/website/src/middlewares/api-v3/response.js +++ b/website/src/middlewares/api-v3/response.js @@ -1,6 +1,14 @@ module.exports = function responseHandler (req, res, next) { - res.respond = function respond (status = 200, data = {}) { - res.status(status).json(data); + // Only used for successful responses + res.respond = function respond (status = 200, data = {}, message) { + let response = { + success: status < 400, + data, + }; + + if (message) response.message = message; + + res.status(status).json(response); }; next(); diff --git a/website/src/models/group.js b/website/src/models/group.js index a5a43a10ce..9542500d91 100644 --- a/website/src/models/group.js +++ b/website/src/models/group.js @@ -31,7 +31,7 @@ export let schema = new Schema({ type: {type: String, enum: ['guild', 'party'], required: true}, privacy: {type: String, enum: ['private', 'public'], default: 'private', required: true}, // _v: {type: Number,'default': 0}, // TODO ? - chat: Array, // TODO ? + chat: Array, /* # [{ # timestamp: Date @@ -44,7 +44,7 @@ export let schema = new Schema({ */ leaderOnly: { // restrict group actions to leader (members can't do them) challenges: {type: Boolean, default: false, required: true}, - // invites: {type:Boolean, 'default':false} // TODO ? + // invites: {type:Boolean, 'default':false} }, memberCount: {type: Number, default: 1}, challengeCount: {type: Number, default: 0}, @@ -66,7 +66,6 @@ export let schema = new Schema({ // Shows boolean for each party-member who has accepted the quest. Eg {UUID: true, UUID: false}. Once all users click // 'Accept', the quest begins. If a false user waits too long, probably a good sign to prod them or boot them. // TODO when booting user, remove from .joined and check again if we can now start the quest - // TODO as long as quests are party only we can keep it here members: {type: Schema.Types.Mixed, default: () => { return {}; }}, @@ -277,7 +276,7 @@ schema.methods.sendChat = function sendChat (message, user) { this.chat.unshift(chatDefaults(message, user)); this.chat.splice(200); - // Kick off chat notifications in the background. // TODO refactor + // Kick off chat notifications in the background. let lastSeenUpdate = {$set: {}, $inc: {_v: 1}}; lastSeenUpdate.$set[`newMessages.${this._id}`] = {name: this.name, value: true}; diff --git a/website/src/models/user.js b/website/src/models/user.js index 76c730ec26..6ee6b59ca8 100644 --- a/website/src/models/user.js +++ b/website/src/models/user.js @@ -231,7 +231,6 @@ export let schema = new Schema({ }, history: { - // TODO absolutely preen these for everyone exp: Array, // [{date: Date, value: Number}], // big peformance issues if these are defined todos: Array, // [{data: Date, value: Number}] // big peformance issues if these are defined }, diff --git a/website/views/options/profile.jade b/website/views/options/profile.jade index 4777cd033c..7b5aba8546 100644 --- a/website/views/options/profile.jade +++ b/website/views/options/profile.jade @@ -256,8 +256,9 @@ script(id='partials/options.profile.profile.html', type='text/ng-template') //{{profile.profile.blurb | linky:'_blank'}} form.col-md-4(ng-show='_editing.profile', ng-submit='save()') + .alert.alert-info.alert-sm + !=env.t("communityGuidelinesWarning") input.btn.btn-primary(type='submit', value=env.t('save')) - // TODO use photo-upload instead: https://groups.google.com/forum/?fromgroups=#!topic/derbyjs/xMmADvxBOak .form-group label=env.t('displayName') diff --git a/website/views/options/settings.jade b/website/views/options/settings.jade index 5c27572810..e5d9896e61 100644 --- a/website/views/options/settings.jade +++ b/website/views/options/settings.jade @@ -232,6 +232,25 @@ script(type='text/ng-template', id='partials/options.settings.api.html') pre.prettyprint {{user.apiToken}} h6=env.t('qrCode') img.img-rendering-auto(src='https://chart.googleapis.com/chart?cht=qr&chs=200x200&chl=%7B%22address%22%3A%22https%3A%2F%2Fhabitrpg.com%22%2C%22user%22%3A%22{{user.id}}%22%2C%22key%22%3A%22{{user.apiToken}}%22%7D&choe=UTF-8&chld=L', alt='qrcode') + br + h3=env.t('thirdPartyApps') + ul + li + a(target='_blank' href='https://www.beeminder.com/habitica')=env.t('beeminder') + br + =env.t('beeminderDesc') + li + a(target='_blank' href='https://chrome.google.com/webstore/detail/habitrpg-chat-client/hidkdfgonpoaiannijofifhjidbnilbb')=env.t('chromeChatExtension') + br + =env.t('chromeChatExtensionDesc') + li + a(target='_blank' ng-href='http://data.habitrpg.com?uuid={{user._id}}')=env.t('dataTool') + br + =env.t('dataToolDesc') + li + !=env.t('otherExtensions') + br + =env.t('otherDesc') hr diff --git a/website/views/shared/new-stuff.jade b/website/views/shared/new-stuff.jade index 7bdf19c046..5ac9bb44b3 100644 --- a/website/views/shared/new-stuff.jade +++ b/website/views/shared/new-stuff.jade @@ -1,26 +1,58 @@ -h2 4/14/2016 - ANDROID APP UPDATES! +h2 4/15/2016 - iOS AND ANDROID UPDATES, AND ANOTHER BEGUILEMENT STRIKE! hr + tr + td + h3 iOS Update: Fixes Galore + p We've released a new iOS update focusing on stability and bug fixes! + br + p It includes multiple crash fixes, most notably for iOS 7 and for quests with rage bars, and clears up frustrating bugs such as the issues with timezones, the duplicating items bug, and the fact that completed to-dos used to still cause reminders. Be sure to download it now for a better Habitica experience! + br + p Thank you very much for your patience! If you like the improvements that we’ve been making to our app, please consider reviewing this new version. It really helps us out! Also, old reviews get hidden, but if you go to the review section you can re-post it again with a single tap. We hope you enjoy the update! + p.small.muted by viirus, schrockblock, a-ayyash, and nivl4 tr td .Pet-Wolf-Base.pull-left.slight-right-margin h3 Android App Update: Pets, Enchanted Armoire, and More! - p We've updated the Android app to include a ton of features, including: + p In case you missed it, yesterday we updated the Android app to include a ton of features, including: br ul li Pets and Mounts! Now you can use the app to hatch pets, feed them, and equip pets and mounts. li The World Boss! Now you can view the World Boss Battle from the Tavern on the app! - li The Enchanted Armoire! Tap right from the app for a chance at Equipment, experience, or food. - li Edit Attribute Points! Control how Attribute Points are assigned directly from the app. + li The Enchanted Armoire! Tap right from the app for a chance at equipment, Experience, or food. + li Edit Task Attributes! Assign attributes to tasks for use with task-based point allocation. li Crash and Bug Fixes! Including fixes for incorrectly-locked backgrounds, date display, editing task attribution allocation, and more. br p If you like what we're doing with the app, please consider leaving a review! It means a lot to us. p.small.muted by viirus, saranlert, schrockblock, ablx and jeubank12 + tr + td + .npc_matt_broken.pull-right + h3 World Boss: Second Beguilement Strike! + p In more frightening news, the Be-Wilder has used another Beguilement Strike! + br + p Once again the Be-Wilder has dazzled us into neglecting our Dailies, and now it has attacked Matt the Beast Master! With a swirl of mist, Matt transforms into a terrifying winged creature, and all the pets and mounts howl sadly in their stables. Quickly, stay focused on your tasks to defeat this dastardly distraction! if menuItem !== 'oldNews' hr a(href='/static/old-news', target='_blank') Read older news mixin oldNews + h2 4/14/2016 - ANDROID APP UPDATES! + tr + td + .Pet-Wolf-Base.pull-left.slight-right-margin + h3 Android App Update: Pets, Enchanted Armoire, and More! + p We've updated the Android app to include a ton of features, including: + br + ul + li Pets and Mounts! Now you can use the app to hatch pets, feed them, and equip pets and mounts. + li The World Boss! Now you can view the World Boss Battle from the Tavern on the app! + li The Enchanted Armoire! Tap right from the app for a chance at equipment, Experience, or food. + li Edit Task Attributes! Assign attributes to tasks for use with task-based point allocation. + li Crash and Bug Fixes! Including fixes for incorrectly-locked backgrounds, date display, editing task attribution allocation, and more. + br + p If you like what we're doing with the app, please consider leaving a review! It means a lot to us. + p.small.muted by viirus, saranlert, schrockblock, ablx and jeubank12 h2 4/12/2016 - APRIL PET QUEST: FALCON! tr td