diff --git a/migrations/users/pi-day.js b/migrations/users/pi-day.js new file mode 100644 index 0000000000..83b0f48c10 --- /dev/null +++ b/migrations/users/pi-day.js @@ -0,0 +1,73 @@ +/* eslint-disable no-console */ +const MIGRATION_NAME = '20190312_pi_day'; +import { v4 as uuid } from 'uuid'; + +import { model as User } from '../../website/server/models/user'; + +const progressCount = 1000; +let count = 0; + +async function updateUser (user) { + count++; + + const inc = { + 'items.food.Pie_Skeleton': 1, + 'items.food.Pie_Base': 1, + 'items.food.Pie_CottonCandyBlue': 1, + 'items.food.Pie_CottonCandyPink': 1, + 'items.food.Pie_Shade': 1, + 'items.food.Pie_White': 1, + 'items.food.Pie_Golden': 1, + 'items.food.Pie_Zombie': 1, + 'items.food.Pie_Desert': 1, + 'items.food.Pie_Red': 1, + }; + const set = {}; + + set.migration = MIGRATION_NAME; + + set['items.gear.owned.head_special_piDay'] = false; + set['items.gear.owned.shield_special_piDay'] = false; + const push = [ + {type: 'marketGear', path: 'gear.flat.head_special_piDay', _id: uuid()}, + {type: 'marketGear', path: 'gear.flat.shield_special_piDay', _id: uuid()}, + ]; + + if (count % progressCount === 0) console.warn(`${count} ${user._id}`); + + return await User.update({_id: user._id}, {$inc: inc, $set: set, $push: {pinnedItems: {$each: push}}}).exec(); +} + +module.exports = async function processUsers () { + let query = { + migration: {$ne: MIGRATION_NAME}, + 'auth.timestamps.loggedin': {$gt: new Date('2019-02-15')}, + }; + + 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/common/locales/en/content.json b/website/common/locales/en/content.json index d858f1bc33..3aef3d7174 100644 --- a/website/common/locales/en/content.json +++ b/website/common/locales/en/content.json @@ -377,6 +377,37 @@ "foodCandyRedThe": "the Cinnamon Candy", "foodCandyRedA": "Cinnamon Candy", + "foodPieSkeleton": "Bone Marrow Pot Pie", + "foodPieSkeletonThe": "the Bone Marrow Pot Pie", + "foodPieSkeletonA": "a slice of Bone Marrow Pot Pie", + "foodPieBase": "Basic Apple Pie", + "foodPieBaseThe": "the Basic Apple Pie", + "foodPieBaseA": "a slice of Basic Apple Pie", + "foodPieCottonCandyBlue": "Blueberry Pie", + "foodPieCottonCandyBlueThe": "the Blueberry Pie", + "foodPieCottonCandyBlueA": "a slice of Blueberry Pie", + "foodPieCottonCandyPink": "Pink Rhubarb Pie", + "foodPieCottonCandyPinkThe": "the Pink Rhubarb Pie", + "foodPieCottonCandyPinkA": "a slice of Pink Rhubarb Pie", + "foodPieShade": "Dark Chocolate Pie", + "foodPieShadeThe": "the Dark Chocolate Pie", + "foodPieShadeA": "a slice of Dark Chocolate Pie", + "foodPieWhite": "Vanilla Pudding Pie", + "foodPieWhiteThe": "the Vanilla Pudding Pie", + "foodPieWhiteA": "a slice of Vanilla Pudding Pie", + "foodPieGolden": "Golden Banana Cream Pie", + "foodPieGoldenThe": "the Golden Banana Cream Pie", + "foodPieGoldenA": "a slice of Golden Banana Cream Pie", + "foodPieZombie": "Rotten Pie", + "foodPieZombieThe": "the Rotten Pie", + "foodPieZombieA": "a Rotten slice of Pie", + "foodPieDesert": "Desert Dessert Pie", + "foodPieDesertThe": "the Desert Dessert Pie", + "foodPieDesertA": "a slice of Desert Dessert Pie", + "foodPieRed": "Red Cherry Pie", + "foodPieRedThe": "the Red Cherry Pie", + "foodPieRedA": "a slice of Red Cherry Pie", + "foodSaddleText": "Saddle", "foodSaddleNotes": "Instantly raises one of your pets into a mount.", "foodSaddleSellWarningNote": "Hey! This is a pretty useful item! Are you familiar with how to use a Saddle with your Pets?", diff --git a/website/common/locales/en/gear.json b/website/common/locales/en/gear.json index b08a18d137..6065cea66c 100644 --- a/website/common/locales/en/gear.json +++ b/website/common/locales/en/gear.json @@ -975,6 +975,8 @@ "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.", + "headSpecialPiDayText": "Pi Hat", + "headSpecialPiDayNotes": "Try to balance this slice of delicious pie on your head while walking in a circle. Or throw it at a red Daily! Or you could just eat it. Your choice! 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.", @@ -1424,6 +1426,8 @@ "shieldSpecialWintryMirrorNotes": "How else to best admire your wintry look? Increases Intelligence by <%= int %>.", "shieldSpecialWakizashiText": "Wakizashi", "shieldSpecialWakizashiNotes": "This short sword is perfect for close-quarters battles with your Dailies! Increases Constitution by <%= con %>.", + "shieldSpecialPiDayText": "Pi Shield", + "shieldSpecialPiDayNotes": "We dare you to calculate the ratio of this shield's circumference to its deliciousness! Confers no benefit.", "shieldSpecialYetiText": "Yeti-Tamer Shield", "shieldSpecialYetiNotes": "This shield reflects light from the snow. Increases Constitution by <%= con %>. Limited Edition 2013-2014 Winter Gear.", diff --git a/website/common/script/content/gear/sets/special/index.js b/website/common/script/content/gear/sets/special/index.js index 7704437e33..98516c5a10 100644 --- a/website/common/script/content/gear/sets/special/index.js +++ b/website/common/script/content/gear/sets/special/index.js @@ -2506,6 +2506,12 @@ let head = { value: 0, canOwn: ownsItem('head_special_nye2018'), }, + piDay: { + text: t('headSpecialPiDayText'), + notes: t('headSpecialPiDayNotes'), + value: 0, + canOwn: ownsItem('head_special_piDay'), + }, }; let headAccessory = { @@ -3597,6 +3603,12 @@ let shield = { value: 70, con: 9, }, + piDay: { + text: t('shieldSpecialPiDayText'), + notes: t('shieldSpecialPiDayNotes'), + value: 0, + canOwn: ownsItem('shield_special_piDay'), + }, }; let weapon = { diff --git a/website/common/script/content/index.js b/website/common/script/content/index.js index f96800c4e5..d80ebd8153 100644 --- a/website/common/script/content/index.js +++ b/website/common/script/content/index.js @@ -370,13 +370,9 @@ api.premiumMounts = stable.premiumMounts; api.specialMounts = stable.specialMounts; api.mountInfo = stable.mountInfo; -// For seasonal events, change these booleans: -let canBuyNormalFood = true; -let canDropNormalFood = true; -let canBuyCandyFood = false; -let canDropCandyFood = false; -let canBuyCakeFood = false; -let canDropCakeFood = false; +// For seasonal events, change this constant: + +const FOOD_SEASON = 'Pie'; api.food = { Meat: { @@ -385,9 +381,9 @@ api.food = { textThe: t('foodMeatThe'), target: 'Base', canBuy () { - return canBuyNormalFood; + return FOOD_SEASON === 'Normal'; }, - canDrop: canDropNormalFood, + canDrop: FOOD_SEASON === 'Normal', }, Milk: { text: t('foodMilk'), @@ -395,9 +391,9 @@ api.food = { textThe: t('foodMilkThe'), target: 'White', canBuy () { - return canBuyNormalFood; + return FOOD_SEASON === 'Normal'; }, - canDrop: canDropNormalFood, + canDrop: FOOD_SEASON === 'Normal', }, Potatoe: { text: t('foodPotatoe'), @@ -405,9 +401,9 @@ api.food = { textThe: t('foodPotatoeThe'), target: 'Desert', canBuy () { - return canBuyNormalFood; + return FOOD_SEASON === 'Normal'; }, - canDrop: canDropNormalFood, + canDrop: FOOD_SEASON === 'Normal', }, Strawberry: { text: t('foodStrawberry'), @@ -415,9 +411,9 @@ api.food = { textThe: t('foodStrawberryThe'), target: 'Red', canBuy () { - return canBuyNormalFood; + return FOOD_SEASON === 'Normal'; }, - canDrop: canDropNormalFood, + canDrop: FOOD_SEASON === 'Normal', }, Chocolate: { text: t('foodChocolate'), @@ -425,9 +421,9 @@ api.food = { textThe: t('foodChocolateThe'), target: 'Shade', canBuy () { - return canBuyNormalFood; + return FOOD_SEASON === 'Normal'; }, - canDrop: canDropNormalFood, + canDrop: FOOD_SEASON === 'Normal', }, Fish: { text: t('foodFish'), @@ -435,9 +431,9 @@ api.food = { textThe: t('foodFishThe'), target: 'Skeleton', canBuy () { - return canBuyNormalFood; + return FOOD_SEASON === 'Normal'; }, - canDrop: canDropNormalFood, + canDrop: FOOD_SEASON === 'Normal', }, RottenMeat: { text: t('foodRottenMeat'), @@ -445,9 +441,9 @@ api.food = { textThe: t('foodRottenMeatThe'), target: 'Zombie', canBuy () { - return canBuyNormalFood; + return FOOD_SEASON === 'Normal'; }, - canDrop: canDropNormalFood, + canDrop: FOOD_SEASON === 'Normal', }, CottonCandyPink: { text: t('foodCottonCandyPink'), @@ -455,9 +451,9 @@ api.food = { textThe: t('foodCottonCandyPinkThe'), target: 'CottonCandyPink', canBuy () { - return canBuyNormalFood; + return FOOD_SEASON === 'Normal'; }, - canDrop: canDropNormalFood, + canDrop: FOOD_SEASON === 'Normal', }, CottonCandyBlue: { text: t('foodCottonCandyBlue'), @@ -465,9 +461,9 @@ api.food = { textThe: t('foodCottonCandyBlueThe'), target: 'CottonCandyBlue', canBuy () { - return canBuyNormalFood; + return FOOD_SEASON === 'Normal'; }, - canDrop: canDropNormalFood, + canDrop: FOOD_SEASON === 'Normal', }, Honey: { text: t('foodHoney'), @@ -475,9 +471,9 @@ api.food = { textThe: t('foodHoneyThe'), target: 'Golden', canBuy () { - return canBuyNormalFood; + return FOOD_SEASON === 'Normal'; }, - canDrop: canDropNormalFood, + canDrop: FOOD_SEASON === 'Normal', }, Saddle: { canBuy () { @@ -495,9 +491,9 @@ api.food = { textThe: t('foodCakeSkeletonThe'), target: 'Skeleton', canBuy () { - return canBuyCakeFood; + return FOOD_SEASON === 'Cake'; }, - canDrop: canDropCakeFood, + canDrop: FOOD_SEASON === 'Cake', }, Cake_Base: { text: t('foodCakeBase'), @@ -505,9 +501,9 @@ api.food = { textThe: t('foodCakeBaseThe'), target: 'Base', canBuy () { - return canBuyCakeFood; + return FOOD_SEASON === 'Cake'; }, - canDrop: canDropCakeFood, + canDrop: FOOD_SEASON === 'Cake', }, Cake_CottonCandyBlue: { text: t('foodCakeCottonCandyBlue'), @@ -515,9 +511,9 @@ api.food = { textThe: t('foodCakeCottonCandyBlueThe'), target: 'CottonCandyBlue', canBuy () { - return canBuyCakeFood; + return FOOD_SEASON === 'Cake'; }, - canDrop: canDropCakeFood, + canDrop: FOOD_SEASON === 'Cake', }, Cake_CottonCandyPink: { text: t('foodCakeCottonCandyPink'), @@ -525,9 +521,9 @@ api.food = { textThe: t('foodCakeCottonCandyPinkThe'), target: 'CottonCandyPink', canBuy () { - return canBuyCakeFood; + return FOOD_SEASON === 'Cake'; }, - canDrop: canDropCakeFood, + canDrop: FOOD_SEASON === 'Cake', }, Cake_Shade: { text: t('foodCakeShade'), @@ -535,9 +531,9 @@ api.food = { textThe: t('foodCakeShadeThe'), target: 'Shade', canBuy () { - return canBuyCakeFood; + return FOOD_SEASON === 'Cake'; }, - canDrop: canDropCakeFood, + canDrop: FOOD_SEASON === 'Cake', }, Cake_White: { text: t('foodCakeWhite'), @@ -545,9 +541,9 @@ api.food = { textThe: t('foodCakeWhiteThe'), target: 'White', canBuy () { - return canBuyCakeFood; + return FOOD_SEASON === 'Cake'; }, - canDrop: canDropCakeFood, + canDrop: FOOD_SEASON === 'Cake', }, Cake_Golden: { text: t('foodCakeGolden'), @@ -555,9 +551,9 @@ api.food = { textThe: t('foodCakeGoldenThe'), target: 'Golden', canBuy () { - return canBuyCakeFood; + return FOOD_SEASON === 'Cake'; }, - canDrop: canDropCakeFood, + canDrop: FOOD_SEASON === 'Cake', }, Cake_Zombie: { text: t('foodCakeZombie'), @@ -565,9 +561,9 @@ api.food = { textThe: t('foodCakeZombieThe'), target: 'Zombie', canBuy () { - return canBuyCakeFood; + return FOOD_SEASON === 'Cake'; }, - canDrop: canDropCakeFood, + canDrop: FOOD_SEASON === 'Cake', }, Cake_Desert: { text: t('foodCakeDesert'), @@ -575,9 +571,9 @@ api.food = { textThe: t('foodCakeDesertThe'), target: 'Desert', canBuy () { - return canBuyCakeFood; + return FOOD_SEASON === 'Cake'; }, - canDrop: canDropCakeFood, + canDrop: FOOD_SEASON === 'Cake', }, Cake_Red: { text: t('foodCakeRed'), @@ -585,9 +581,9 @@ api.food = { textThe: t('foodCakeRedThe'), target: 'Red', canBuy () { - return canBuyCakeFood; + return FOOD_SEASON === 'Cake'; }, - canDrop: canDropCakeFood, + canDrop: FOOD_SEASON === 'Cake', }, Candy_Skeleton: { text: t('foodCandySkeleton'), @@ -595,9 +591,9 @@ api.food = { textThe: t('foodCandySkeletonThe'), target: 'Skeleton', canBuy () { - return canBuyCandyFood; + return FOOD_SEASON === 'Candy'; }, - canDrop: canDropCandyFood, + canDrop: FOOD_SEASON === 'Candy', }, Candy_Base: { text: t('foodCandyBase'), @@ -605,9 +601,9 @@ api.food = { textThe: t('foodCandyBaseThe'), target: 'Base', canBuy () { - return canBuyCandyFood; + return FOOD_SEASON === 'Candy'; }, - canDrop: canDropCandyFood, + canDrop: FOOD_SEASON === 'Candy', }, Candy_CottonCandyBlue: { text: t('foodCandyCottonCandyBlue'), @@ -615,9 +611,9 @@ api.food = { textThe: t('foodCandyCottonCandyBlueThe'), target: 'CottonCandyBlue', canBuy () { - return canBuyCandyFood; + return FOOD_SEASON === 'Candy'; }, - canDrop: canDropCandyFood, + canDrop: FOOD_SEASON === 'Candy', }, Candy_CottonCandyPink: { text: t('foodCandyCottonCandyPink'), @@ -625,9 +621,9 @@ api.food = { textThe: t('foodCandyCottonCandyPinkThe'), target: 'CottonCandyPink', canBuy () { - return canBuyCandyFood; + return FOOD_SEASON === 'Candy'; }, - canDrop: canDropCandyFood, + canDrop: FOOD_SEASON === 'Candy', }, Candy_Shade: { text: t('foodCandyShade'), @@ -635,9 +631,9 @@ api.food = { textThe: t('foodCandyShadeThe'), target: 'Shade', canBuy () { - return canBuyCandyFood; + return FOOD_SEASON === 'Candy'; }, - canDrop: canDropCandyFood, + canDrop: FOOD_SEASON === 'Candy', }, Candy_White: { text: t('foodCandyWhite'), @@ -645,9 +641,9 @@ api.food = { textThe: t('foodCandyWhiteThe'), target: 'White', canBuy () { - return canBuyCandyFood; + return FOOD_SEASON === 'Candy'; }, - canDrop: canDropCandyFood, + canDrop: FOOD_SEASON === 'Candy', }, Candy_Golden: { text: t('foodCandyGolden'), @@ -655,9 +651,9 @@ api.food = { textThe: t('foodCandyGoldenThe'), target: 'Golden', canBuy () { - return canBuyCandyFood; + return FOOD_SEASON === 'Candy'; }, - canDrop: canDropCandyFood, + canDrop: FOOD_SEASON === 'Candy', }, Candy_Zombie: { text: t('foodCandyZombie'), @@ -665,9 +661,9 @@ api.food = { textThe: t('foodCandyZombieThe'), target: 'Zombie', canBuy () { - return canBuyCandyFood; + return FOOD_SEASON === 'Candy'; }, - canDrop: canDropCandyFood, + canDrop: FOOD_SEASON === 'Candy', }, Candy_Desert: { text: t('foodCandyDesert'), @@ -675,9 +671,9 @@ api.food = { textThe: t('foodCandyDesertThe'), target: 'Desert', canBuy () { - return canBuyCandyFood; + return FOOD_SEASON === 'Candy'; }, - canDrop: canDropCandyFood, + canDrop: FOOD_SEASON === 'Candy', }, Candy_Red: { text: t('foodCandyRed'), @@ -685,9 +681,109 @@ api.food = { textThe: t('foodCandyRedThe'), target: 'Red', canBuy () { - return canBuyCandyFood; + return FOOD_SEASON === 'Candy'; }, - canDrop: canDropCandyFood, + canDrop: FOOD_SEASON === 'Candy', + }, + Pie_Skeleton: { + text: t('foodPieSkeleton'), + textA: t('foodPieSkeletonA'), + textThe: t('foodPieSkeletonThe'), + target: 'Skeleton', + canBuy () { + return FOOD_SEASON === 'Pie'; + }, + canDrop: FOOD_SEASON === 'Pie', + }, + Pie_Base: { + text: t('foodPieBase'), + textA: t('foodPieBaseA'), + textThe: t('foodPieBaseThe'), + target: 'Base', + canBuy () { + return FOOD_SEASON === 'Pie'; + }, + canDrop: FOOD_SEASON === 'Pie', + }, + Pie_CottonCandyBlue: { + text: t('foodPieCottonCandyBlue'), + textA: t('foodPieCottonCandyBlueA'), + textThe: t('foodPieCottonCandyBlueThe'), + target: 'CottonCandyBlue', + canBuy () { + return FOOD_SEASON === 'Pie'; + }, + canDrop: FOOD_SEASON === 'Pie', + }, + Pie_CottonCandyPink: { + text: t('foodPieCottonCandyPink'), + textA: t('foodPieCottonCandyPinkA'), + textThe: t('foodPieCottonCandyPinkThe'), + target: 'CottonCandyPink', + canBuy () { + return FOOD_SEASON === 'Pie'; + }, + canDrop: FOOD_SEASON === 'Pie', + }, + Pie_Shade: { + text: t('foodPieShade'), + textA: t('foodPieShadeA'), + textThe: t('foodPieShadeThe'), + target: 'Shade', + canBuy () { + return FOOD_SEASON === 'Pie'; + }, + canDrop: FOOD_SEASON === 'Pie', + }, + Pie_White: { + text: t('foodPieWhite'), + textA: t('foodPieWhiteA'), + textThe: t('foodPieWhiteThe'), + target: 'White', + canBuy () { + return FOOD_SEASON === 'Pie'; + }, + canDrop: FOOD_SEASON === 'Pie', + }, + Pie_Golden: { + text: t('foodPieGolden'), + textA: t('foodPieGoldenA'), + textThe: t('foodPieGoldenThe'), + target: 'Golden', + canBuy () { + return FOOD_SEASON === 'Pie'; + }, + canDrop: FOOD_SEASON === 'Pie', + }, + Pie_Zombie: { + text: t('foodPieZombie'), + textA: t('foodPieZombieA'), + textThe: t('foodPieZombieThe'), + target: 'Zombie', + canBuy () { + return FOOD_SEASON === 'Pie'; + }, + canDrop: FOOD_SEASON === 'Pie', + }, + Pie_Desert: { + text: t('foodPieDesert'), + textA: t('foodPieDesertA'), + textThe: t('foodPieDesertThe'), + target: 'Desert', + canBuy () { + return FOOD_SEASON === 'Pie'; + }, + canDrop: FOOD_SEASON === 'Pie', + }, + Pie_Red: { + text: t('foodPieRed'), + textA: t('foodPieRedA'), + textThe: t('foodPieRedThe'), + target: 'Red', + canBuy () { + return FOOD_SEASON === 'Pie'; + }, + canDrop: FOOD_SEASON === 'Pie', }, /* eslint-enable camelcase */ }; diff --git a/website/raw_sprites/spritesmith/gear/events/piDay/head_special_piDay.png b/website/raw_sprites/spritesmith/gear/events/piDay/head_special_piDay.png new file mode 100644 index 0000000000..042a1c45f3 Binary files /dev/null and b/website/raw_sprites/spritesmith/gear/events/piDay/head_special_piDay.png differ diff --git a/website/raw_sprites/spritesmith/gear/events/piDay/shield_special_piDay.png b/website/raw_sprites/spritesmith/gear/events/piDay/shield_special_piDay.png new file mode 100644 index 0000000000..c8cd7113a8 Binary files /dev/null and b/website/raw_sprites/spritesmith/gear/events/piDay/shield_special_piDay.png differ diff --git a/website/raw_sprites/spritesmith/gear/events/piDay/shop_head_special_piDay.png b/website/raw_sprites/spritesmith/gear/events/piDay/shop_head_special_piDay.png new file mode 100644 index 0000000000..ef534c7212 Binary files /dev/null and b/website/raw_sprites/spritesmith/gear/events/piDay/shop_head_special_piDay.png differ diff --git a/website/raw_sprites/spritesmith/gear/events/piDay/shop_shield_special_piDay.png b/website/raw_sprites/spritesmith/gear/events/piDay/shop_shield_special_piDay.png new file mode 100644 index 0000000000..0289cc564f Binary files /dev/null and b/website/raw_sprites/spritesmith/gear/events/piDay/shop_shield_special_piDay.png differ diff --git a/website/raw_sprites/spritesmith/stable/food/Pet_Food_Pie_Base.png b/website/raw_sprites/spritesmith/stable/food/Pet_Food_Pie_Base.png new file mode 100644 index 0000000000..0f06841633 Binary files /dev/null and b/website/raw_sprites/spritesmith/stable/food/Pet_Food_Pie_Base.png differ diff --git a/website/raw_sprites/spritesmith/stable/food/Pet_Food_Pie_CottonCandyBlue.png b/website/raw_sprites/spritesmith/stable/food/Pet_Food_Pie_CottonCandyBlue.png new file mode 100644 index 0000000000..6dd3df0dcf Binary files /dev/null and b/website/raw_sprites/spritesmith/stable/food/Pet_Food_Pie_CottonCandyBlue.png differ diff --git a/website/raw_sprites/spritesmith/stable/food/Pet_Food_Pie_CottonCandyPink.png b/website/raw_sprites/spritesmith/stable/food/Pet_Food_Pie_CottonCandyPink.png new file mode 100644 index 0000000000..210ac974fc Binary files /dev/null and b/website/raw_sprites/spritesmith/stable/food/Pet_Food_Pie_CottonCandyPink.png differ diff --git a/website/raw_sprites/spritesmith/stable/food/Pet_Food_Pie_Desert.png b/website/raw_sprites/spritesmith/stable/food/Pet_Food_Pie_Desert.png new file mode 100644 index 0000000000..dd2ab6bae1 Binary files /dev/null and b/website/raw_sprites/spritesmith/stable/food/Pet_Food_Pie_Desert.png differ diff --git a/website/raw_sprites/spritesmith/stable/food/Pet_Food_Pie_Golden.png b/website/raw_sprites/spritesmith/stable/food/Pet_Food_Pie_Golden.png new file mode 100644 index 0000000000..bff877d248 Binary files /dev/null and b/website/raw_sprites/spritesmith/stable/food/Pet_Food_Pie_Golden.png differ diff --git a/website/raw_sprites/spritesmith/stable/food/Pet_Food_Pie_Red.png b/website/raw_sprites/spritesmith/stable/food/Pet_Food_Pie_Red.png new file mode 100644 index 0000000000..bfc2148a4c Binary files /dev/null and b/website/raw_sprites/spritesmith/stable/food/Pet_Food_Pie_Red.png differ diff --git a/website/raw_sprites/spritesmith/stable/food/Pet_Food_Pie_Shade.png b/website/raw_sprites/spritesmith/stable/food/Pet_Food_Pie_Shade.png new file mode 100644 index 0000000000..f32497452e Binary files /dev/null and b/website/raw_sprites/spritesmith/stable/food/Pet_Food_Pie_Shade.png differ diff --git a/website/raw_sprites/spritesmith/stable/food/Pet_Food_Pie_Skeleton.png b/website/raw_sprites/spritesmith/stable/food/Pet_Food_Pie_Skeleton.png new file mode 100644 index 0000000000..c2fcc6a3f0 Binary files /dev/null and b/website/raw_sprites/spritesmith/stable/food/Pet_Food_Pie_Skeleton.png differ diff --git a/website/raw_sprites/spritesmith/stable/food/Pet_Food_Pie_White.png b/website/raw_sprites/spritesmith/stable/food/Pet_Food_Pie_White.png new file mode 100644 index 0000000000..c789272368 Binary files /dev/null and b/website/raw_sprites/spritesmith/stable/food/Pet_Food_Pie_White.png differ diff --git a/website/raw_sprites/spritesmith/stable/food/Pet_Food_Pie_Zombie.png b/website/raw_sprites/spritesmith/stable/food/Pet_Food_Pie_Zombie.png new file mode 100644 index 0000000000..454cdb0987 Binary files /dev/null and b/website/raw_sprites/spritesmith/stable/food/Pet_Food_Pie_Zombie.png differ diff --git a/website/raw_sprites/spritesmith_large/promo_pi_day.png b/website/raw_sprites/spritesmith_large/promo_pi_day.png new file mode 100644 index 0000000000..294b4c6a4e Binary files /dev/null and b/website/raw_sprites/spritesmith_large/promo_pi_day.png differ diff --git a/website/server/controllers/api-v3/news.js b/website/server/controllers/api-v3/news.js index 7c58c81c46..1336c28c06 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 = 'MARCH BACKGROUNDS AND ARMOIRE ITEMS!'; +const LAST_ANNOUNCEMENT_TITLE = 'CELEBRATE PI DAY WITH HABITICA!'; const worldDmg = { // @TODO bailey: false, }; @@ -30,14 +30,14 @@ api.getNews = {
We’ve added three new backgrounds to the Background Shop! Now your avatar can feed the birds at the Duck Pond, browse the Flower Market and go on the hunt for Spring goodies in a Field with Colored Eggs. Check them out under User Icon > Backgrounds!
-Plus, there’s new Gold-purchasable equipment in the Enchanted Armoire, including the Vernal Vestment set. Better work hard on your real-life tasks to earn all the pieces! Enjoy :)
-Hello Habiticans! In celebration of Pi Day on March 14, we've gifted everyone delicious slices of pie for you all to feed to your pets.
+We've also given everyone a festive Pi Hat and Shield so you can celebrate in style. Enjoy them, and thanks for being a part of our community!
+