diff --git a/migrations/archive/2020/20200218_pet_color_achievements.js b/migrations/archive/2020/20200218_pet_color_achievements.js new file mode 100644 index 0000000000..6639d1fd86 --- /dev/null +++ b/migrations/archive/2020/20200218_pet_color_achievements.js @@ -0,0 +1,82 @@ +/* eslint-disable no-console */ +const MIGRATION_NAME = '20200218_pet_color_achievements'; +import { model as User } from '../../../website/server/models/user'; + +const progressCount = 1000; +let count = 0; + +async function updateUser (user) { + count++; + + const set = { + migration: MIGRATION_NAME, + }; + + if (user && user.items && user.items.pets) { + const pets = user.items.pets; + if (pets['Wolf-CottonCandyPink'] > 0 + && pets['TigerCub-CottonCandyPink'] > 0 + && pets['PandaCub-CottonCandyPink'] > 0 + && pets['LionCub-CottonCandyPink'] > 0 + && pets['Fox-CottonCandyPink'] > 0 + && pets['FlyingPig-CottonCandyPink'] > 0 + && pets['Dragon-CottonCandyPink'] > 0 + && pets['Cactus-CottonCandyPink'] > 0 + && pets['BearCub-CottonCandyPink'] > 0) { + set['achievements.tickledPink'] = true; + } + } + + if (user && user.items && user.items.mounts) { + const mounts = user.items.mounts; + if (mounts['Wolf-CottonCandyPink'] + && mounts['TigerCub-CottonCandyPink'] + && mounts['PandaCub-CottonCandyPink'] + && mounts['LionCub-CottonCandyPink'] + && mounts['Fox-CottonCandyPink'] + && mounts['FlyingPig-CottonCandyPink'] + && mounts['Dragon-CottonCandyPink'] + && mounts['Cactus-CottonCandyPink'] + && mounts['BearCub-CottonCandyPink'] ) { + set['achievements.rosyOutlook'] = true; + } + } + + if (count % progressCount === 0) console.warn(`${count} ${user._id}`); + + return await User.update({ _id: user._id }, { $set: set }).exec(); +} + +module.exports = async function processUsers () { + let query = { + migration: { $ne: MIGRATION_NAME }, + 'auth.timestamps.loggedin': { $gt: new Date('2020-02-01') }, + }; + + const fields = { + _id: 1, + items: 1, + }; + + while (true) { // eslint-disable-line no-constant-condition + const users = await User // eslint-disable-line no-await-in-loop + .find(query) + .limit(250) + .sort({_id: 1}) + .select(fields) + .lean() + .exec(); + + if (users.length === 0) { + console.warn('All appropriate users found and modified.'); + console.warn(`\n${count} users processed\n`); + break; + } else { + query._id = { + $gt: users[users.length - 1]._id, + }; + } + + await Promise.all(users.map(updateUser)); // eslint-disable-line no-await-in-loop + } +}; diff --git a/website/client/src/assets/css/sprites/spritesmith-largeSprites-0.css b/website/client/src/assets/css/sprites/spritesmith-largeSprites-0.css index 2a6c96d469..883b955aa3 100644 --- a/website/client/src/assets/css/sprites/spritesmith-largeSprites-0.css +++ b/website/client/src/assets/css/sprites/spritesmith-largeSprites-0.css @@ -1,3 +1,9 @@ +.promo_achievement_CottonCandyPink { + background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png'); + background-position: -328px -148px; + width: 204px; + height: 102px; +} .promo_armoire_backgrounds_202002 { background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png'); background-position: -328px 0px; @@ -12,7 +18,7 @@ } .promo_take_this { background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png'); - background-position: -533px -148px; + background-position: -283px -425px; width: 96px; height: 69px; } @@ -30,7 +36,7 @@ } .scene_cake { background-image: url('~@/assets/images/sprites/spritesmith-largeSprites-0.png'); - background-position: -328px -148px; + background-position: -533px -148px; width: 204px; height: 102px; } diff --git a/website/client/src/assets/css/sprites/spritesmith-main-0.css b/website/client/src/assets/css/sprites/spritesmith-main-0.css index fbe4df9b27..adaea6d76f 100644 --- a/website/client/src/assets/css/sprites/spritesmith-main-0.css +++ b/website/client/src/assets/css/sprites/spritesmith-main-0.css @@ -1,222 +1,222 @@ .achievement-alien { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1656px -1480px; + background-position: -1446px -1628px; width: 24px; height: 26px; } .achievement-alien2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -715px -1549px; + background-position: -813px -1549px; width: 48px; height: 52px; } .achievement-allYourBase2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -759px -1480px; + background-position: -1092px -1480px; width: 64px; height: 56px; } .achievement-alpha2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1225px -1628px; + background-position: -1372px -1628px; width: 48px; height: 52px; } .achievement-aridAuthority2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -954px -1480px; + background-position: -1027px -1480px; width: 64px; height: 56px; } .achievement-armor2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1127px -1628px; + background-position: -1274px -1628px; width: 48px; height: 52px; } .achievement-backToBasics2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1411px -1480px; + background-position: -1549px -1480px; width: 48px; height: 56px; } .achievement-bewilder2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1029px -1628px; + background-position: -1176px -1628px; width: 48px; height: 52px; } .achievement-birthday2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -980px -1628px; + background-position: -1127px -1628px; width: 48px; height: 52px; } .achievement-boot2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -931px -1628px; + background-position: -1078px -1628px; width: 48px; height: 52px; } .achievement-bow2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -882px -1628px; + background-position: -1029px -1628px; width: 48px; height: 52px; } .achievement-burnout2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -833px -1628px; + background-position: -980px -1628px; width: 48px; height: 52px; } .achievement-cactus2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -784px -1628px; + background-position: -931px -1628px; width: 48px; height: 52px; } .achievement-cake2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -735px -1628px; + background-position: -882px -1628px; width: 48px; height: 52px; } .achievement-cave2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -686px -1628px; + background-position: -833px -1628px; width: 48px; height: 52px; } .achievement-challenge2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -637px -1628px; + background-position: -784px -1628px; width: 48px; height: 52px; } .achievement-comment2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -588px -1628px; + background-position: -735px -1628px; width: 48px; height: 52px; } .achievement-completedTask2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1362px -1480px; + background-position: -1500px -1480px; width: 48px; height: 56px; } .achievement-congrats2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -490px -1628px; + background-position: -637px -1628px; width: 48px; height: 52px; } .achievement-costumeContest2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -441px -1628px; + background-position: -588px -1628px; width: 48px; height: 52px; } .achievement-createdTask2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1313px -1480px; + background-position: -1451px -1480px; width: 48px; height: 56px; } .achievement-dilatory2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -343px -1628px; + background-position: -490px -1628px; width: 48px; height: 52px; } .achievement-dustDevil2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1264px -1480px; + background-position: -1402px -1480px; width: 48px; height: 56px; } .achievement-dysheartener2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -245px -1628px; + background-position: -392px -1628px; width: 48px; height: 52px; } .achievement-fedPet2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1215px -1480px; + background-position: -1353px -1480px; width: 48px; height: 56px; } .achievement-friends2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -147px -1628px; + background-position: -294px -1628px; width: 48px; height: 52px; } .achievement-getwell2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -98px -1628px; + background-position: -245px -1628px; width: 48px; height: 52px; } .achievement-goodluck2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -49px -1628px; + background-position: -196px -1628px; width: 48px; height: 52px; } .achievement-greeting2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: 0px -1628px; + background-position: -147px -1628px; width: 48px; height: 52px; } .achievement-guild2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1646px -1549px; + background-position: -98px -1628px; width: 48px; height: 52px; } .achievement-habitBirthday2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1597px -1549px; + background-position: -49px -1628px; width: 48px; height: 52px; } .achievement-habiticaDay2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1548px -1549px; + background-position: 0px -1628px; width: 48px; height: 52px; } .achievement-hatchedPet2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1166px -1480px; + background-position: -1304px -1480px; width: 48px; height: 56px; } .achievement-heart2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1450px -1549px; + background-position: -1597px -1549px; width: 48px; height: 52px; } .achievement-justAddWater2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -637px -1480px; + background-position: -775px -1480px; width: 60px; height: 64px; } .achievement-karaoke-2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1352px -1549px; + background-position: -1499px -1549px; width: 48px; height: 52px; } .achievement-karaoke { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1323px -1628px; + background-position: -1421px -1628px; width: 24px; height: 26px; } @@ -228,529 +228,541 @@ } .achievement-lostMasterclasser2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1205px -1549px; + background-position: -1352px -1549px; width: 48px; height: 52px; } .achievement-mindOverMatter2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -698px -1480px; + background-position: -836px -1480px; width: 60px; height: 64px; } .achievement-monsterMagus2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1019px -1480px; + background-position: -1157px -1480px; width: 48px; height: 56px; } .achievement-ninja2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1058px -1549px; + background-position: -1205px -1549px; width: 48px; height: 52px; } .achievement-npc2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1009px -1549px; + background-position: -1156px -1549px; width: 48px; height: 52px; } .achievement-nye2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -960px -1549px; + background-position: -1107px -1549px; width: 48px; height: 52px; } .achievement-partyOn2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -911px -1549px; + background-position: -1058px -1549px; width: 48px; height: 52px; } .achievement-partyUp2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -862px -1549px; + background-position: -1009px -1549px; width: 48px; height: 52px; } .achievement-pearlyPro2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -824px -1480px; + background-position: -962px -1480px; width: 64px; height: 56px; } .achievement-perfect2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -764px -1549px; + background-position: -911px -1549px; width: 48px; height: 52px; } .achievement-primedForPainting2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1068px -1480px; + background-position: -1206px -1480px; width: 48px; height: 56px; } .achievement-purchasedEquipment2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1117px -1480px; + background-position: -1255px -1480px; width: 48px; height: 56px; } .achievement-rat2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -617px -1549px; + background-position: -764px -1549px; width: 48px; height: 52px; } +.achievement-rosyOutlook2x { + background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); + background-position: -706px -1480px; + width: 68px; + height: 68px; +} .achievement-royally-loyal2x { - background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -568px -1549px; - width: 48px; - height: 52px; -} -.achievement-seafoam2x { - background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1607px -1480px; - width: 48px; - height: 52px; -} -.achievement-shield2x { - background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1558px -1480px; - width: 48px; - height: 52px; -} -.achievement-shinySeed2x { - background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1509px -1480px; - width: 48px; - height: 52px; -} -.achievement-snowball2x { - background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1460px -1480px; - width: 48px; - height: 52px; -} -.achievement-spookySparkles2x { - background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1176px -1628px; - width: 48px; - height: 52px; -} -.achievement-stoikalm2x { - background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1078px -1628px; - width: 48px; - height: 52px; -} -.achievement-sun2x { - background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -539px -1628px; - width: 48px; - height: 52px; -} -.achievement-sword2x { - background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -392px -1628px; - width: 48px; - height: 52px; -} -.achievement-thankyou2x { - background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -294px -1628px; - width: 48px; - height: 52px; -} -.achievement-thermometer2x { - background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -196px -1628px; - width: 48px; - height: 52px; -} -.achievement-tree2x { - background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1499px -1549px; - width: 48px; - height: 52px; -} -.achievement-triadbingo2x { - background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1401px -1549px; - width: 48px; - height: 52px; -} -.achievement-ultimate-healer2x { - background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1254px -1549px; - width: 48px; - height: 52px; -} -.achievement-ultimate-mage2x { - background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1156px -1549px; - width: 48px; - height: 52px; -} -.achievement-ultimate-rogue2x { - background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1107px -1549px; - width: 48px; - height: 52px; -} -.achievement-ultimate-warrior2x { - background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -813px -1549px; - width: 48px; - height: 52px; -} -.achievement-undeadUndertaker2x { - background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -889px -1480px; - width: 64px; - height: 56px; -} -.achievement-unearned2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); background-position: -666px -1549px; width: 48px; height: 52px; } -.achievement-valentine2x { +.achievement-seafoam2x { + background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); + background-position: -617px -1549px; + width: 48px; + height: 52px; +} +.achievement-shield2x { + background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); + background-position: -568px -1549px; + width: 48px; + height: 52px; +} +.achievement-shinySeed2x { + background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); + background-position: -1647px -1480px; + width: 48px; + height: 52px; +} +.achievement-snowball2x { + background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); + background-position: -1598px -1480px; + width: 48px; + height: 52px; +} +.achievement-spookySparkles2x { + background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); + background-position: -1323px -1628px; + width: 48px; + height: 52px; +} +.achievement-stoikalm2x { + background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); + background-position: -1225px -1628px; + width: 48px; + height: 52px; +} +.achievement-sun2x { + background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); + background-position: -686px -1628px; + width: 48px; + height: 52px; +} +.achievement-sword2x { + background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); + background-position: -539px -1628px; + width: 48px; + height: 52px; +} +.achievement-thankyou2x { + background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); + background-position: -441px -1628px; + width: 48px; + height: 52px; +} +.achievement-thermometer2x { + background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); + background-position: -343px -1628px; + width: 48px; + height: 52px; +} +.achievement-tickledPink2x { + background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); + background-position: -637px -1480px; + width: 68px; + height: 68px; +} +.achievement-tree2x { + background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); + background-position: -1548px -1549px; + width: 48px; + height: 52px; +} +.achievement-triadbingo2x { + background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); + background-position: -1450px -1549px; + width: 48px; + height: 52px; +} +.achievement-ultimate-healer2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); background-position: -1303px -1549px; width: 48px; height: 52px; } +.achievement-ultimate-mage2x { + background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); + background-position: -1254px -1549px; + width: 48px; + height: 52px; +} +.achievement-ultimate-rogue2x { + background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); + background-position: -960px -1549px; + width: 48px; + height: 52px; +} +.achievement-ultimate-warrior2x { + background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); + background-position: -862px -1549px; + width: 48px; + height: 52px; +} +.achievement-undeadUndertaker2x { + background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); + background-position: -897px -1480px; + width: 64px; + height: 56px; +} +.achievement-unearned2x { + background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); + background-position: -715px -1549px; + width: 48px; + height: 52px; +} +.achievement-valentine2x { + background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); + background-position: -1646px -1549px; + width: 48px; + height: 52px; +} .achievement-wolf2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1274px -1628px; + background-position: -1401px -1549px; width: 48px; height: 52px; } .background_alpine_slopes { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1278px 0px; + background-position: -1278px -296px; width: 141px; height: 147px; } .background_amid_ancient_ruins { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1278px -148px; + background-position: -1278px -444px; width: 141px; height: 147px; } .background_among_giant_anemones { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1278px -296px; + background-position: -1278px -592px; width: 141px; height: 147px; } .background_apple_picking { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1278px -444px; + background-position: -1278px -740px; width: 141px; height: 147px; } .background_aquarium { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1278px -592px; + background-position: -1278px -888px; width: 141px; height: 147px; } .background_archaeological_dig { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1278px -740px; + background-position: -1278px -1036px; width: 141px; height: 147px; } .background_archery_range { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1278px -888px; + background-position: 0px -1184px; width: 141px; height: 147px; } .background_at_the_docks { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1278px -1036px; + background-position: -142px -1184px; width: 141px; height: 147px; } .background_aurora { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: 0px -1184px; + background-position: -284px -1184px; width: 141px; height: 147px; } .background_autumn_flower_garden { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -142px -1184px; + background-position: -426px -1184px; width: 141px; height: 147px; } .customize-option.background_autumn_flower_garden { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -167px -1199px; + background-position: -451px -1199px; width: 60px; height: 60px; } .background_autumn_forest { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -284px -1184px; + background-position: -568px -1184px; width: 141px; height: 147px; } .background_avalanche { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -426px -1184px; + background-position: -710px -1184px; width: 141px; height: 147px; } .background_back_alley { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -568px -1184px; + background-position: -852px -1184px; width: 141px; height: 147px; } .background_back_of_giant_beast { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -710px -1184px; + background-position: -994px -1184px; width: 141px; height: 147px; } .background_bamboo_forest { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -852px -1184px; + background-position: -1136px -1184px; width: 141px; height: 147px; } .background_bayou { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -994px -1184px; + background-position: -1278px -1184px; width: 141px; height: 147px; } .background_beach { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1136px -1184px; + background-position: -1420px 0px; width: 141px; height: 147px; } .background_beehive { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1278px -1184px; + background-position: -1420px -148px; width: 141px; height: 147px; } .background_bell_tower { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1420px 0px; + background-position: -1420px -296px; width: 141px; height: 147px; } .background_beside_well { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1420px -148px; + background-position: -1420px -444px; width: 141px; height: 147px; } .background_birch_forest { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1420px -296px; + background-position: -1420px -592px; width: 141px; height: 147px; } .background_birthday_party { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1420px -444px; + background-position: -1420px -740px; width: 141px; height: 147px; } .background_blacksmithy { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1420px -592px; + background-position: -1420px -888px; width: 141px; height: 147px; } .background_blizzard { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1420px -740px; + background-position: -1420px -1036px; width: 141px; height: 147px; } .background_blossoming_desert { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1420px -888px; + background-position: -1420px -1184px; width: 141px; height: 147px; } .background_blue { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1420px -1036px; + background-position: 0px 0px; width: 141px; height: 147px; } .background_bridge { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: 0px 0px; + background-position: -142px -1332px; width: 141px; height: 147px; } .background_bug_covered_log { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: 0px -1332px; + background-position: -284px -1332px; width: 141px; height: 147px; } .background_buried_treasure { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -142px -1332px; + background-position: -426px -1332px; width: 141px; height: 147px; } .background_champions_colosseum { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -284px -1332px; + background-position: -568px -1332px; width: 141px; height: 147px; } .background_cherry_trees { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -426px -1332px; + background-position: -710px -1332px; width: 141px; height: 147px; } .background_chessboard_land { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -568px -1332px; + background-position: -852px -1332px; width: 141px; height: 147px; } .background_clouds { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -710px -1332px; + background-position: -994px -1332px; width: 141px; height: 147px; } .background_coral_reef { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -852px -1332px; + background-position: -1136px -1332px; width: 141px; height: 147px; } .background_cornfields { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -994px -1332px; + background-position: -1278px -1332px; width: 141px; height: 147px; } .background_cozy_barn { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1136px -1332px; + background-position: -1420px -1332px; width: 141px; height: 147px; } .background_cozy_bedroom { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1278px -1332px; + background-position: -1562px 0px; width: 141px; height: 147px; } .background_cozy_library { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1420px -1332px; + background-position: -1562px -148px; width: 141px; height: 147px; } .background_creepy_castle { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1562px 0px; + background-position: -1562px -296px; width: 141px; height: 147px; } .background_crosscountry_ski_trail { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1562px -148px; + background-position: -1562px -444px; width: 141px; height: 147px; } .background_crystal_cave { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1562px -296px; + background-position: -1562px -592px; width: 141px; height: 147px; } .background_dark_deep { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1562px -444px; + background-position: -1562px -740px; width: 141px; height: 147px; } .background_deep_mine { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1562px -592px; + background-position: -1562px -888px; width: 141px; height: 147px; } .background_deep_sea { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1562px -740px; + background-position: -1562px -1036px; width: 141px; height: 147px; } .background_desert_dunes { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1562px -888px; + background-position: -1562px -1184px; width: 141px; height: 147px; } .background_desert_with_snow { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1562px -1036px; + background-position: -1562px -1332px; width: 141px; height: 147px; } .background_dilatory_castle { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1562px -1184px; + background-position: 0px -1480px; width: 141px; height: 147px; } .background_dilatory_city { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1562px -1332px; + background-position: -142px -1480px; width: 141px; height: 147px; } .background_dilatory_ruins { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: 0px -1480px; + background-position: -284px -1480px; width: 141px; height: 147px; } .background_distant_castle { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -142px -1480px; + background-position: -426px -1480px; width: 141px; height: 147px; } .background_dojo { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -284px -1480px; + background-position: 0px -1332px; width: 141px; height: 147px; } .background_drifting_raft { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -426px -1480px; + background-position: -1278px -148px; width: 141px; height: 147px; } .background_driving_a_coach { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1420px -1184px; + background-position: -1278px 0px; width: 141px; height: 147px; } diff --git a/website/client/src/assets/images/sprites/spritesmith-largeSprites-0.png b/website/client/src/assets/images/sprites/spritesmith-largeSprites-0.png index fc888b3885..d96a792b6d 100644 Binary files a/website/client/src/assets/images/sprites/spritesmith-largeSprites-0.png and b/website/client/src/assets/images/sprites/spritesmith-largeSprites-0.png differ diff --git a/website/client/src/assets/images/sprites/spritesmith-main-0.png b/website/client/src/assets/images/sprites/spritesmith-main-0.png index a1c630b132..3e2139b8d6 100644 Binary files a/website/client/src/assets/images/sprites/spritesmith-main-0.png and b/website/client/src/assets/images/sprites/spritesmith-main-0.png differ diff --git a/website/client/src/components/notifications.vue b/website/client/src/components/notifications.vue index caaa2aaff0..374681d337 100644 --- a/website/client/src/components/notifications.vue +++ b/website/client/src/components/notifications.vue @@ -294,6 +294,22 @@ const NOTIFICATIONS = { achievement: 'pearlyPro', // defined manually until the server sends all the necessary data }, }, + ACHIEVEMENT_TICKLED_PINK: { + achievement: true, + label: $t => `${$t('achievement')}: ${$t('achievementTickledPink')}`, + modalId: 'generic-achievement', + data: { + achievement: 'tickledPink', // defined manually until the server sends all the necessary data + }, + }, + ACHIEVEMENT_ROSY_OUTLOOK: { + achievement: true, + label: $t => `${$t('achievement')}: ${$t('achievementRosyOutlook')}`, + modalId: 'generic-achievement', + data: { + achievement: 'rosyOutlook', // defined manually until the server sends all the necessary data + }, + }, }; export default { @@ -352,7 +368,8 @@ export default { 'GENERIC_ACHIEVEMENT', 'ACHIEVEMENT_PARTY_UP', 'ACHIEVEMENT_PARTY_ON', 'ACHIEVEMENT_BEAST_MASTER', 'ACHIEVEMENT_MOUNT_MASTER', 'ACHIEVEMENT_TRIAD_BINGO', 'ACHIEVEMENT_DUST_DEVIL', 'ACHIEVEMENT_ARID_AUTHORITY', 'ACHIEVEMENT_MONSTER_MAGUS', 'ACHIEVEMENT_UNDEAD_UNDERTAKER', 'ACHIEVEMENT_PRIMED_FOR_PAINTING', - 'ACHIEVEMENT_PEARLY_PRO', 'ACHIEVEMENT', 'ONBOARDING_COMPLETE', + 'ACHIEVEMENT_PEARLY_PRO', 'ACHIEVEMENT_TICKLED_PINK', 'ACHIEVEMENT_ROSY_OUTLOOK', 'ACHIEVEMENT', + 'ONBOARDING_COMPLETE', ].forEach(type => { handledNotifications[type] = true; }); @@ -760,6 +777,8 @@ export default { case 'ACHIEVEMENT_UNDEAD_UNDERTAKER': case 'ACHIEVEMENT_PRIMED_FOR_PAINTING': case 'ACHIEVEMENT_PEARLY_PRO': + case 'ACHIEVEMENT_TICKLED_PINK': + case 'ACHIEVEMENT_ROSY_OUTLOOK': case 'GENERIC_ACHIEVEMENT': this.showNotificationWithModal(notification); break; diff --git a/website/common/locales/en/achievements.json b/website/common/locales/en/achievements.json index 561cfece50..eaa6f80179 100644 --- a/website/common/locales/en/achievements.json +++ b/website/common/locales/en/achievements.json @@ -63,5 +63,11 @@ "achievementPrimedForPaintingModalText": "You collected all the White Pets!", "achievementPearlyPro": "Pearly Pro", "achievementPearlyProText": "Has tamed all White Mounts.", - "achievementPearlyProModalText": "You tamed all the White Mounts!" + "achievementPearlyProModalText": "You tamed all the White Mounts!", + "achievementTickledPink": "Tickled Pink", + "achievementTickledPinkText": "Has collected all Cotton Candy Pink Pets.", + "achievementTickledPinkModalText": "You collected all the Cotton Candy Pink Pets!", + "achievementRosyOutlook": "Rosy Outlook", + "achievementRosyOutlookText": "Has tamed all Cotton Candy Pink Mounts.", + "achievementRosyOutlookModalText": "You tamed all the Cotton Candy Pink Mounts!" } diff --git a/website/common/script/content/achievements.js b/website/common/script/content/achievements.js index 114a7b099c..75546912bd 100644 --- a/website/common/script/content/achievements.js +++ b/website/common/script/content/achievements.js @@ -177,6 +177,16 @@ const basicAchievs = { titleKey: 'achievementPearlyPro', textKey: 'achievementPearlyProText', }, + tickledPink: { + icon: 'achievement-tickledPink', + titleKey: 'achievementTickledPink', + textKey: 'achievementTickledPinkText', + }, + rosyOutlook: { + icon: 'achievement-rosyOutlook', + titleKey: 'achievementRosyOutlook', + textKey: 'achievementRosyOutlookText', + }, }; Object.assign(achievementsData, basicAchievs); diff --git a/website/common/script/content/constants.js b/website/common/script/content/constants.js index a37708764b..d0b7cbfeac 100644 --- a/website/common/script/content/constants.js +++ b/website/common/script/content/constants.js @@ -272,15 +272,38 @@ export const QUEST_SERIES_ACHIEVEMENTS = { export const ANIMAL_COLOR_ACHIEVEMENTS = [ { - color: 'Base', petAchievement: 'backToBasics', petNotificationType: 'ACHIEVEMENT_BACK_TO_BASICS', mountAchievement: 'allYourBase', mountNotificationType: 'ACHIEVEMENT_ALL_YOUR_BASE', + color: 'Base', + petAchievement: 'backToBasics', + petNotificationType: 'ACHIEVEMENT_BACK_TO_BASICS', + mountAchievement: 'allYourBase', + mountNotificationType: 'ACHIEVEMENT_ALL_YOUR_BASE', }, { - color: 'Desert', petAchievement: 'dustDevil', petNotificationType: 'ACHIEVEMENT_DUST_DEVIL', mountAchievement: 'aridAuthority', mountNotificationType: 'ACHIEVEMENT_ARID_AUTHORITY', + color: 'Desert', + petAchievement: 'dustDevil', + petNotificationType: 'ACHIEVEMENT_DUST_DEVIL', + mountAchievement: 'aridAuthority', + mountNotificationType: 'ACHIEVEMENT_ARID_AUTHORITY', }, { - color: 'Zombie', petAchievement: 'monsterMagus', petNotificationType: 'ACHIEVEMENT_MONSTER_MAGUS', mountAchievement: 'undeadUndertaker', mountNotificationType: 'ACHIEVEMENT_UNDEAD_UNDERTAKER', + color: 'Zombie', + petAchievement: 'monsterMagus', + petNotificationType: 'ACHIEVEMENT_MONSTER_MAGUS', + mountAchievement: 'undeadUndertaker', + mountNotificationType: 'ACHIEVEMENT_UNDEAD_UNDERTAKER', }, { - color: 'White', petAchievement: 'primedForPainting', petNotificationType: 'ACHIEVEMENT_PRIMED_FOR_PAINTING', mountAchievement: 'pearlyPro', mountNotificationType: 'ACHIEVEMENT_PEARLY_PRO', + color: 'White', + petAchievement: 'primedForPainting', + petNotificationType: 'ACHIEVEMENT_PRIMED_FOR_PAINTING', + mountAchievement: 'pearlyPro', + mountNotificationType: 'ACHIEVEMENT_PEARLY_PRO', + }, + { + color: 'CottonCandyPink', + petAchievement: 'tickledPink', + petNotificationType: 'ACHIEVEMENT_TICKLED_PINK', + mountAchievement: 'rosyOutlook', + mountNotificationType: 'ACHIEVEMENT_ROSY_OUTLOOK', }, ]; diff --git a/website/common/script/libs/achievements.js b/website/common/script/libs/achievements.js index 7b64dbb045..e3fa0d7dff 100644 --- a/website/common/script/libs/achievements.js +++ b/website/common/script/libs/achievements.js @@ -197,6 +197,8 @@ function _getBasicAchievements (user, language) { _addSimple(result, user, { path: 'undeadUndertaker', language }); _addSimple(result, user, { path: 'primedForPainting', language }); _addSimple(result, user, { path: 'pearlyPro', language }); + _addSimple(result, user, { path: 'tickledPink', language }); + _addSimple(result, user, { path: 'rosyOutlook', language }); _addSimpleWithMasterCount(result, user, { path: 'beastMaster', language }); _addSimpleWithMasterCount(result, user, { path: 'mountMaster', language }); diff --git a/website/raw_sprites/spritesmith/achievements/achievement-rosyOutlook2x.png b/website/raw_sprites/spritesmith/achievements/achievement-rosyOutlook2x.png new file mode 100644 index 0000000000..ffc2d7d7d3 Binary files /dev/null and b/website/raw_sprites/spritesmith/achievements/achievement-rosyOutlook2x.png differ diff --git a/website/raw_sprites/spritesmith/achievements/achievement-tickledPink2x.png b/website/raw_sprites/spritesmith/achievements/achievement-tickledPink2x.png new file mode 100644 index 0000000000..efab282020 Binary files /dev/null and b/website/raw_sprites/spritesmith/achievements/achievement-tickledPink2x.png differ diff --git a/website/raw_sprites/spritesmith_large/promo_achievement_CottonCandyPink.png b/website/raw_sprites/spritesmith_large/promo_achievement_CottonCandyPink.png new file mode 100644 index 0000000000..d3d4e2e5a9 Binary files /dev/null and b/website/raw_sprites/spritesmith_large/promo_achievement_CottonCandyPink.png differ diff --git a/website/server/controllers/api-v3/news.js b/website/server/controllers/api-v3/news.js index 553928e1f0..863a80605b 100644 --- a/website/server/controllers/api-v3/news.js +++ b/website/server/controllers/api-v3/news.js @@ -4,7 +4,7 @@ const api = {}; // @TODO export this const, cannot export it from here because only routes are exported from // controllers -const LAST_ANNOUNCEMENT_TITLE = 'NEW MAGIC HATCHING POTION QUEST: RUBY!'; +const LAST_ANNOUNCEMENT_TITLE = 'NEW PET COLLECTION BADGES!'; const worldDmg = { // @TODO bailey: false, }; @@ -31,21 +31,23 @@ api.getNews = {

${res.t('newStuff')}

-

2/13/2020 - ${LAST_ANNOUNCEMENT_TITLE}

+

2/18/2020 - ${LAST_ANNOUNCEMENT_TITLE}


-
+

- It's time for a trip to the snowy hot springs of Stoïkalm! Get - the latest Magic Hatching Potion quest, "Ruby Rapport", and collect Ruby Gems, - Aquarius Zodiac Runes, and Venus Runes to earn some glittering Ruby Magic Hatching - Potions by completing your real-life tasks! + We're releasing a new achievement so you can celebrate your successes in the world of + Habitican pet collecting! Earn the Tickled Pink and Rosy Outlook achievements by + collecting Cotton Candy Pink pets and mounts and you'll earn a nifty badge for your + profile.

-
- Art by Aspiring_Advocate, gully, Beffymaroo, Tyche_Alba, and loremi -
-
Writing by JohnJSal
+

+ If you already have all the Cotton Candy Pink pets and/or mounts in your stable, you'll + receive the badge automatically! Check your profile and celebrate your new achievement + with pride in your pink prowess. +

+
by Piyowo and SabreCat
`, }); diff --git a/website/server/models/user/schema.js b/website/server/models/user/schema.js index 11dfe555bb..0f9a2e8173 100644 --- a/website/server/models/user/schema.js +++ b/website/server/models/user/schema.js @@ -130,6 +130,8 @@ export default new Schema({ undeadUndertaker: Boolean, primedForPainting: Boolean, pearlyPro: Boolean, + tickledPink: Boolean, + rosyOutlook: Boolean, // Onboarding Guide createdTask: Boolean, completedTask: Boolean, diff --git a/website/server/models/userNotification.js b/website/server/models/userNotification.js index 6e28ed2777..2b2e4c4d43 100644 --- a/website/server/models/userNotification.js +++ b/website/server/models/userNotification.js @@ -50,6 +50,8 @@ const NOTIFICATION_TYPES = [ 'ACHIEVEMENT_UNDEAD_UNDERTAKER', 'ACHIEVEMENT_PRIMED_FOR_PAINTING', 'ACHIEVEMENT_PEARLY_PRO', + 'ACHIEVEMENT_TICKLED_PINK', + 'ACHIEVEMENT_ROSY_OUTLOOK', 'ACHIEVEMENT', // generic achievement notification, details inside `notification.data` ];