diff --git a/migrations/users/20181122_turkey_day.js b/migrations/users/20181122_turkey_day.js new file mode 100644 index 0000000000..c68cd97b29 --- /dev/null +++ b/migrations/users/20181122_turkey_day.js @@ -0,0 +1,110 @@ +/* eslint-disable no-console */ +const MIGRATION_NAME = '20181122_turkey_day'; +import mongoose from 'mongoose'; +import { model as User } from '../../website/server/models/user'; + +const progressCount = 1000; +let count = 0; + +async function updateUser (user) { + count++; + + const set = {}; + let push; + + set.migration = MIGRATION_NAME; + + if (typeof user.items.gear.owned.armor_special_turkeyArmorBase !== 'undefined') { + set['items.gear.owned.head_special_turkeyHelmGilded'] = false; + set['items.gear.owned.armor_special_turkeyArmorGilded'] = false; + set['items.gear.owned.back_special_turkeyTailGilded'] = false; + push = [ + { + type: 'marketGear', + path: 'gear.flat.head_special_turkeyHelmGilded', + _id: new mongoose.Types.ObjectId(), + }, + { + type: 'marketGear', + path: 'gear.flat.armor_special_turkeyArmorGilded', + _id: new mongoose.Types.ObjectId(), + }, + { + type: 'marketGear', + path: 'gear.flat.back_special_turkeyTailGilded', + _id: new mongoose.Types.ObjectId(), + }, + ]; + } else if (user.items && user.items.mounts && user.items.mounts['Turkey-Gilded']) { + set['items.gear.owned.head_special_turkeyHelmBase'] = false; + set['items.gear.owned.armor_special_turkeyArmorBase'] = false; + set['items.gear.owned.back_special_turkeyTailBase'] = false; + push = [ + { + type: 'marketGear', + path: 'gear.flat.head_special_turkeyHelmBase', + _id: new mongoose.Types.ObjectId(), + }, + { + type: 'marketGear', + path: 'gear.flat.armor_special_turkeyArmorBase', + _id: new mongoose.Types.ObjectId(), + }, + { + type: 'marketGear', + path: 'gear.flat.back_special_turkeyTailBase', + _id: new mongoose.Types.ObjectId(), + }, + ]; + } else if (user.items && user.items.pets && user.items.pets['Turkey-Gilded']) { + set['items.mounts.Turkey-Gilded'] = true; + } else if (user.items && user.items.mounts && user.items.mounts['Turkey-Base']) { + set['items.pets.Turkey-Gilded'] = 5; + } else if (user.items && user.items.pets && user.items.pets['Turkey-Base']) { + set['items.mounts.Turkey-Base'] = true; + } else { + set['items.pets.Turkey-Base'] = 5; + } + + if (count % progressCount === 0) console.warn(`${count} ${user._id}`); + + if (push) { + return await User.update({_id: user._id}, {$set: set, $push: {pinnedItems: {$each: push}}}).exec(); + } else { + 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('2018-11-07')}, + }; + + 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], + }; + } + + await Promise.all(users.map(updateUser)); // eslint-disable-line no-await-in-loop + } +}; diff --git a/website/client/assets/scss/variables.scss b/website/client/assets/scss/variables.scss index 573376536b..ce054846bc 100644 --- a/website/client/assets/scss/variables.scss +++ b/website/client/assets/scss/variables.scss @@ -2,8 +2,8 @@ // possible values are: normal, fall, habitoween, thanksgiving, winter, nye, birthday, valentines, spring, summer // more to be added on future seasons -$npc_market_flavor: 'normal'; -$npc_quests_flavor: 'normal'; -$npc_seasonal_flavor: 'normal'; +$npc_market_flavor: 'thanksgiving'; +$npc_quests_flavor: 'thanksgiving'; +$npc_seasonal_flavor: 'thanksgiving'; $npc_timetravelers_flavor: 'normal'; -$npc_tavern_flavor: 'normal'; +$npc_tavern_flavor: 'thanksgiving'; diff --git a/website/common/locales/en/gear.json b/website/common/locales/en/gear.json index 5bb20fe3b9..2c6563f9bc 100644 --- a/website/common/locales/en/gear.json +++ b/website/common/locales/en/gear.json @@ -477,6 +477,8 @@ "armorSpecialSamuraiArmorNotes": "This strong, scaled armor is held together by elegant silk cords. Increases Perception by <%= per %>.", "armorSpecialTurkeyArmorBaseText": "Turkey Armor", "armorSpecialTurkeyArmorBaseNotes": "Keep your drumsticks warm and cozy in this feathery armor! Confers no benefit.", + "armorSpecialTurkeyArmorGildedText": "Gilded Turkey Armor", + "armorSpecialTurkeyArmorGildedNotes": "Strut your stuff in this seasonally shiny armor! Confers no benefit.", "armorSpecialYetiText": "Yeti-Tamer Robe", "armorSpecialYetiNotes": "Fuzzy and fierce. Increases Constitution by <%= con %>. Limited Edition 2013-2014 Winter Gear.", @@ -933,6 +935,8 @@ "headSpecialNamingDay2017Notes": "Happy Naming Day! Wear this fierce and feathery helm as you celebrate Habitica. Confers no benefit.", "headSpecialTurkeyHelmBaseText": "Turkey Helm", "headSpecialTurkeyHelmBaseNotes": "Your Turkey Day look will be complete when you don this beaked helm! Confers no benefit.", + "headSpecialTurkeyHelmGildedText": "Gilded Turkey Helm", + "headSpecialTurkeyHelmGildedNotes": "Gobble gobble! Bling bling! Confers no benefit.", "headSpecialNyeText": "Absurd Party Hat", "headSpecialNyeNotes": "You've received an Absurd Party Hat! Wear it with pride while ringing in the New Year! Confers no benefit.", @@ -1617,6 +1621,8 @@ "backSpecialAetherCloakNotes": "This cloak once belonged to the Lost Masterclasser herself. Increases Perception by <%= per %>.", "backSpecialTurkeyTailBaseText": "Turkey Tail", "backSpecialTurkeyTailBaseNotes": "Wear your noble Turkey Tail with pride while you celebrate! Confers no benefit.", + "backSpecialTurkeyTailGildedText": "Gilded Turkey Tail", + "backSpecialTurkeyTailGildedNotes": "Plumage fit for a parade! Confers no benefit.", "backBearTailText": "Bear Tail", "backBearTailNotes": "This tail makes you look like a brave bear! Confers no benefit.", "backCactusTailText": "Cactus Tail", diff --git a/website/common/script/content/gear/sets/special/index.js b/website/common/script/content/gear/sets/special/index.js index d163bde3f5..998308cda2 100644 --- a/website/common/script/content/gear/sets/special/index.js +++ b/website/common/script/content/gear/sets/special/index.js @@ -1053,6 +1053,12 @@ let armor = { value: 90, con: 15, }, + turkeyArmorGilded: { + text: t('armorSpecialTurkeyArmorGildedText'), + notes: t('armorSpecialTurkeyArmorGildedNotes'), + value: 0, + canOwn: ownsItem('armor_special_turkeyArmorGilded'), + }, }; let back = { @@ -1157,6 +1163,12 @@ let back = { return true; }, }, + turkeyTailGilded: { + text: t('backSpecialTurkeyTailGildedText'), + notes: t('backSpecialTurkeyTailGildedNotes'), + value: 0, + canOwn: ownsItem('back_special_turkeyTailGilded'), + }, }; let body = { @@ -2380,6 +2392,12 @@ let head = { value: 60, int: 7, }, + turkeyHelmGilded: { + text: t('headSpecialTurkeyHelmGildedText'), + notes: t('headSpecialTurkeyHelmGildedNotes'), + value: 0, + canOwn: ownsItem('head_special_turkeyHelmGilded'), + }, }; let headAccessory = { diff --git a/website/raw_sprites/spritesmith/gear/armor/broad_armor_special_turkeyArmorGilded.png b/website/raw_sprites/spritesmith/gear/armor/broad_armor_special_turkeyArmorGilded.png new file mode 100644 index 0000000000..2c86483842 Binary files /dev/null and b/website/raw_sprites/spritesmith/gear/armor/broad_armor_special_turkeyArmorGilded.png differ diff --git a/website/raw_sprites/spritesmith/gear/armor/shop/shop_armor_special_turkeyArmorGilded.png b/website/raw_sprites/spritesmith/gear/armor/shop/shop_armor_special_turkeyArmorGilded.png new file mode 100644 index 0000000000..7350389a59 Binary files /dev/null and b/website/raw_sprites/spritesmith/gear/armor/shop/shop_armor_special_turkeyArmorGilded.png differ diff --git a/website/raw_sprites/spritesmith/gear/armor/slim_armor_special_turkeyArmorGilded.png b/website/raw_sprites/spritesmith/gear/armor/slim_armor_special_turkeyArmorGilded.png new file mode 100644 index 0000000000..655bf873a2 Binary files /dev/null and b/website/raw_sprites/spritesmith/gear/armor/slim_armor_special_turkeyArmorGilded.png differ diff --git a/website/raw_sprites/spritesmith/gear/back/back_special_turkeyTailGilded.png b/website/raw_sprites/spritesmith/gear/back/back_special_turkeyTailGilded.png new file mode 100644 index 0000000000..3bc81bb833 Binary files /dev/null and b/website/raw_sprites/spritesmith/gear/back/back_special_turkeyTailGilded.png differ diff --git a/website/raw_sprites/spritesmith/gear/back/shop/shop_back_special_turkeyTailGilded.png b/website/raw_sprites/spritesmith/gear/back/shop/shop_back_special_turkeyTailGilded.png new file mode 100644 index 0000000000..15890f1080 Binary files /dev/null and b/website/raw_sprites/spritesmith/gear/back/shop/shop_back_special_turkeyTailGilded.png differ diff --git a/website/raw_sprites/spritesmith/gear/head/head_special_turkeyHelmGilded.png b/website/raw_sprites/spritesmith/gear/head/head_special_turkeyHelmGilded.png new file mode 100644 index 0000000000..905d1aafc2 Binary files /dev/null and b/website/raw_sprites/spritesmith/gear/head/head_special_turkeyHelmGilded.png differ diff --git a/website/raw_sprites/spritesmith/gear/head/shop/shop_head_special_turkeyHelmGilded.png b/website/raw_sprites/spritesmith/gear/head/shop/shop_head_special_turkeyHelmGilded.png new file mode 100644 index 0000000000..6ef7e87595 Binary files /dev/null and b/website/raw_sprites/spritesmith/gear/head/shop/shop_head_special_turkeyHelmGilded.png differ diff --git a/website/raw_sprites/spritesmith/npcs/npc_bailey.png b/website/raw_sprites/spritesmith/npcs/npc_bailey.png index d5940b986b..ee18cd560d 100644 Binary files a/website/raw_sprites/spritesmith/npcs/npc_bailey.png and b/website/raw_sprites/spritesmith/npcs/npc_bailey.png differ diff --git a/website/raw_sprites/spritesmith/npcs/npc_matt.png b/website/raw_sprites/spritesmith/npcs/npc_matt.png index 2531f1084b..ef720ee718 100644 Binary files a/website/raw_sprites/spritesmith/npcs/npc_matt.png and b/website/raw_sprites/spritesmith/npcs/npc_matt.png differ diff --git a/website/raw_sprites/spritesmith_large/promo_turkey_day_2018.png b/website/raw_sprites/spritesmith_large/promo_turkey_day_2018.png new file mode 100644 index 0000000000..c7cc560149 Binary files /dev/null and b/website/raw_sprites/spritesmith_large/promo_turkey_day_2018.png differ diff --git a/website/server/controllers/api-v3/news.js b/website/server/controllers/api-v3/news.js index ad10cdeab3..80eb3a356f 100644 --- a/website/server/controllers/api-v3/news.js +++ b/website/server/controllers/api-v3/news.js @@ -3,7 +3,7 @@ import { authWithHeaders } from '../../middlewares/auth'; let api = {}; // @TODO export this const, cannot export it from here because only routes are exported from controllers -const LAST_ANNOUNCEMENT_TITLE = 'THUNDERSTORM AND FROST HATCHING POTIONS'; +const LAST_ANNOUNCEMENT_TITLE = 'HAPPY THANKSGIVING!'; const worldDmg = { // @TODO bailey: false, }; @@ -30,14 +30,17 @@ api.getNews = {

${res.t('newStuff')}

-

11/20/2018 - ${LAST_ANNOUNCEMENT_TITLE}

+

11/22/2018 - ${LAST_ANNOUNCEMENT_TITLE}


-
-

We've brought back Thunderstorm Potions, and added a brand-new Magic Hatching Potion: Frost! Between now and November 30, you can buy these 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!

-

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

-
by Balduranne and SabreCat
+
+

It's Thanksgiving in Habitica! On this day Habiticans celebrate by spending time with loved ones, giving thanks, and riding their glorious turkeys into the magnificent sunset. Some of the NPCs are celebrating the occasion!

+

Turkey Pet, Mount, and Costumes!

+

In celebration of Turkey Day, everyone has received an adorable Turkey! What kind of Turkey? It all depends on how many Habitica Thanksgivings you've celebrated with us. Each Thanksgiving, you'll get a new and exciting Turkey variety!

+

Thank you for using Habitica - we really love you all <3

+
by Lemoness and Beffymaroo
+
`, }); diff --git a/website/server/models/user/hooks.js b/website/server/models/user/hooks.js index f85972d227..995fa34a87 100644 --- a/website/server/models/user/hooks.js +++ b/website/server/models/user/hooks.js @@ -125,7 +125,8 @@ function _setUpNewUser (user) { let iterableFlags = user.flags.toObject(); user.items.quests.dustbunnies = 1; - user.items.pets['Wolf-Veteran'] = 5; // Thank-you for users joining during username upheaval + user.items.pets['Turkey-Base'] = 5; + user.items.currentPet = 'Turkey-Base'; user.purchased.background.violet = true; user.preferences.background = 'violet';