diff --git a/website/client/src/components/notifications.vue b/website/client/src/components/notifications.vue index 3c8111b5ee..5c14acdc7f 100644 --- a/website/client/src/components/notifications.vue +++ b/website/client/src/components/notifications.vue @@ -319,6 +319,14 @@ const NOTIFICATIONS = { achievement: 'bugBonanza', // defined manually until the server sends all the necessary data }, }, + ACHIEVEMENT_BARE_NECESSITIES: { + achievement: true, + label: $t => `${$t('achievement')}: ${$t('achievementBareNecessities')}`, + modalId: 'generic-achievement', + data: { + achievement: 'bareNecessities', // defined manually until the server sends all the necessary data + }, + }, }; export default { @@ -377,7 +385,7 @@ export default { '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_TICKLED_PINK', 'ACHIEVEMENT_ROSY_OUTLOOK', 'ACHIEVEMENT', - 'ONBOARDING_COMPLETE', 'FIRST_DROPS', 'ACHIEVEMENT_BUG_BONANZA', + 'ONBOARDING_COMPLETE', 'FIRST_DROPS', 'ACHIEVEMENT_BUG_BONANZA', 'ACHIEVEMENT_BARE_NECESSITIES', ].forEach(type => { handledNotifications[type] = true; }); @@ -792,6 +800,7 @@ export default { case 'ACHIEVEMENT_TICKLED_PINK': case 'ACHIEVEMENT_ROSY_OUTLOOK': case 'ACHIEVEMENT_BUG_BONANZA': + case 'ACHIEVEMENT_BARE_NECESSITIES': case 'GENERIC_ACHIEVEMENT': this.showNotificationWithModal(notification); break; diff --git a/website/client/src/components/userMenu/profile.vue b/website/client/src/components/userMenu/profile.vue index e27d9a05c8..7dfd643f09 100644 --- a/website/client/src/components/userMenu/profile.vue +++ b/website/client/src/components/userMenu/profile.vue @@ -318,7 +318,7 @@ >
." } diff --git a/website/common/script/content/achievements.js b/website/common/script/content/achievements.js index 3d986bbe68..50a648747d 100644 --- a/website/common/script/content/achievements.js +++ b/website/common/script/content/achievements.js @@ -192,6 +192,11 @@ const basicAchievs = { titleKey: 'achievementBugBonanza', textKey: 'achievementBugBonanzaText', }, + bareNecessities: { + icon: 'achievement-bareNecessities', + titleKey: 'achievementBareNecessities', + textKey: 'achievementBareNecessitiesText', + }, }; Object.assign(achievementsData, basicAchievs); diff --git a/website/common/script/content/bundles.js b/website/common/script/content/bundles.js index f72d00f538..3c64bfd6ba 100644 --- a/website/common/script/content/bundles.js +++ b/website/common/script/content/bundles.js @@ -221,6 +221,21 @@ const bundles = { type: 'quests', value: 7, }, + jungleBuddies: { + key: 'jungleBuddies', + text: t('jungleBuddiesText'), + notes: t('jungleBuddiesNotes', { date: moment('2020-05-31').format('LL') }), + bundleKeys: [ + 'monkey', + 'sloth', + 'treeling', + ], + canBuy () { + return moment().isBetween('2020-05-19', '2020-06-02'); + }, + type: 'quests', + value: 7, + }, }; export default bundles; diff --git a/website/common/script/content/constants.js b/website/common/script/content/constants.js index 81dc6aa33c..9d2eee34f4 100644 --- a/website/common/script/content/constants.js +++ b/website/common/script/content/constants.js @@ -282,6 +282,11 @@ export const QUEST_SERIES_ACHIEVEMENTS = { 'snail', 'spider', ], + bareNecessities: [ + 'monkey', + 'sloth', + 'treeling', + ], }; export const ANIMAL_COLOR_ACHIEVEMENTS = [ diff --git a/website/common/script/libs/achievements.js b/website/common/script/libs/achievements.js index 1b316d3c0d..751174c109 100644 --- a/website/common/script/libs/achievements.js +++ b/website/common/script/libs/achievements.js @@ -200,6 +200,7 @@ function _getBasicAchievements (user, language) { _addSimple(result, user, { path: 'tickledPink', language }); _addSimple(result, user, { path: 'rosyOutlook', language }); _addSimple(result, user, { path: 'bugBonanza', language }); + _addSimple(result, user, { path: 'bareNecessities', language }); _addSimpleWithMasterCount(result, user, { path: 'beastMaster', language }); _addSimpleWithMasterCount(result, user, { path: 'mountMaster', language }); diff --git a/website/raw_sprites/spritesmith/achievements/achievement-bareNecessities2x.png b/website/raw_sprites/spritesmith/achievements/achievement-bareNecessities2x.png new file mode 100644 index 0000000000..f440a1aa13 Binary files /dev/null and b/website/raw_sprites/spritesmith/achievements/achievement-bareNecessities2x.png differ diff --git a/website/raw_sprites/spritesmith/quests/scrolls/quest_bundle_jungleBuddies.png b/website/raw_sprites/spritesmith/quests/scrolls/quest_bundle_jungleBuddies.png new file mode 100644 index 0000000000..b7fbe7e1cf Binary files /dev/null and b/website/raw_sprites/spritesmith/quests/scrolls/quest_bundle_jungleBuddies.png differ diff --git a/website/raw_sprites/spritesmith_large/promo_jungle_buddies_bundle.png b/website/raw_sprites/spritesmith_large/promo_jungle_buddies_bundle.png new file mode 100644 index 0000000000..16eb9d4a52 Binary files /dev/null and b/website/raw_sprites/spritesmith_large/promo_jungle_buddies_bundle.png differ diff --git a/website/server/controllers/api-v3/news.js b/website/server/controllers/api-v3/news.js index f49d47c172..5aff557c83 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 = 'BLOG POST: RESTING IN THE INN'; +const LAST_ANNOUNCEMENT_TITLE = 'NEW PET ACHIEVEMENT AND QUEST BUNDLE!'; const worldDmg = { // @TODO bailey: false, }; @@ -35,16 +35,37 @@ api.getNews = {

-
+
+

New Quest Pet Badge!

- This month's featured Wiki article is about Resting in the Inn! We hope that it - will help you when you need a break from your Dailies. Be sure to check it out, and let - us know what you think by reaching out on Twitter, - Tumblr, and Facebook. + We're releasing a new achievement so you can celebrate your successes in the world of + Habitican Pet collecting! Earn the Bare Necessities achievement by collecting all + Habitica's jungle-dwelling Pets and you'll earn a nifty badge for your profile.

-
by shanaqui and the Wiki Wizards
+

+ If you’ve already completed the required Quests for a newly released achievement, you + don’t have to do them all again! Just complete one of the relevant Quests and the + Achievement will unlock. Check your profile and celebrate your new Achievement with + pride. +

+
by Beffymaroo and SabreCat
+
+

New Discounted Pet Quest Bundle: Jungle Buddies!

+

+ If you're eager to complete the Bare Necessities quests, or if you're simply looking to + add some equatorial pets to your Habitica stable, you're in luck! From now until May 30, + you can purchase the Jungle Buddies Pet Quest Bundle and receive the Monkey, Sloth, and + Treeling quests, all for only 7 Gems! That's a discount of 5 Gems from the price of + purchasing them separately. Check it out in the Quest Shop + today! +

+
by SabreCat
+
Writing by PixelHunter, Emily Austin, Flutter Bee, and Felipe NA
+
+ Art by JaizakAripaik, Drevian, McCoyly, awakebyjava, PainterProphet, Kiwibot, + greenpencil, fuzzytrees, PainterProphet, aurakami, yamato, leephon, Misceo, and + Oneironaut +
`, }); diff --git a/website/server/models/user/schema.js b/website/server/models/user/schema.js index 4788278a15..a6eae81943 100644 --- a/website/server/models/user/schema.js +++ b/website/server/models/user/schema.js @@ -134,6 +134,7 @@ export default new Schema({ tickledPink: Boolean, rosyOutlook: Boolean, bugBonanza: Boolean, + bareNecessities: Boolean, // Onboarding Guide createdTask: Boolean, completedTask: Boolean, diff --git a/website/server/models/userNotification.js b/website/server/models/userNotification.js index e7775c6cd1..214b1e580d 100644 --- a/website/server/models/userNotification.js +++ b/website/server/models/userNotification.js @@ -55,6 +55,7 @@ const NOTIFICATION_TYPES = [ 'ACHIEVEMENT_TICKLED_PINK', 'ACHIEVEMENT_ROSY_OUTLOOK', 'ACHIEVEMENT_BUG_BONANZA', + 'ACHIEVEMENT_BARE_NECESSITIES', 'ACHIEVEMENT', // generic achievement notification, details inside `notification.data` ];