diff --git a/package-lock.json b/package-lock.json index 663da91114..ecb5d328dc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "habitica", - "version": "4.187.0", + "version": "4.188.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index bce790307b..a4fe08d73f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "habitica", "description": "A habit tracker app which treats your goals like a Role Playing Game.", - "version": "4.187.0", + "version": "4.188.0", "main": "./website/server/index.js", "dependencies": { "@babel/core": "^7.12.10", 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 efa951efd7..05673d15cc 100644 --- a/website/client/src/assets/css/sprites/spritesmith-main-0.css +++ b/website/client/src/assets/css/sprites/spritesmith-main-0.css @@ -1,48 +1,48 @@ .achievement-alien { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1671px -1480px; + background-position: -1656px -1549px; width: 24px; height: 26px; } .achievement-alien2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -529px -1549px; + background-position: -578px -1549px; width: 48px; height: 52px; } .achievement-allThatGlitters2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -873px -1480px; + background-position: -934px -1480px; width: 64px; height: 56px; } .achievement-allYourBase2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -938px -1480px; + background-position: -999px -1480px; width: 64px; height: 56px; } .achievement-alpha2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -578px -1549px; + background-position: -627px -1549px; width: 48px; height: 52px; } .achievement-aridAuthority2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1003px -1480px; + background-position: -1064px -1480px; width: 64px; height: 56px; } .achievement-armor2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -627px -1549px; + background-position: -676px -1549px; width: 48px; height: 52px; } .achievement-backToBasics2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1328px -1480px; + background-position: -1389px -1480px; width: 48px; height: 56px; } @@ -54,31 +54,31 @@ } .achievement-bewilder2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -676px -1549px; + background-position: -725px -1549px; width: 48px; height: 52px; } .achievement-birthday2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -725px -1549px; + background-position: -774px -1549px; width: 48px; height: 52px; } .achievement-boneCollector2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1377px -1480px; + background-position: -1438px -1480px; width: 48px; height: 56px; } .achievement-boot2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -774px -1549px; + background-position: -823px -1549px; width: 48px; height: 52px; } .achievement-bow2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -823px -1549px; + background-position: -872px -1549px; width: 48px; height: 52px; } @@ -90,85 +90,85 @@ } .achievement-burnout2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -872px -1549px; + background-position: -921px -1549px; width: 48px; height: 52px; } .achievement-cactus2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -921px -1549px; + background-position: -970px -1549px; width: 48px; height: 52px; } .achievement-cake2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -970px -1549px; + background-position: -1019px -1549px; width: 48px; height: 52px; } .achievement-cave2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1019px -1549px; + background-position: -1068px -1549px; width: 48px; height: 52px; } .achievement-challenge2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1068px -1549px; + background-position: -1117px -1549px; width: 48px; height: 52px; } .achievement-comment2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1117px -1549px; + background-position: -1166px -1549px; width: 48px; height: 52px; } .achievement-completedTask2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1426px -1480px; + background-position: -1487px -1480px; width: 48px; height: 56px; } .achievement-congrats2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1166px -1549px; + background-position: -1215px -1549px; width: 48px; height: 52px; } .achievement-costumeContest2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1215px -1549px; + background-position: -1264px -1549px; width: 48px; height: 52px; } .achievement-createdTask2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1475px -1480px; + background-position: -1536px -1480px; width: 48px; height: 56px; } .achievement-dilatory2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1264px -1549px; + background-position: -1313px -1549px; width: 48px; height: 52px; } .achievement-dustDevil2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1524px -1480px; + background-position: -1585px -1480px; width: 48px; height: 56px; } .achievement-dysheartener2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1313px -1549px; + background-position: -1362px -1549px; width: 48px; height: 52px; } .achievement-fedPet2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1573px -1480px; + background-position: -1634px -1480px; width: 48px; height: 56px; } @@ -180,61 +180,61 @@ } .achievement-friends2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1362px -1549px; + background-position: -1411px -1549px; width: 48px; height: 52px; } .achievement-getwell2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1411px -1549px; + background-position: -1460px -1549px; width: 48px; height: 52px; } .achievement-goodAsGold2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1622px -1480px; + background-position: -284px -1549px; width: 48px; height: 56px; } .achievement-goodluck2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1460px -1549px; + background-position: -1509px -1549px; width: 48px; height: 52px; } .achievement-greeting2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1509px -1549px; + background-position: -1558px -1549px; width: 48px; height: 52px; } .achievement-guild2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1558px -1549px; + background-position: -1607px -1549px; width: 48px; height: 52px; } .achievement-habitBirthday2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1607px -1549px; + background-position: 0px -1628px; width: 48px; height: 52px; } .achievement-habiticaDay2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: 0px -1628px; + background-position: -49px -1628px; width: 48px; height: 52px; } .achievement-hatchedPet2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -284px -1549px; + background-position: -333px -1549px; width: 48px; height: 56px; } .achievement-heart2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -49px -1628px; + background-position: -98px -1628px; width: 48px; height: 52px; } @@ -246,13 +246,13 @@ } .achievement-karaoke-2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -98px -1628px; + background-position: -147px -1628px; width: 48px; height: 52px; } .achievement-karaoke { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1671px -1507px; + background-position: -1568px -1628px; width: 24px; height: 26px; } @@ -270,7 +270,7 @@ } .achievement-lostMasterclasser2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -147px -1628px; + background-position: -196px -1628px; width: 48px; height: 52px; } @@ -282,73 +282,73 @@ } .achievement-monsterMagus2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -333px -1549px; + background-position: -382px -1549px; width: 48px; height: 56px; } .achievement-ninja2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -196px -1628px; + background-position: -245px -1628px; width: 48px; height: 52px; } .achievement-npc2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -245px -1628px; + background-position: -294px -1628px; width: 48px; height: 52px; } .achievement-nye2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -294px -1628px; + background-position: -343px -1628px; width: 48px; height: 52px; } .achievement-partyOn2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -343px -1628px; + background-position: -392px -1628px; width: 48px; height: 52px; } .achievement-partyUp2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -392px -1628px; + background-position: -441px -1628px; width: 48px; height: 52px; } .achievement-pearlyPro2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1068px -1480px; + background-position: -1129px -1480px; width: 64px; height: 56px; } .achievement-perfect2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -441px -1628px; + background-position: -490px -1628px; width: 48px; height: 52px; } .achievement-primedForPainting2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -382px -1549px; + background-position: -431px -1549px; width: 48px; height: 56px; } .achievement-purchasedEquipment2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -431px -1549px; + background-position: -480px -1549px; width: 48px; height: 56px; } .achievement-rat2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -490px -1628px; + background-position: -539px -1628px; width: 48px; height: 52px; } .achievement-redLetterDay2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1133px -1480px; + background-position: -1194px -1480px; width: 64px; height: 56px; } @@ -360,79 +360,85 @@ } .achievement-royally-loyal2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -539px -1628px; + background-position: -588px -1628px; width: 48px; height: 52px; } .achievement-seafoam2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -588px -1628px; + background-position: -637px -1628px; width: 48px; height: 52px; } +.achievement-seasonalSpecialist2x { + background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); + background-position: -873px -1480px; + width: 60px; + height: 64px; +} .achievement-seeingRed2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -480px -1549px; + background-position: -529px -1549px; width: 48px; height: 56px; } .achievement-shield2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -637px -1628px; + background-position: -686px -1628px; width: 48px; height: 52px; } .achievement-shinySeed2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -686px -1628px; + background-position: -735px -1628px; width: 48px; height: 52px; } .achievement-skeletonCrew2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1198px -1480px; + background-position: -1259px -1480px; width: 64px; height: 56px; } .achievement-snowball2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -735px -1628px; + background-position: -784px -1628px; width: 48px; height: 52px; } .achievement-spookySparkles2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -784px -1628px; + background-position: -833px -1628px; width: 48px; height: 52px; } .achievement-stoikalm2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -833px -1628px; + background-position: -882px -1628px; width: 48px; height: 52px; } .achievement-sun2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -882px -1628px; + background-position: -931px -1628px; width: 48px; height: 52px; } .achievement-sword2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -931px -1628px; + background-position: -980px -1628px; width: 48px; height: 52px; } .achievement-thankyou2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -980px -1628px; + background-position: -1029px -1628px; width: 48px; height: 52px; } .achievement-thermometer2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1029px -1628px; + background-position: -1078px -1628px; width: 48px; height: 52px; } @@ -444,61 +450,61 @@ } .achievement-tree2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1078px -1628px; + background-position: -1127px -1628px; width: 48px; height: 52px; } .achievement-triadbingo2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1127px -1628px; + background-position: -1176px -1628px; width: 48px; height: 52px; } .achievement-ultimate-healer2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1176px -1628px; + background-position: -1225px -1628px; width: 48px; height: 52px; } .achievement-ultimate-mage2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1225px -1628px; + background-position: -1274px -1628px; width: 48px; height: 52px; } .achievement-ultimate-rogue2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1274px -1628px; + background-position: -1323px -1628px; width: 48px; height: 52px; } .achievement-ultimate-warrior2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1323px -1628px; + background-position: -1372px -1628px; width: 48px; height: 52px; } .achievement-undeadUndertaker2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1263px -1480px; + background-position: -1324px -1480px; width: 64px; height: 56px; } .achievement-unearned2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1372px -1628px; + background-position: -1421px -1628px; width: 48px; height: 52px; } .achievement-valentine2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1421px -1628px; + background-position: -1470px -1628px; width: 48px; height: 52px; } .achievement-wolf2x { background-image: url('~@/assets/images/sprites/spritesmith-main-0.png'); - background-position: -1470px -1628px; + background-position: -1519px -1628px; width: 48px; height: 52px; } 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 ceed17fce1..902a2e202c 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 30d8447c58..4ccb64cc1e 100644 --- a/website/client/src/components/notifications.vue +++ b/website/client/src/components/notifications.vue @@ -395,6 +395,14 @@ const NOTIFICATIONS = { achievement: 'legendaryBestiary', }, }, + ACHIEVEMENT_SEASONAL_SPECIALIST: { + achievement: true, + label: $t => `${$t('achievement')}: ${$t('achievementSeasonalSpecialist')}`, + modalId: 'generic-achievement', + data: { + achievement: 'seasonalSpecialist', + }, + }, }; export default { @@ -457,7 +465,7 @@ export default { 'ONBOARDING_COMPLETE', 'FIRST_DROPS', 'ACHIEVEMENT_BUG_BONANZA', 'ACHIEVEMENT_BARE_NECESSITIES', 'ACHIEVEMENT_FRESHWATER_FRIENDS', 'ACHIEVEMENT_GOOD_AS_GOLD', 'ACHIEVEMENT_ALL_THAT_GLITTERS', 'ACHIEVEMENT_BONE_COLLECTOR', 'ACHIEVEMENT_SKELETON_CREW', 'ACHIEVEMENT_SEEING_RED', - 'ACHIEVEMENT_RED_LETTER_DAY', 'ACHIEVEMENT_LEGENDARY_BESTIARY', + 'ACHIEVEMENT_RED_LETTER_DAY', 'ACHIEVEMENT_LEGENDARY_BESTIARY', 'ACHIEVEMENT_SEASONAL_SPECIALIST', ].forEach(type => { handledNotifications[type] = true; }); @@ -879,6 +887,7 @@ export default { case 'ACHIEVEMENT_SEEING_RED': case 'ACHIEVEMENT_RED_LETTER_DAY': case 'ACHIEVEMENT_LEGENDARY_BESTIARY': + case 'ACHIEVEMENT_SEASONAL_SPECIALIST': case 'GENERIC_ACHIEVEMENT': this.showNotificationWithModal(notification); break; diff --git a/website/common/locales/en/achievements.json b/website/common/locales/en/achievements.json index bb7e5bfd3e..c134a31411 100644 --- a/website/common/locales/en/achievements.json +++ b/website/common/locales/en/achievements.json @@ -105,5 +105,8 @@ "achievementRedLetterDayModalText": "You tamed all the Red Mounts!", "achievementLegendaryBestiary": "Legendary Bestiary", "achievementLegendaryBestiaryText": "Has hatched all the mythical pets: Dragon, Flying Pig, Gryphon, Sea Serpent, and Unicorn!", - "achievementLegendaryBestiaryModalText": "You collected all the mythical pets!" + "achievementLegendaryBestiaryModalText": "You collected all the mythical pets!", + "achievementSeasonalSpecialist": "Seasonal Specialist", + "achievementSeasonalSpecialistText": "Has completed all the Spring and Winter seasonal quests: Egg Hunt, Trapper Santa, and Find the Cub!", + "achievementSeasonalSpecialistModalText": "You completed all the seasonal quests!" } diff --git a/website/common/script/content/achievements.js b/website/common/script/content/achievements.js index 4b8d1ccd2d..68551150f3 100644 --- a/website/common/script/content/achievements.js +++ b/website/common/script/content/achievements.js @@ -237,6 +237,11 @@ const basicAchievs = { titleKey: 'achievementLegendaryBestiary', textKey: 'achievementLegendaryBestiaryText', }, + seasonalSpecialist: { + icon: 'achievement-seasonalSpecialist', + titleKey: 'achievementSeasonalSpecialist', + textKey: 'achievementSeasonalSpecialistText', + }, }; Object.assign(achievementsData, basicAchievs); diff --git a/website/common/script/content/constants/questSeriesAchievements.js b/website/common/script/content/constants/questSeriesAchievements.js index 337abf43ca..f9ca87a489 100644 --- a/website/common/script/content/constants/questSeriesAchievements.js +++ b/website/common/script/content/constants/questSeriesAchievements.js @@ -48,6 +48,11 @@ const QUEST_SERIES_ACHIEVEMENTS = { 'frog', 'hippo', ], + seasonalSpecialist: [ + 'egg', + 'evilsanta', + 'evilsanta2', + ], }; export default QUEST_SERIES_ACHIEVEMENTS; diff --git a/website/common/script/content/hatching-potions.js b/website/common/script/content/hatching-potions.js index fd718bffda..cd5b016c1d 100644 --- a/website/common/script/content/hatching-potions.js +++ b/website/common/script/content/hatching-potions.js @@ -455,7 +455,7 @@ const wacky = { previousDate: t('marchYYYY', { year: 2019 }), }), canBuy () { - return moment().isBefore('2020-05-02'); + return moment().isBetween('2021-04-01T08:00-05:00', '2021-04-30T20:00-05:00'); }, }, Dessert: { diff --git a/website/common/script/content/mystery-sets.js b/website/common/script/content/mystery-sets.js index 3e3378e610..61d8e0c4f0 100644 --- a/website/common/script/content/mystery-sets.js +++ b/website/common/script/content/mystery-sets.js @@ -29,7 +29,7 @@ const FIRST_MYSTERY_SET = moment('2014-02-01'); for ( let mysteryMonth = FIRST_MYSTERY_SET; - moment(mysteryMonth).startOf('month').isSameOrBefore(moment().add(1, 'months')); + moment(mysteryMonth).startOf('month').isSameOrBefore(moment()); mysteryMonth = moment(mysteryMonth).add(1, 'months') ) { const setKey = moment(mysteryMonth).format('YYYYMM'); diff --git a/website/common/script/content/quests.js b/website/common/script/content/quests.js index f2864a7a12..8881f7bfa3 100644 --- a/website/common/script/content/quests.js +++ b/website/common/script/content/quests.js @@ -519,7 +519,7 @@ const quests = { value: 1, category: 'pet', canBuy () { - return false; + return moment().isBefore('2021-04-30T20:00-05:00'); }, collect: { plainEgg: { @@ -3585,7 +3585,8 @@ const quests = { completion: t('questWaffleCompletion'), value: 4, category: 'hatchingPotion', - event: EVENTS.spring2020, + event: EVENTS.spring2021, + canBuy: moment().isBetween('2021-04-01T08:00-05:00', '2021-04-30T20:00-05:00'), boss: { name: t('questWaffleBoss'), hp: 500, diff --git a/website/common/script/libs/achievements.js b/website/common/script/libs/achievements.js index be23cfdf08..6fb63a7225 100644 --- a/website/common/script/libs/achievements.js +++ b/website/common/script/libs/achievements.js @@ -209,6 +209,7 @@ function _getBasicAchievements (user, language) { _addSimple(result, user, { path: 'seeingRed', language }); _addSimple(result, user, { path: 'redLetterDay', language }); _addSimple(result, user, { path: 'legendaryBestiary', language }); + _addSimple(result, user, { path: 'seasonalSpecialist', language }); _addSimpleWithMasterCount(result, user, { path: 'beastMaster', language }); _addSimpleWithMasterCount(result, user, { path: 'mountMaster', language }); diff --git a/website/server/models/user/schema.js b/website/server/models/user/schema.js index e3555b6c55..5c64499f1d 100644 --- a/website/server/models/user/schema.js +++ b/website/server/models/user/schema.js @@ -141,6 +141,7 @@ export default new Schema({ seeingRed: Boolean, redLetterDay: Boolean, legendaryBestiary: Boolean, + seasonalSpecialist: Boolean, // Onboarding Guide createdTask: Boolean, completedTask: Boolean, diff --git a/website/server/models/userNotification.js b/website/server/models/userNotification.js index 1d71dd01bd..45b0f1bdba 100644 --- a/website/server/models/userNotification.js +++ b/website/server/models/userNotification.js @@ -64,6 +64,7 @@ const NOTIFICATION_TYPES = [ 'ACHIEVEMENT_SEEING_RED', 'ACHIEVEMENT_RED_LETTER_DAY', 'ACHIEVEMENT_LEGENDARY_BESTIARY', + 'ACHIEVEMENT_SEASONAL_SPECIALIST', 'ACHIEVEMENT', // generic achievement notification, details inside `notification.data` 'DROP_CAP_REACHED', ];