From bc1eb62a3560fc9479bdcae4d4bc7e7e35262625 Mon Sep 17 00:00:00 2001 From: Sabe Jones Date: Tue, 28 Jan 2020 15:39:05 -0600 Subject: [PATCH] feat(event): Birthday 2020 --- .../archive/2020/20200131_habit_birthday.js | 91 ++++++++++++++++++ website/client/src/assets/scss/variables.scss | 10 +- website/common/locales/en/gear.json | 2 + .../script/content/gear/sets/special/index.js | 6 ++ website/common/script/content/index.js | 2 +- .../broad_armor_special_birthday2020.png | Bin 0 -> 750 bytes .../shop_armor_special_birthday2020.png | Bin 0 -> 691 bytes .../slim_armor_special_birthday2020.png | Bin 0 -> 705 bytes .../spritesmith/npcs/npc_bailey.png | Bin 3779 -> 4003 bytes .../spritesmith/npcs/npc_justin.png | Bin 4291 -> 4525 bytes .../raw_sprites/spritesmith/npcs/npc_matt.png | Bin 6384 -> 6421 bytes .../spritesmith_large/promo_birthday_2020.png | Bin 0 -> 21386 bytes website/server/controllers/api-v3/news.js | 48 ++++----- website/server/models/user/hooks.js | 19 +++- 14 files changed, 142 insertions(+), 36 deletions(-) create mode 100644 migrations/archive/2020/20200131_habit_birthday.js create mode 100644 website/raw_sprites/spritesmith/gear/events/birthday/broad_armor_special_birthday2020.png create mode 100644 website/raw_sprites/spritesmith/gear/events/birthday/shop_armor_special_birthday2020.png create mode 100644 website/raw_sprites/spritesmith/gear/events/birthday/slim_armor_special_birthday2020.png create mode 100644 website/raw_sprites/spritesmith_large/promo_birthday_2020.png diff --git a/migrations/archive/2020/20200131_habit_birthday.js b/migrations/archive/2020/20200131_habit_birthday.js new file mode 100644 index 0000000000..0a11b807b5 --- /dev/null +++ b/migrations/archive/2020/20200131_habit_birthday.js @@ -0,0 +1,91 @@ +/* eslint-disable no-console */ +const MIGRATION_NAME = '20200131_habit_birthday'; +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.Cake_Skeleton': 1, + 'items.food.Cake_Base': 1, + 'items.food.Cake_CottonCandyBlue': 1, + 'items.food.Cake_CottonCandyPink': 1, + 'items.food.Cake_Shade': 1, + 'items.food.Cake_White': 1, + 'items.food.Cake_Golden': 1, + 'items.food.Cake_Zombie': 1, + 'items.food.Cake_Desert': 1, + 'items.food.Cake_Red': 1, + 'achievements.habitBirthdays': 1, + }; + const set = {}; + let push; + + set.migration = MIGRATION_NAME; + + if (typeof user.items.gear.owned.armor_special_birthday2019 !== 'undefined') { + set['items.gear.owned.armor_special_birthday2020'] = false; + push = {pinnedItems: {type: 'marketGear', path: 'gear.flat.armor_special_birthday2020', _id: uuid()}}; + } else if (typeof user.items.gear.owned.armor_special_birthday2018 !== 'undefined') { + set['items.gear.owned.armor_special_birthday2019'] = false; + push = {pinnedItems: {type: 'marketGear', path: 'gear.flat.armor_special_birthday2019', _id: uuid()}}; + } else if (typeof user.items.gear.owned.armor_special_birthday2017 !== 'undefined') { + set['items.gear.owned.armor_special_birthday2018'] = false; + push = {pinnedItems: {type: 'marketGear', path: 'gear.flat.armor_special_birthday2018', _id: uuid()}}; + } else if (typeof user.items.gear.owned.armor_special_birthday2016 !== 'undefined') { + set['items.gear.owned.armor_special_birthday2017'] = false; + push = {pinnedItems: {type: 'marketGear', path: 'gear.flat.armor_special_birthday2017', _id: uuid()}}; + } else if (typeof user.items.gear.owned.armor_special_birthday2015 !== 'undefined') { + set['items.gear.owned.armor_special_birthday2016'] = false; + push = {pinnedItems: {type: 'marketGear', path: 'gear.flat.armor_special_birthday2016', _id: uuid()}}; + } else if (typeof user.items.gear.owned.armor_special_birthday !== 'undefined') { + set['items.gear.owned.armor_special_birthday2015'] = false; + push = {pinnedItems: {type: 'marketGear', path: 'gear.flat.armor_special_birthday2015', _id: uuid()}}; + } else { + set['items.gear.owned.armor_special_birthday'] = false; + push = {pinnedItems: {type: 'marketGear', path: 'gear.flat.armor_special_birthday', _id: uuid()}}; + } + + if (count % progressCount === 0) console.warn(`${count} ${user._id}`); + + return await User.update({_id: user._id}, {$inc: inc, $set: set, $push: push}).exec(); +} + +module.exports = async function processUsers () { + let query = { + migration: {$ne: MIGRATION_NAME}, + 'auth.timestamps.loggedin': {$gt: new Date('2019-01-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/client/src/assets/scss/variables.scss b/website/client/src/assets/scss/variables.scss index 5b0e00d78e..41c1a9f313 100644 --- a/website/client/src/assets/scss/variables.scss +++ b/website/client/src/assets/scss/variables.scss @@ -2,11 +2,11 @@ // possible values are: normal, fall, habitoween, thanksgiving, winter, nye, birthday, valentines, spring, summer // more to be added on future seasons -$npc_market_flavor: 'winter'; -$npc_quests_flavor: 'winter'; -$npc_seasonal_flavor: 'winter'; -$npc_timetravelers_flavor: 'winter'; -$npc_tavern_flavor: 'winter'; +$npc_market_flavor: 'birthday'; +$npc_quests_flavor: 'birthday'; +$npc_seasonal_flavor: 'birthday'; +$npc_timetravelers_flavor: 'birthday'; +$npc_tavern_flavor: 'birthday'; $restingToolbarHeight: 40px; $menuToolbarHeight: 56px; diff --git a/website/common/locales/en/gear.json b/website/common/locales/en/gear.json index d0accbfbd5..23de2ca971 100644 --- a/website/common/locales/en/gear.json +++ b/website/common/locales/en/gear.json @@ -581,6 +581,8 @@ "armorSpecialBirthday2018Notes": "Happy Birthday, Habitica! Wear these Fanciful Party Robes to celebrate this wonderful day. Confers no benefit.", "armorSpecialBirthday2019Text": "Outlandish Party Robes", "armorSpecialBirthday2019Notes": "Happy Birthday, Habitica! Wear these Outlandish Party Robes to celebrate this wonderful day. Confers no benefit.", + "armorSpecialBirthday2020Text": "Outrageous Party Robes", + "armorSpecialBirthday2020Notes": "Happy Birthday, Habitica! Wear these Outrageous Party Robes to celebrate this wonderful day. Confers no benefit.", "armorSpecialGaymerxText": "Rainbow Warrior Armor", "armorSpecialGaymerxNotes": "In celebration of the GaymerX Conference, this special armor is decorated with a radiant, colorful rainbow pattern! GaymerX is a game convention celebrating LGTBQ and gaming and is open to everyone.", diff --git a/website/common/script/content/gear/sets/special/index.js b/website/common/script/content/gear/sets/special/index.js index f2f4120c02..7de704dc22 100644 --- a/website/common/script/content/gear/sets/special/index.js +++ b/website/common/script/content/gear/sets/special/index.js @@ -1145,6 +1145,12 @@ const armor = { value: 90, con: 15, }, + birthday2020: { + text: t('armorSpecialBirthday2020Text'), + notes: t('armorSpecialBirthday2020Notes'), + value: 0, + canOwn: ownsItem('armor_special_birthday2020'), + }, }; const back = { diff --git a/website/common/script/content/index.js b/website/common/script/content/index.js index 9005fddec3..15715a6685 100644 --- a/website/common/script/content/index.js +++ b/website/common/script/content/index.js @@ -192,7 +192,7 @@ api.mountInfo = stable.mountInfo; // For seasonal events, change this constant: -const FOOD_SEASON = 'Normal'; +const FOOD_SEASON = 'Cake'; api.food = { Meat: { diff --git a/website/raw_sprites/spritesmith/gear/events/birthday/broad_armor_special_birthday2020.png b/website/raw_sprites/spritesmith/gear/events/birthday/broad_armor_special_birthday2020.png new file mode 100644 index 0000000000000000000000000000000000000000..6c5da0b53d5dc5fe7ce5b53356b90e9996b9575a GIT binary patch literal 750 zcmeAS@N?(olHy`uVBq!ia0vp^ML-~)y=j{f94K+@V|3;s z)kS)GOIz!HI*OZmJ56`u7VVbRX-Zhq?7Y%!se(sg)?62>(49=QCrrmw4M=y}#hYDz*Eb%QIIWL;n=xhA-L#Mym~RccG|Ah!N(_@O|#5q74B4cA9ePIiSp^3`bqXHC;oWcYHC)U zzx`(Y5AmA^XIY0{-n=n2`;XbxGOyZqC$f*{pV=+Ce~rf?(f_$yW(j`D_&0A${Emvq zS5H=p-v524_tky>`?lwAsf+MM-`;+?-s1VMKE={iM?Y5UTT5;RX?qj(zvJdxgXB{- z<-F~|myUm)6eMn~to!v=(J@fidu|ESFxK+^dwS)Z?8u1;N{kFQ9QQMp`ER>6B`7r* PlqNh~{an^LB{Ts5qTNgG literal 0 HcmV?d00001 diff --git a/website/raw_sprites/spritesmith/gear/events/birthday/shop_armor_special_birthday2020.png b/website/raw_sprites/spritesmith/gear/events/birthday/shop_armor_special_birthday2020.png new file mode 100644 index 0000000000000000000000000000000000000000..f02e2dee51a935a77df7a6e6d4c03f3d4b517f0e GIT binary patch literal 691 zcmeAS@N?(olHy`uVBq!ia0vp^E+EXo1|%(nCvO5$Y)RhkAVF>hmQU3a+JP+20*}aI zpnxz4GcwGYBLNg-FY)wsWq-`WE~LxrD&=0mz`*3->EaktaqI03`;5tsGRHpVFX{Ah ziH$kpl>1tK*NVtbmzFMA5K*#$qiG@^-_oq53LO@a%Y)`<1ztJm7$UI5sw3J_&}q{V z`;O+9(cEI<8y5(ySnnmHXC70Ly!BZx+r0DN;@<7uUBJJ8H;W50_}3V*nEi{*dZBA_ zEXx@+#Ek1r(zQyLGYRy^n{oH;T>t#@&$haD(Nis}byqd&_r^0U$Ugiq>$Cs^JKNbl z{i!0ed)&9T%_;l;xR&AEy!{d2)E(C5Kg37xObrW{!RKcVaRFPfo3*=i30MS+UM*dbzJBGwgi$R^ TBo(58$&10$)z4*}Q$iB}`ol6q literal 0 HcmV?d00001 diff --git a/website/raw_sprites/spritesmith/gear/events/birthday/slim_armor_special_birthday2020.png b/website/raw_sprites/spritesmith/gear/events/birthday/slim_armor_special_birthday2020.png new file mode 100644 index 0000000000000000000000000000000000000000..c09e10db3b461e12297fffaf1e77550efe2fe16e GIT binary patch literal 705 zcmeAS@N?(olHy`uVBq!ia0vp^ML-aKUlQRuPtoey>7Y1Vo~b96al^Fht$lQBWmv zQAdYBF!xlwq|DX@`=V~W-5IR6=U7AS;``^n6ztry^GT8YygeIrfc6sxJC<|p*`{!N z+y7l>3+G%v_R(dL_UiA#eCMU(Pd}d>Bp=ZDbJE6$Gr{v?74JXY-PpTFxogj!9UsdN z2Zh^bU6*?~@zq%mFX`~Wo!joIFW&$CpU2%xwyW1gUe);e#A9nA@5;mHgZTH!K6Pp8 zb+Id3JJae$=iGQBxmiEgso8GsF|5|q+P=jy{?7B7*Sub~AHFP1w+{7FxyZHanv83I zx$3nynxZ?GtE(F=U-QS|)wOr($6m8|U7ho6ozzPCDN|N(*oFyaMZYuGu$Y*jJkdQi zdl{cu#72$BCsQVOopn%HoxSXG=1TiF^Pk2pKh>!c<#@e{d7_8Qqms&0_hYXYpFZ~U z@ooFF=Da$e`~Oa#dNgRcU%$@RDElRK_ZD0e=s&(wk-NiBt@79t zVR|g>b42gY_WCxyu=gRQ-pe(;K#dffe1ak(h^^Z%}Rp!2(`rPo%m)c&$ie=Iv! zf62T1KVDVM{hs*s`{kXFC7%EIQ}_5s>9hS_OJc4Y#D=Ht+&letPb9?G+J@D#RX#7j z$Nv47IrFi_-=Oqe?z7$&7e}hA3+1R>oVEPRiZkEzm&eRI-N_=&$#6jT7ki!l+WDb2 Rjb}kI?dj_0vd$@?2>|ctH3|R# literal 0 HcmV?d00001 diff --git a/website/raw_sprites/spritesmith/npcs/npc_bailey.png b/website/raw_sprites/spritesmith/npcs/npc_bailey.png index d7659dfebee313b31d90938620269649e670c13c..77347e3749998be55734b1ff491847b3ef61a1d4 100644 GIT binary patch delta 1346 zcmV-I1-<&i9ity1iBL{Q4GJ0x0000DNk~Le0000#000182nGNE01{)qjlP`$C4cxKiakZ$ ze6AQju%Ile?*zTHWjzV_O{i14YXZm{sBD97>vco#}B>Q zo@RL0mLl+PeP%h^zVmDw>pwd366lS^Z$`ELmuxR)$raU_U$7VK!$iF-sab>f2-g2sznAsDUOu4t z2KhANOF*z6t~RLJURSqM`zSv+`t*1Qx2d&%@oLERzhE!ehnekj4&v6;HWp7R{eAyp zoo^l)l)tC{7U-%q-$Vp;nRy951ng;nF*~M>MSWfFvWVQ=mq(6)_J4KyLH~JsJd3@q z_|f?Vd#UZiv`s~rfhXp@&9?dPq-aR6!(PUvijqXO#(eXJ&j!gg1ulLLT#UI z#d^EC!xAv7cfD4@`V;o$vHmCD_)G;Fi=uw|+sc6VFWFv#58(jw_je1xKX*qNX!^+6 z)yXA66*fB5>CaWYGxs6hJ6EyyP+MCo2bdCkG_cp%;ja#Wc7LXxW0yew^l@z8a`#mh z_0q;!pjWP18}L2_dkH>*TUv?}T>@RzKSCS#Z+Nc$lw~34dVI1>6&^>7>6=zRKX;Av zU4Ym88=udoVfMz2Aa;x5wa9ni*MHpcl1%5Bk*99MJ9U?SCPoE;BE|hfv{Jtyax8wuWtA zc?X}XQ3UmF&t=dvQgN$0iuA4b*RW%~T(CxFUV@Jl_PT#9qy8J;;WpDjULlz@Yd`3$ z-FSZP>ctlcOPVpOua5l(2W~_ePre;$o}Z6nT|9(^6S;@M+_Ua4rv&?9TjV$#4#4B< zvV&|!y?>DZ0oytK@K(@O6%{Pr-e#=xQ|xB;I=VJ4do1XjJp4&Z_e#sO^0!o=Sm+WE z?4`C>`akH?Sx-+7>!;7d*laeojnC&}+fYA!kbqiTTwG8=O178a!`#y9jGpJy?JeDk z>P}thJM+4};hfLQ%uDc5!d|xog2gqQzB2O?{1@QtF0n@Z;wQ#AYybcN07*qoM6N<$ Ef{3iR3;+NC delta 1120 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 delta 1560 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 O(SqsT&?(ls6Y@V*JT^-J delta 3668 zcmXYzcOVr08^`mNq#?P=FDj80A-l|MhqJP0>+U$2IdsMqS2`m*oXwGydDh`BGO}}= z^YlUxmh5xBdjgF*K84+r+*CYfm{8mOWZ(!9aZk1Y|;RQW-%C(4)ZT; zam5rV>&wOKeuCi-##bt&PBthaH;0(udJ!a$9_eXSMABO})-!4blAxbmr1r*k+)78+ zqqEG6JS>i+e4}6u16F_Nfa-DEIsS`tpJCu7j6|Ys%f#GY@Q#z|*S+{2;;c9A48 zsc#6|WKe;~A5Qxx$Mxd%-42&d)>AMTRGoO~SKGU)=K@`B8<(Rm|H6}H= z{`naLD_N(X2Rn`D1lvr4-#^~={-YUz=huvAHDpO29>Fi(0B{!^q|g%v#?CW< zJ=Pw%aY{A7GfA}xfju=J?awhlw?n#UnyS#+xw@DtURfpH#b$SRUwRjY?c>vno6G)* z@2gHNN50VN0pE%}Nj&x+e5W}m?w_2<0PzsQwUMcBx}oNLv)^j&rD$5&+K`dao4&;O z>=@5OO`1-+ZK)@*vU@t0bo>sQOCf@5o>}J;p7+5dBAq6;T$1(B(cW*EAmtc<(lezvln`% zp8(f2_BzWkWbF(l&Cy)p35Z9MuH6S2Lls+W+>YZ@^?dv8()w~E@?{9E&MC4YG4gxe&M5XF!AfcUxGIk~}5P9AkJ*bB4lwKY%YeVeuhp>rFD2DfQ`A9Ms91OLjo<>d}+y~DT3O20tuN6U`5<; znh^XBr?qZNQVy|a_f^xZLj$7H!q4JuEK^~t$cHjlQ8CMf(qKHJn$-pt$Xt~ZEqInHwX^vl|T)tGEsWgzg#gSx z+!!gEo2pF*xD{l|)!LCgT%&f~NO??vm!#LHnVT^{u;0fypTs|nVT zhH0X!u@p$|M)2++&asU31cdQLwKFKn}+5V%cJSs+YX%5u2SZ#(-;B0xifwJM^@GpQ4GzSz3}FJBg+e=3NDMGCLe0Q@s?d49%$AkC_hsYq-!^kc{Y1Nd-b^Mf+^kV zU@|i9t}cem;!Mx04#a>Q8A59^CT1b;6p5Zv|=aZd%%b?A5s zRFYKV<}hqhZf~(GR~QJjM8QTBH&UqKgNYV1lecSY7h_1(gu`6X&{}t-BjF`^>_ylA z0CGz1U#Yi7{wl|RFj$XnH?YljIX8ti#EnK-;~x+mG2c=9Ag-@3gNtn@i6;Dl@T~G!xh{ZiAbQ36EoswV~lVshNQ+gC%K8a*vA{dP-cbWaLM8rn-uCplCM-SzGcs z?nUK?Ifu?a2|ozzMC4e&YyeC@oQ$eH46?Yu`3)E@Ynzv_VpAP@TRP{BTa9!TK%=Z%KpQW zMB?}n^AC28#Xf2?IiN8--Q0W;TW6$=I`5JvZw-_^`BaTNpAr(Fo+IDau}FLV!oF(Y z>)@Tbk$(yWlq~LDLe)JG)HdTuxDw_g{qAn;d2Vx4R8?Pbtsa+e>+q?e|2=&dzk@)&6G7K4fB2V90PtMJ%0?!!4adUQ&Lw`w{1C^8g%*uDs4? zi{(=Ct3tcA_eRpAtp?(4Rz=31!@QJ6e(&ni-%B<#YqtkVncrj~V*xoM8t5#2<6;qm zq$@IrReoam?o&C)JK=s#qx1DWLe`#H%R+tIp+O~7C(7Smf1C}ZN{tyM#c1-v;x1?c zD>--5h=Tt1F8!xKbX2hoU}Y{tQ1kKxn2+&DRSJmrU;cjx+S9MLya$Q9D=yx<_pAu) z$zuhJgE8rbYzHjnHF&+Y3{{~-Qahf}TF2@ZMlVsfeJY=BFTv=QNe9{kM|KlCJC`^o zRUo=D&ClzciKRSt&eS$owzI6PMqgd@p(EkB&`$>ra diff --git a/website/raw_sprites/spritesmith_large/promo_birthday_2020.png b/website/raw_sprites/spritesmith_large/promo_birthday_2020.png new file mode 100644 index 0000000000000000000000000000000000000000..7f9a7e8e7cf56b36604390808a93ac702726c497 GIT binary patch literal 21386 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 literal 0 HcmV?d00001 diff --git a/website/server/controllers/api-v3/news.js b/website/server/controllers/api-v3/news.js index f08cb8215b..cf43b5399a 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 = 'HABITICA BLOG POSTS! FAVORITE GUILDS AND USE CASE SPOTLIGHT'; +const LAST_ANNOUNCEMENT_TITLE = 'HABITICA BIRTHDAY PARTY!'; const worldDmg = { // @TODO bailey: false, }; @@ -31,43 +31,33 @@ api.getNews = {

${res.t('newStuff')}

-

1/23/2020 - ${LAST_ANNOUNCEMENT_TITLE}

+

1/31/2020 - ${LAST_ANNOUNCEMENT_TITLE}


-
-

Guild Spotlight: Beffymaroo's Favorites

+
+

Habitica Birthday Bash

- For this year's Guild Spotlight series, we're highlighting some favorites from Habitica's - staff, moderators, and maybe some high-level contributors! + January 31st is Habitica's Birthday! Thank you so much for being a part of our + community - it means a lot.

+

Now come join us and the NPCs as we celebrate!

+

Cake for Everybody!

- This month we're kicking things off with some picks from Beffymaroo! If you want to curate your Habitica experience and - join active, positive Guilds, this is a great way to pick up some new ideas for Guilds - to join. + In honor of the festivities, everyone has been awarded an assortment of yummy cake to + feed to your pets! Plus, for the next two days Alexander the + Merchant is selling cake in his shop, and cake will sometimes drop when you complete + your tasks. Cake works just like normal pet food, but if you want to know what type of + pet likes each slice, the + wiki has spoilers.

-
by Beffymaroo and shanaqui
-
-

Use Case Spotlight: Custom Habitica Mechanics

+

Party Robes

+

There are Party Robes available for free in the Rewards column! Don them with pride.

+

Birthday Bash Achievement

- This month's Use Case Spotlight is about Custom Habitica Mechanics! It features a - number of great suggestions submitted by Habiticans in the Use Case Spotlights Guild. We - hope it helps any of you who might be looking for ways to enhance your Habitica - experience. + In honor of Habitica's birthday, everyone has been awarded the Habitica Birthday Bash + achievement! This achievement stacks for each Birthday Bash you celebrate with us.

-

- Plus, we're collecting user submissions for the next spotlight! How do you maximize - participation in your quest party? We’ll be featuring player-submitted examples in Use - Case Spotlights on the Habitica Blog next month, so post your suggestions in the Use Case - Spotlight Guild now. We look forward to learning more about how you use Habitica to - improve your life and get things done! -

-
by shanaqui
`, }); diff --git a/website/server/models/user/hooks.js b/website/server/models/user/hooks.js index 4c43b91d69..d878f3abf3 100644 --- a/website/server/models/user/hooks.js +++ b/website/server/models/user/hooks.js @@ -131,8 +131,25 @@ function _setUpNewUser (user) { user.items.quests.dustbunnies = 1; user.purchased.background.violet = true; user.preferences.background = 'violet'; + if (moment().isBefore('2020-02-03')) { + user.achievements.habitBirthdays = 1; + user.items.gear.owned.armor_special_birthday = true; + user.items.gear.equipped.armor = 'armor_special_birthday'; + user.items.food = { + Cake_Skeleton: 1, + Cake_Base: 1, + Cake_CottonCandyBlue: 1, + Cake_CottonCandyPink: 1, + Cake_Shade: 1, + Cake_White: 1, + Cake_Golden: 1, + Cake_Zombie: 1, + Cake_Desert: 1, + Cake_Red: 1, + }; + } - user.markModified('items'); + user.markModified('items achievements'); if (user.registeredThrough === 'habitica-web') { taskTypes = ['habit', 'daily', 'todo', 'reward', 'tag'];