diff --git a/website/common/locales/en/questsContent.json b/website/common/locales/en/questsContent.json index b8ed6a4b3e..6aa2e7f079 100644 --- a/website/common/locales/en/questsContent.json +++ b/website/common/locales/en/questsContent.json @@ -775,5 +775,8 @@ "questRobotUnlockText": "Unlocks purchasable Robot Eggs in the Market", "rockingReptilesText": "Rocking Reptiles Quest Bundle", - "rockingReptilesNotes": "Contains 'The Insta-Gator,' 'The Serpent of Distraction,' and 'The Veloci-Rapper.' Available until September 30." + "rockingReptilesNotes": "Contains 'The Insta-Gator,' 'The Serpent of Distraction,' and 'The Veloci-Rapper.' Available until September 30.", + + "delightfulDinosText": "Delightful Dinos Quest Bundle", + "delightfulDinosNotes": "Contains 'The Pterror-dactyl,' 'The Trampling Triceratops,' and 'The Dinosaur Unearthed.' Available until November 30." } diff --git a/website/common/script/content/bundles.js b/website/common/script/content/bundles.js new file mode 100644 index 0000000000..7698e650b3 --- /dev/null +++ b/website/common/script/content/bundles.js @@ -0,0 +1,225 @@ +import moment from 'moment'; +import t from './translation'; + +/* + --------------------------------------------------------------- + Discounted Item Bundles + --------------------------------------------------------------- +*/ + +const bundles = { + featheredFriends: { + key: 'featheredFriends', + text: t('featheredFriendsText'), + notes: t('featheredFriendsNotes'), + bundleKeys: [ + 'falcon', + 'harpy', + 'owl', + ], + canBuy () { + return moment().isBetween('2019-05-09', '2019-06-02'); + }, + type: 'quests', + class: 'quest_bundle_featheredFriends', + value: 7, + }, + splashyPals: { + key: 'splashyPals', + text: t('splashyPalsText'), + notes: t('splashyPalsNotes'), + bundleKeys: [ + 'dilatory_derby', + 'turtle', + 'whale', + ], + canBuy () { + return moment().isBetween('2019-07-17', '2019-08-02'); + }, + type: 'quests', + class: 'quest_bundle_splashyPals', + value: 7, + }, + farmFriends: { + key: 'farmFriends', + text: t('farmFriendsText'), + notes: t('farmFriendsNotes'), + bundleKeys: [ + 'cow', + 'horse', + 'sheep', + ], + canBuy () { + return moment().isBetween('2019-08-08', '2019-09-02'); + }, + type: 'quests', + value: 7, + }, + witchyFamiliars: { + key: 'witchyFamiliars', + text: t('witchyFamiliarsText'), + notes: t('witchyFamiliarsNotes'), + bundleKeys: [ + 'rat', + 'spider', + 'frog', + ], + canBuy () { + return moment().isBetween('2019-10-15', '2019-11-02'); + }, + type: 'quests', + value: 7, + }, + winterQuests: { + key: 'winterQuests', + text: t('winterQuestsText'), + notes: t('winterQuestsNotes'), + bundleKeys: [ + 'evilsanta', + 'evilsanta2', + 'penguin', + ], + canBuy () { + return moment().isBetween('2017-12-14', '2018-01-01'); + }, + type: 'quests', + value: 7, + }, + hugabug: { + key: 'hugabug', + text: t('hugabugText'), + notes: t('hugabugNotes'), + bundleKeys: [ + 'snail', + 'beetle', + 'butterfly', + ], + canBuy () { + return moment().isBetween('2018-02-06', '2018-04-02'); + }, + type: 'quests', + value: 7, + }, + cuddleBuddies: { + key: 'cuddleBuddies', + text: t('cuddleBuddiesText'), + notes: t('cuddleBuddiesNotes'), + bundleKeys: [ + 'bunny', + 'ferret', + 'guineapig', + ], + canBuy () { + return moment().isBetween('2018-05-08', '2018-06-02'); + }, + type: 'quests', + value: 7, + }, + aquaticAmigos: { + key: 'aquaticAmigos', + text: t('aquaticAmigosText'), + notes: t('aquaticAmigosNotes'), + bundleKeys: [ + 'axolotl', + 'kraken', + 'octopus', + ], + canBuy () { + return moment().isBetween('2018-06-12', '2018-07-02'); + }, + type: 'quests', + value: 7, + }, + forestFriends: { + key: 'forestFriends', + text: t('forestFriendsText'), + notes: t('forestFriendsNotes'), + bundleKeys: [ + 'ghost_stag', + 'hedgehog', + 'treeling', + ], + canBuy () { + return moment().isBetween('2018-09-11', '2018-10-02'); + }, + type: 'quests', + value: 7, + }, + oddballs: { + key: 'oddballs', + text: t('oddballsText'), + notes: t('oddballsNotes'), + bundleKeys: [ + 'slime', + 'rock', + 'yarn', + ], + canBuy () { + return moment().isBetween('2019-06-10', '2019-07-03'); + }, + type: 'quests', + value: 7, + }, + birdBuddies: { + key: 'birdBuddies', + text: t('birdBuddiesText'), + notes: t('birdBuddiesNotes'), + bundleKeys: [ + 'peacock', + 'penguin', + 'rooster', + ], + canBuy () { + return moment().isBetween('2018-12-11', '2019-01-02'); + }, + type: 'quests', + value: 7, + }, + mythicalMarvels: { + key: 'mythicalMarvels', + text: t('mythicalMarvelsText'), + notes: t('mythicalMarvelsNotes'), + bundleKeys: [ + 'unicorn', + 'seaserpent', + 'gryphon', + ], + canBuy () { + return moment().isBetween('2019-02-19', '2019-03-02'); + }, + type: 'quests', + value: 7, + }, + rockingReptiles: { + key: 'rockingReptiles', + text: t('rockingReptilesText'), + notes: t('rockingReptilesNotes'), + bundleKeys: [ + 'alligator', + 'snake', + 'velociraptor', + ], + canBuy () { + return moment().isBetween('2019-09-10', '2019-10-02'); + }, + type: 'quests', + value: 7, + }, + delightfulDinos: { + key: 'delightfulDinos', + text: t('delightfulDinosText'), + notes: t('delightfulDinosNotes'), + bundleKeys: [ + 'pterodactyl', + 'triceratops', + 'trex_undead', + ], + canBuy () { + return moment().isBetween('2019-11-14', '2019-12-02'); + }, + type: 'quests', + value: 7, + }, +}; + +export default bundles; diff --git a/website/common/script/content/index.js b/website/common/script/content/index.js index a879fd9dfb..1d33d8af2c 100644 --- a/website/common/script/content/index.js +++ b/website/common/script/content/index.js @@ -1,6 +1,5 @@ import defaults from 'lodash/defaults'; import each from 'lodash/each'; -import moment from 'moment'; import t from './translation'; import { tasksByCategory } from './tasks'; @@ -26,6 +25,7 @@ import { import appearances from './appearance'; import { backgroundsTree, backgroundsFlat } from './appearance/backgrounds'; +import bundles from './bundles'; import spells from './spells'; // eslint-disable-line import/no-cycle import subscriptionBlocks from './subscriptionBlocks'; import faq from './faq'; @@ -58,211 +58,7 @@ api.timeTravelerStore = timeTravelers.timeTravelerStore; api.officialPinnedItems = officialPinnedItems; -/* - --------------------------------------------------------------- - Discounted Item Bundles - --------------------------------------------------------------- - */ - -api.bundles = { - featheredFriends: { - key: 'featheredFriends', - text: t('featheredFriendsText'), - notes: t('featheredFriendsNotes'), - bundleKeys: [ - 'falcon', - 'harpy', - 'owl', - ], - canBuy () { - return moment().isBetween('2019-05-09', '2019-06-02'); - }, - type: 'quests', - class: 'quest_bundle_featheredFriends', - value: 7, - }, - splashyPals: { - key: 'splashyPals', - text: t('splashyPalsText'), - notes: t('splashyPalsNotes'), - bundleKeys: [ - 'dilatory_derby', - 'turtle', - 'whale', - ], - canBuy () { - return moment().isBetween('2019-07-17', '2019-08-02'); - }, - type: 'quests', - class: 'quest_bundle_splashyPals', - value: 7, - }, - farmFriends: { - key: 'farmFriends', - text: t('farmFriendsText'), - notes: t('farmFriendsNotes'), - bundleKeys: [ - 'cow', - 'horse', - 'sheep', - ], - canBuy () { - return moment().isBetween('2019-08-08', '2019-09-02'); - }, - type: 'quests', - value: 7, - }, - witchyFamiliars: { - key: 'witchyFamiliars', - text: t('witchyFamiliarsText'), - notes: t('witchyFamiliarsNotes'), - bundleKeys: [ - 'rat', - 'spider', - 'frog', - ], - canBuy () { - return moment().isBetween('2019-10-15', '2019-11-02'); - }, - type: 'quests', - value: 7, - }, - winterQuests: { - key: 'winterQuests', - text: t('winterQuestsText'), - notes: t('winterQuestsNotes'), - bundleKeys: [ - 'evilsanta', - 'evilsanta2', - 'penguin', - ], - canBuy () { - return moment().isBetween('2017-12-14', '2018-01-01'); - }, - type: 'quests', - value: 7, - }, - hugabug: { - key: 'hugabug', - text: t('hugabugText'), - notes: t('hugabugNotes'), - bundleKeys: [ - 'snail', - 'beetle', - 'butterfly', - ], - canBuy () { - return moment().isBetween('2018-02-06', '2018-04-02'); - }, - type: 'quests', - value: 7, - }, - cuddleBuddies: { - key: 'cuddleBuddies', - text: t('cuddleBuddiesText'), - notes: t('cuddleBuddiesNotes'), - bundleKeys: [ - 'bunny', - 'ferret', - 'guineapig', - ], - canBuy () { - return moment().isBetween('2018-05-08', '2018-06-02'); - }, - type: 'quests', - value: 7, - }, - aquaticAmigos: { - key: 'aquaticAmigos', - text: t('aquaticAmigosText'), - notes: t('aquaticAmigosNotes'), - bundleKeys: [ - 'axolotl', - 'kraken', - 'octopus', - ], - canBuy () { - return moment().isBetween('2018-06-12', '2018-07-02'); - }, - type: 'quests', - value: 7, - }, - forestFriends: { - key: 'forestFriends', - text: t('forestFriendsText'), - notes: t('forestFriendsNotes'), - bundleKeys: [ - 'ghost_stag', - 'hedgehog', - 'treeling', - ], - canBuy () { - return moment().isBetween('2018-09-11', '2018-10-02'); - }, - type: 'quests', - value: 7, - }, - oddballs: { - key: 'oddballs', - text: t('oddballsText'), - notes: t('oddballsNotes'), - bundleKeys: [ - 'slime', - 'rock', - 'yarn', - ], - canBuy () { - return moment().isBetween('2019-06-10', '2019-07-03'); - }, - type: 'quests', - value: 7, - }, - birdBuddies: { - key: 'birdBuddies', - text: t('birdBuddiesText'), - notes: t('birdBuddiesNotes'), - bundleKeys: [ - 'peacock', - 'penguin', - 'rooster', - ], - canBuy () { - return moment().isBetween('2018-12-11', '2019-01-02'); - }, - type: 'quests', - value: 7, - }, - mythicalMarvels: { - key: 'mythicalMarvels', - text: t('mythicalMarvelsText'), - notes: t('mythicalMarvelsNotes'), - bundleKeys: [ - 'unicorn', - 'seaserpent', - 'gryphon', - ], - canBuy () { - return moment().isBetween('2019-02-19', '2019-03-02'); - }, - type: 'quests', - value: 7, - }, - rockingReptiles: { - key: 'rockingReptiles', - text: t('rockingReptilesText'), - notes: t('rockingReptilesNotes'), - bundleKeys: [ - 'alligator', - 'snake', - 'velociraptor', - ], - canBuy () { - return moment().isBetween('2019-09-10', '2019-10-02'); - }, - type: 'quests', - value: 7, - }, -}; +api.bundles = bundles; /* --------------------------------------------------------------- diff --git a/website/common/script/content/shop-featuredItems.js b/website/common/script/content/shop-featuredItems.js index 4fc960eaad..9099767c05 100644 --- a/website/common/script/content/shop-featuredItems.js +++ b/website/common/script/content/shop-featuredItems.js @@ -1,29 +1,53 @@ +import moment from 'moment'; + // Magic Hatching Potions are configured like this: // type: 'premiumHatchingPotion', // note no "s" at the end // path: 'premiumHatchingPotions.Rainbow', const featuredItems = { - market: [ - { - type: 'armoire', - path: 'armoire', - }, - { - type: 'premiumHatchingPotion', - path: 'premiumHatchingPotions.Ember', - }, - { - type: 'premiumHatchingPotion', - path: 'premiumHatchingPotions.Thunderstorm', - }, - { - type: 'food', - path: 'food.Saddle', - }, - ], + market () { + if (moment().isBetween('2019-11-01', '2019-12-02')) { + return [ + { + type: 'armoire', + path: 'armoire', + }, + { + type: 'premiumHatchingPotion', + path: 'premiumHatchingPotions.Ember', + }, + { + type: 'premiumHatchingPotion', + path: 'premiumHatchingPotions.Thunderstorm', + }, + { + type: 'food', + path: 'food.Saddle', + }, + ]; + } + return [ + { + type: 'armoire', + path: 'armoire', + }, + { + type: 'hatchingPotions', + path: 'hatchingPotions.Skeleton', + }, + { + type: 'eggs', + path: 'eggs.Fox', + }, + { + type: 'food', + path: 'food.Saddle', + }, + ]; + }, quests: [ { - type: 'quests', - path: 'quests.sloth', + type: 'bundles', + path: 'bundles.delightfulDinos', }, { type: 'quests', diff --git a/website/common/script/libs/shops.js b/website/common/script/libs/shops.js index 9fd1a7e27c..f919398602 100644 --- a/website/common/script/libs/shops.js +++ b/website/common/script/libs/shops.js @@ -30,7 +30,7 @@ shops.getMarketShop = function getMarketShop (user, language) { categories: shops.getMarketCategories(user, language), featured: { text: i18n.t('featuredItems'), - items: featuredItems.market.map(i => getItemInfo(user, i.type, get(content, i.path))), + items: featuredItems.market().map(i => getItemInfo(user, i.type, get(content, i.path))), }, }; }; diff --git a/website/raw_sprites/spritesmith/quests/scrolls/quest_bundle_delightfulDinos.png b/website/raw_sprites/spritesmith/quests/scrolls/quest_bundle_delightfulDinos.png new file mode 100644 index 0000000000..73e7502a93 Binary files /dev/null and b/website/raw_sprites/spritesmith/quests/scrolls/quest_bundle_delightfulDinos.png differ diff --git a/website/raw_sprites/spritesmith_large/promo_delightful_dinos.png b/website/raw_sprites/spritesmith_large/promo_delightful_dinos.png new file mode 100644 index 0000000000..42a8d5472e Binary files /dev/null and b/website/raw_sprites/spritesmith_large/promo_delightful_dinos.png differ diff --git a/website/raw_sprites/spritesmith_large/scene_habitica_map.png b/website/raw_sprites/spritesmith_large/scene_habitica_map.png new file mode 100644 index 0000000000..6924c934a6 Binary files /dev/null and b/website/raw_sprites/spritesmith_large/scene_habitica_map.png differ diff --git a/website/server/controllers/api-v3/news.js b/website/server/controllers/api-v3/news.js index 30d1deeb23..9d40d70390 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 = 'THUNDERSTORM AND EMBER HATCHING POTIONS'; +const LAST_ANNOUNCEMENT_TITLE = 'NEW DINOSAUR PET QUEST BUNDLE AND WIKI SPOTLIGHT'; const worldDmg = { // @TODO bailey: false, }; @@ -31,23 +31,38 @@ api.getNews = {

${res.t('newStuff')}

-

11/12/2019 - ${LAST_ANNOUNCEMENT_TITLE}

+

11/14/2019 - ${LAST_ANNOUNCEMENT_TITLE}


-
+
+

New Pet Quest Bundle: Delightful Dinos

- Two of your favorite Magic Hatching Potions are back! Between now and November 30, you - can buy Thunderstorm and Ember Hatching Potions from - the Market and use them to hatch any standard pet egg. - (Magic Hatching Potions do not work on Quest Pet eggs.) Magic Hatching Potion Pets - aren't picky, so they'll happily eat any kind of food that you feed them! + If you are looking to add some dinosaur pets to your Habitica stable, life, uh, finds a + way! From now until November 30, you can purchase the Delightful Dinos Pet Quest Bundle + and receive the Pterodactyl, Triceratops, and T-Rex (The Dinosaur Unearthed) 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!

-

- After they're gone, it will be at least a year before the Ember or Thunderstorm Hatching - Potions are available again, so be sure to get them now! +

by SabreCat and Beffymaroo
+
Art by Baconsaur, Eevachu, UncommonCriminal, Kiwibot, McCoyly, + plumilla, Seraphina, PainterProphet, Stefalupagus, Katy133, Edge, Willow The Witty, + Lilith of Alfheim, Procyon, GeraldThePixel, and Archeia +
+
Writing by Lemoness, Daniel the Bard, Lilith of Alfheim, and Ali + Stewart +
+
+

Blog Post: Places in Habitica

+

This month's featured Wiki article is about Places in Habitica! We hope that it + will help you as you gamify your tasks. Be sure to check it out, and let us know what + you think by reaching out on Twitter, Tumblr, and Facebook.

-
by Balduranne and SabreCat
+
by shanaqui and the Wiki Wizards
`, });