From 8b8cee40a7fa1285433a65bad48edc073702ba1c Mon Sep 17 00:00:00 2001 From: SabreCat Date: Thu, 22 Feb 2018 22:56:33 +0000 Subject: [PATCH] feat(content): mystery items Feb 2018 --- migrations/command-line/mystery_items.js | 51 --------- migrations/takeThis.js | 2 +- migrations/users/mystery-items.js | 108 ++++++++++++++++++ website/common/locales/en/gear.json | 6 + website/common/locales/en/subscriber.json | 1 + .../script/content/gear/sets/mystery.js | 18 +++ website/common/script/content/mystery-sets.js | 4 + .../broad_armor_mystery_201802.png | Bin 0 -> 598 bytes .../mystery_201802/head_mystery_201802.png | Bin 0 -> 633 bytes .../mystery_201802/shield_mystery_201802.png | Bin 0 -> 371 bytes .../shop_armor_mystery_201802.png | Bin 0 -> 537 bytes .../shop_head_mystery_201802.png | Bin 0 -> 568 bytes .../shop_set_mystery_201802.png | Bin 0 -> 996 bytes .../shop_shield_mystery_201802.png | Bin 0 -> 337 bytes .../slim_armor_mystery_201802.png | Bin 0 -> 582 bytes .../promo_mystery_201802.png | Bin 0 -> 8818 bytes .../promo_seasonalshop_broken.png | Bin 0 -> 7321 bytes website/server/controllers/api-v3/news.js | 29 ++--- 18 files changed, 149 insertions(+), 70 deletions(-) delete mode 100644 migrations/command-line/mystery_items.js create mode 100644 migrations/users/mystery-items.js create mode 100644 website/raw_sprites/spritesmith/gear/events/mystery_201802/broad_armor_mystery_201802.png create mode 100644 website/raw_sprites/spritesmith/gear/events/mystery_201802/head_mystery_201802.png create mode 100644 website/raw_sprites/spritesmith/gear/events/mystery_201802/shield_mystery_201802.png create mode 100644 website/raw_sprites/spritesmith/gear/events/mystery_201802/shop_armor_mystery_201802.png create mode 100644 website/raw_sprites/spritesmith/gear/events/mystery_201802/shop_head_mystery_201802.png create mode 100644 website/raw_sprites/spritesmith/gear/events/mystery_201802/shop_set_mystery_201802.png create mode 100644 website/raw_sprites/spritesmith/gear/events/mystery_201802/shop_shield_mystery_201802.png create mode 100644 website/raw_sprites/spritesmith/gear/events/mystery_201802/slim_armor_mystery_201802.png create mode 100644 website/raw_sprites/spritesmith_large/promo_mystery_201802.png create mode 100644 website/raw_sprites/spritesmith_large/promo_seasonalshop_broken.png diff --git a/migrations/command-line/mystery_items.js b/migrations/command-line/mystery_items.js deleted file mode 100644 index 25d8b815af..0000000000 --- a/migrations/command-line/mystery_items.js +++ /dev/null @@ -1,51 +0,0 @@ -let UserNotification = require('../../website/server/models/userNotification').model; - -let _id = ''; - -let items = ['back_mystery_201801', 'headAccessory_mystery_201801']; - -let update = { - $addToSet: { - 'purchased.plan.mysteryItems': { - $each: items, - }, - }, - $push: { - notifications: (new UserNotification({ - type: 'NEW_MYSTERY_ITEMS', - data: { - items, - }, - })).toJSON(), - }, -}; - -/* var update = { - $set:{ - 'purchased.plan':{ - customerId: "", - dateCreated: new Date(), - dateTerminated: null, - dateUpdated:new Date(), - gemsBought: 0, - mysteryItems: [], - paymentMethod: "Paypal", - planId : "basic_earned" - } - } -};*/ - -if (_id) { - // singular (missing items) - db.users.update({_id}, update); -} else { - // multiple (once @ start of event) - db.users.update({ - 'purchased.plan.customerId': { $ne: null }, - $or: [ - { 'purchased.plan.dateTerminated': { $gte: new Date() } }, - { 'purchased.plan.dateTerminated': { $exists: false } }, - { 'purchased.plan.dateTerminated': { $eq: null } }, - ], - }, update, { multi: true }); -} diff --git a/migrations/takeThis.js b/migrations/takeThis.js index 13e4283b9b..d276727a70 100644 --- a/migrations/takeThis.js +++ b/migrations/takeThis.js @@ -7,7 +7,7 @@ let authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; // ... own data is done */ let monk = require('monk'); -let connectionString = 'mongodb://sabrecat:z8e8jyRA8CTofMQ@ds013393-a0.mlab.com:13393/habitica?auto_reconnect=true'; +let connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE let dbUsers = monk(connectionString).get('users', { castIds: false }); function processUsers (lastId) { diff --git a/migrations/users/mystery-items.js b/migrations/users/mystery-items.js new file mode 100644 index 0000000000..955eee3b6a --- /dev/null +++ b/migrations/users/mystery-items.js @@ -0,0 +1,108 @@ +const migrationName = 'mystery-items-201802.js'; // Update per month +const authorName = 'Sabe'; // in case script author needs to know when their ... +const authorUuid = '7f14ed62-5408-4e1b-be83-ada62d504931'; // ... own data is done + +/* + * Award this month's mystery items to subscribers + */ +const MYSTERY_ITEMS = ['armor_mystery_201802', 'head_mystery_201802', 'shield_mystery_201802']; +const connectionString = 'mongodb://localhost:27017/habitrpg?auto_reconnect=true'; // FOR TEST DATABASE + +let monk = require('monk'); +let dbUsers = monk(connectionString).get('users', { castIds: false }); +let UserNotification = require('../../website/server/models/userNotification').model; + +function processUsers (lastId) { + // specify a query to limit the affected users (empty for all users): + let query = { + migration: {$ne: migrationName}, + 'purchased.plan.customerId': { $ne: null }, + $or: [ + { 'purchased.plan.dateTerminated': { $gte: new Date() } }, + { 'purchased.plan.dateTerminated': { $exists: false } }, + { 'purchased.plan.dateTerminated': { $eq: null } }, + ], + }; + + if (lastId) { + query._id = { + $gt: lastId, + }; + } + + dbUsers.find(query, { + sort: {_id: 1}, + limit: 250, + fields: [ + ], // specify fields we are interested in to limit retrieved data (empty if we're not reading data): + }) + .then(updateUsers) + .catch((err) => { + console.log(err); + return exiting(1, `ERROR! ${ err}`); + }); +} + +let progressCount = 1000; +let count = 0; + +function updateUsers (users) { + if (!users || users.length === 0) { + console.warn('All appropriate users found and modified.'); + displayData(); + return; + } + + let userPromises = users.map(updateUser); + let lastUser = users[users.length - 1]; + + return Promise.all(userPromises) + .then(() => { + processUsers(lastUser._id); + }); +} + +function updateUser (user) { + count++; + + const addToSet = { + 'purchased.plan.mysteryItems': { + $each: MYSTERY_ITEMS, + }, + }; + const push = { + notifications: (new UserNotification({ + type: 'NEW_MYSTERY_ITEMS', + data: { + MYSTERY_ITEMS, + }, + })).toJSON(), + }; + + dbUsers.update({_id: user._id}, {$addToSet: addToSet, $push: push}); + + if (count % progressCount === 0) console.warn(`${count } ${ user._id}`); + if (user._id === authorUuid) console.warn(`${authorName } processed`); +} + +function displayData () { + console.warn(`\n${ count } users processed\n`); + return exiting(0); +} + +function exiting (code, msg) { + code = code || 0; // 0 = success + if (code && !msg) { + msg = 'ERROR!'; + } + if (msg) { + if (code) { + console.error(msg); + } else { + console.log(msg); + } + } + process.exit(code); +} + +module.exports = processUsers; diff --git a/website/common/locales/en/gear.json b/website/common/locales/en/gear.json index 17be223d46..05d20914c3 100644 --- a/website/common/locales/en/gear.json +++ b/website/common/locales/en/gear.json @@ -665,6 +665,8 @@ "armorMystery201711Notes": "This cozy sweater set will help keep you warm as you ride through the sky! Confers no benefit. November 2017 Subscriber Item.", "armorMystery201712Text": "Candlemancer Armor", "armorMystery201712Notes": "The heat and light generated by this magic armor will warm your heart but never burn your skin! Confers no benefit. December 2017 Subscriber Item.", + "armorMystery201802Text": "Love Bug Armor", + "armorMystery201802Notes": "This shiny armor reflects your strength of heart and infuses it into any Habiticans nearby who may need encouragement! Confers no benefit. February 2018 Subscriber Item.", "armorMystery301404Text": "Steampunk Suit", "armorMystery301404Notes": "Dapper and dashing, wot! Confers no benefit. February 3015 Subscriber Item.", "armorMystery301703Text": "Steampunk Peacock Gown", @@ -1064,6 +1066,8 @@ "headMystery201710Notes": "This helm makes you look intimidating... but it won't do any favors for your depth perception! Confers no benefit. October 2017 Subscriber Item.", "headMystery201712Text": "Candlemancer Crown", "headMystery201712Notes": "This crown will bring light and warmth to even the darkest winter night. Confers no benefit. December 2017 Subscriber Item.", + "headMystery201802Text": "Love Bug Helm", + "headMystery201802Notes": "The antennae on this helm act as cute dowsing rods, detecting feelings of love and support nearby. Confers no benefit. February 2018 Subscriber Item.", "headMystery301404Text": "Fancy Top Hat", "headMystery301404Notes": "A fancy top hat for the finest of gentlefolk! January 3015 Subscriber Item. Confers no benefit.", "headMystery301405Text": "Basic Top Hat", @@ -1332,6 +1336,8 @@ "shieldMystery201708Notes": "This rugged shield of molten rock protects you from bad Habits but won't singe your hands. Confers no benefit. August 2017 Subscriber Item.", "shieldMystery201709Text": "Sorcery Handbook", "shieldMystery201709Notes": "This book will guide you through your forays into sorcery. Confers no benefit. September 2017 Subscriber Item.", + "shieldMystery201802Text": "Love Bug Shield", + "shieldMystery201802Notes": "Although it may look like brittle candy, this shield is resistant to even the strongest Shattering Heartbreak attacks! Confers no benefit. February 2018 Subscriber Item.", "shieldMystery301405Text": "Clock Shield", "shieldMystery301405Notes": "Time is on your side with this towering clock shield! Confers no benefit. June 3015 Subscriber Item.", "shieldMystery301704Text": "Fluttery Fan", diff --git a/website/common/locales/en/subscriber.json b/website/common/locales/en/subscriber.json index 368e1ffe9e..b080ea816b 100644 --- a/website/common/locales/en/subscriber.json +++ b/website/common/locales/en/subscriber.json @@ -140,6 +140,7 @@ "mysterySet201711": "Carpet Rider Set", "mysterySet201712": "Candlemancer Set", "mysterySet201801": "Frost Sprite Set", + "mysterySet201802": "Love Bug Set", "mysterySet301404": "Steampunk Standard Set", "mysterySet301405": "Steampunk Accessories Set", "mysterySet301703": "Peacock Steampunk Set", diff --git a/website/common/script/content/gear/sets/mystery.js b/website/common/script/content/gear/sets/mystery.js index 41e714da78..6439cb46fe 100644 --- a/website/common/script/content/gear/sets/mystery.js +++ b/website/common/script/content/gear/sets/mystery.js @@ -187,6 +187,12 @@ let armor = { mystery: '201712', value: 0, }, + 201802: { + text: t('armorMystery201802Text'), + notes: t('armorMystery201802Notes'), + mystery: '201802', + value: 0, + }, 301404: { text: t('armorMystery301404Text'), notes: t('armorMystery301404Notes'), @@ -541,6 +547,12 @@ let head = { mystery: '201712', value: 0, }, + 201802: { + text: t('headMystery201802Text'), + notes: t('headMystery201802Notes'), + mystery: '201802', + value: 0, + }, 301404: { text: t('headMystery301404Text'), notes: t('headMystery301404Notes'), @@ -637,6 +649,12 @@ let shield = { mystery: '201709', value: 0, }, + 201802: { + text: t('shieldMystery201802Text'), + notes: t('shieldMystery201802Notes'), + mystery: '201802', + value: 0, + }, 301405: { text: t('shieldMystery301405Text'), notes: t('shieldMystery301405Notes'), diff --git a/website/common/script/content/mystery-sets.js b/website/common/script/content/mystery-sets.js index 58e010ac8b..8dbdcbbeb5 100644 --- a/website/common/script/content/mystery-sets.js +++ b/website/common/script/content/mystery-sets.js @@ -194,6 +194,10 @@ let mysterySets = { start: '2018-01-23', end: '2018-02-02', }, + 201802: { + start: '2018-02-22', + end: '2018-03-02', + }, 301404: { start: '3014-03-24', end: '3014-04-02', diff --git a/website/raw_sprites/spritesmith/gear/events/mystery_201802/broad_armor_mystery_201802.png b/website/raw_sprites/spritesmith/gear/events/mystery_201802/broad_armor_mystery_201802.png new file mode 100644 index 0000000000000000000000000000000000000000..6ad4bf8a5ac8cc8833b25af04f267fae1a8c662c GIT binary patch literal 598 zcmeAS@N?(olHy`uVBq!ia0vp^ML-jA5L~c#`DCC7XMsm# zF#`j)FbFd;%$g$s6l5>)^mS!_#KbRZ%zUVXjgNtW@v*0iV@SoVx3@NCi3EzUJ@D*! zF`*$Uqoc_)M`)Q)wDx1>7s4I=iRrU#S_D3^+=@KvmAyLkvV?MmhfYX<8|RL&dA5y_ zW)qKC9R42Ke)^4pb@}`AbB&`#fVN=+4%R+fo;poGUG!o3z1gu{AJ4zPH|Iq8jy(n1 z=j?ZH7k&J9SKd+ESzn^xu?cHN{qJ<_+9y%-;i3B#@8Z%c(#DsMTm3woe}D14Te^$u z%Kkd_y$ideuN|~SDeAvc)b!JvJ~m{3UAp4=`PiJE<2uJbojZ7ah5fX6ss8uZw`Lr5 zDe?)<-FYF9|JmO~eLrF?CHnTq?Xb;JyJIW=b+5YqqI)`J?eZ(!k3Bokb;RY;#n|k9 z*H*1c+H?K2sIT?yJ+se#dS~+9WA!SnOP1=#Vw*)fJD2Re7-e$w<@&d8CC;zk^6Buu zz$eQb>q<>`?y%5GTkGMY65Dl6=YRBri&Iw{*8P7r_n6v&g=~jT&kwY(|E=}vtN-uh z+5BNDYLocfv+F$KHJ?fGpIEq1NAJ%SEa@Ah+bxKm%*JFQf$iBIC`Roe$ z{r6v<*}DNEF^k##$h#>OmOWAb9pU!Ea%!%i>+W;o@BGvL35%es!jTTHQ%tb VcEb~iw-KNS@pScbS?83{1OS}o5Cs4L literal 0 HcmV?d00001 diff --git a/website/raw_sprites/spritesmith/gear/events/mystery_201802/head_mystery_201802.png b/website/raw_sprites/spritesmith/gear/events/mystery_201802/head_mystery_201802.png new file mode 100644 index 0000000000000000000000000000000000000000..83f1c882e0881017bddbcdac45313d66fd6208e7 GIT binary patch literal 633 zcmeAS@N?(olHy`uVBq!ia0vp^ML-jA5L~c#`DCC7XMsm# zF#`j)FbFd;%$g$s6l5>)^mS!_#KbRZWc+s<`(p+MCN@tO$B>F!Z*T3-yBr|G{y^G6 zaNev=1|eP{Z%N~=vC0PzTyWQT6}>^x>>ks>BWF$=h_W&aVq2m%HE5H96|3v2Ge^G4 z<}3}BN}2tBcHf#`{Z&;4a@st*_T8VWj(gre zFF*eA$Gh)`Z~fbs_ai!wy;o%I>;B8DG`ttT-<9;u==z>Bn`e5MOq%8LT5IA~uQTh4 z^6n;GbLk3u^(5@Ey>wW_)^*j%2VE9T3|njZv8q@gyjfrEabLRe#6_YPf1O{PBl7NP z>hb+HZ>Gl;R~TvA{?nXOI!kQ1TF@4ysP%?v_I_d?e>A^yTVsD`zwGPz?1v+k|9@Iv zX4wDr-k0(<{^HL!*6q5<>)R15tQoa(^|3cwmle)(i|23+kvn_Lb57dEdzC>og{%L6 zt6d|1e{b-Wh0#^|!kuoHHic&Y+BAQiUw@vM;I3Ljk3~iMOyn*{{QIRGU3Ip^Ge0F0bH;JTd*BkH-FI z8FBjr1;x_UgnF0wuD-VVU2&M}i_rI9ZE~Ifg53 Okd&vZpUXO@geCwIgBNH3 literal 0 HcmV?d00001 diff --git a/website/raw_sprites/spritesmith/gear/events/mystery_201802/shield_mystery_201802.png b/website/raw_sprites/spritesmith/gear/events/mystery_201802/shield_mystery_201802.png new file mode 100644 index 0000000000000000000000000000000000000000..b910f1e4db57c77ffa07cda0e4f13e9fe8c8aa11 GIT binary patch literal 371 zcmeAS@N?(olHy`uVBq!ia0vp^ML-jA5L~c#`DCC7XMsm# zF#`j)FbFd;%$g$s6l5>)^mS!_#KbRZtSV61{F#A)k-^i&F{I+w+Z!8m4>?FQTvS#N z^K90*q@W_9ke$N5OQ-Qhqmihpkf^9gKnqhVV?de5gaw~>79_Jg+HilhpZe|%=l+Ms zZ~)E54ot7E_JAye?3>vUAv#}^s%+~_qL1wFEX|8$gKT0=iBl5H|suEPg{Ha z^87;~eSY;1Z0cFB^^=l$o^4gVZ_`e3hc@ve@QGBrp38qA;RA)|6BN@4ot z|H->QOpN=kYq!~OqJ>8c$CMp1C)BsBd0Y2=f;R)u0FUgWMzfv#e3xudS}S@YC(F`w p;-#)FVG5g9KE2}Nr44fM$sG(Le6Ahs30w^zuBWS?%Q~loCIIFbiOv83 literal 0 HcmV?d00001 diff --git a/website/raw_sprites/spritesmith/gear/events/mystery_201802/shop_armor_mystery_201802.png b/website/raw_sprites/spritesmith/gear/events/mystery_201802/shop_armor_mystery_201802.png new file mode 100644 index 0000000000000000000000000000000000000000..8e88faa61935cdd77a278cb5deae23257e9b1a31 GIT binary patch literal 537 zcmeAS@N?(olHy`uVBq!ia0vp^E+EXo1|%(nCvO5$Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPd6ThgLhVXuFZUzR%Wu7jMAr-gY-q`4MI6-6WEFk8awcgzhjrxlAhQ_3m}AnWuQET4i@%6-hQdoYnez*OqhMCDGxWKi^MYrTTbv z)Y9Ult$CNaOXX(=xNo{y5ESCvrlk0=eAe8Zl?-OnuQT0UdbjnQJ)_0meGCs?yfoZY zE}^P&t|g*eV*=NkEuB|yv}E1->{0T4Wy_JN6C8rRO}`YIeez(UV8h+pQ8C|_w;Y)@ z;e+^=4>m&c>=(V!^E%ORWx_g7!$LJ@PRS)LEt4<3{@p301P4Yp_A$y?*3K|j=mo|m O1B0ilpUXO@geCwHW#ZKU literal 0 HcmV?d00001 diff --git a/website/raw_sprites/spritesmith/gear/events/mystery_201802/shop_head_mystery_201802.png b/website/raw_sprites/spritesmith/gear/events/mystery_201802/shop_head_mystery_201802.png new file mode 100644 index 0000000000000000000000000000000000000000..0bad684c41afcb47e0d08c07ae176d36e6992b95 GIT binary patch literal 568 zcmeAS@N?(olHy`uVBq!ia0vp^E+EXo1|%(nCvO5$Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPd6ThgX$Zn5pX9fnwqn<8~Ar-gYPT%Oqrj2DT#yOk+#2Wv4`}>uQq)~3#pDR-mum9bqX{2)K(2?7>CfrTCvQEYM zpZ3#|V^c0m8n1nRVuGjdDzobLud|BXCW@-BHh-;|9{+FS+nRlgM5Wc%@ys-HUL?79 zO*vykw>ra)h**{fJEuH)+c& z2QRwo-sY3dyYX(y`j=@t0@Z_}J0yf{%pXgt`~BOvSjs54ZON_g3ne|D@1Os9Pl27M z)$7^!xEad#$unz|89L61+M%TBoOVdycI=^zkAuTEusulpRVTmmv`Fpt?2EZ4C(K-- y*!-+@g<$g|nF$7~6op;%feIEdfLml|)l5;&piMA-%7qU$pci=eIPydCz-q?sKRrU4Wi}P7^$GH?WhNyVnO@fEVL)0Q7#C4ix)^R4EfVXu7@E6*}w;OO~@G zBU#*b_fbO1jf`AL$#h*YNl`*9)#RmBW!Pd|Fx|MPtC8SVJRkAl6 zjriiiH2Jdny0y_4*R{Cj`#!~LAd`KSka8o$&gkQ49Dt*>^#D9-t^?rfU>Auq%B9U1 z0R1b!09cBz18}jWmQo=@3CX7q5i%shU0Q6iiQ*q6sxvi5o12P zYlFUhx)#^9hEx^z?V+A_Sx&T9ejNwbSE)!C+dLd)+xq{3Zh1$1bYlvhV zuPe*3!q5{#fc*K+oZ8j-ImlBc>LhPC5+ClRt_T^(|eBEWsXFUB4 zz{8Kv0l4?&b7nJ)5>n=b*#1K#j#VTMRg}VyC?Sw)fmSECaa^ubv0K?Hp$&#Uj z6p|481kLs%w*M%_?xKVgxP~MpMN|%CC?UH+h)v3tQ!N8Bln|9lrBbO>#nwMQ19l*{ Sl)R<@0000F z@xlVZg>nb7E7;BT74IFqxN`A>Crg_7$^>j1D%eF!I2fY^x-WcVzn{*@+34_zZz9kb zC^#@@!5e0?wFf`f+Hos;UV5~LukL2}Ha6dokdFF~|4NiRv*d(4FO}7u5;3T|6Os}i zx-`JUFX9{HzoVt4&Nex_jl$M7R6KbWrKYCW;c^Y)vxv+ zO8aig2me#75B0bh^h&SU>6PA-V9l^o3k0-VpLlN!VrzxDg@Iw(9)=B>t`%M{r{4ex Ndb;|#taD0e0szVNdJ6ym literal 0 HcmV?d00001 diff --git a/website/raw_sprites/spritesmith/gear/events/mystery_201802/slim_armor_mystery_201802.png b/website/raw_sprites/spritesmith/gear/events/mystery_201802/slim_armor_mystery_201802.png new file mode 100644 index 0000000000000000000000000000000000000000..047160b69e5cca5ec53f4562dc50b2af83c7f311 GIT binary patch literal 582 zcmeAS@N?(olHy`uVBq!ia0vp^ML-jA5L~c#`DCC7XMsm# zF#`j)FbFd;%$g$s6l5>)^mS!_#KbRZEPi9%C7?XxWltB!kcwMxZ*9yH2^3*_5E)n! z5WvkFXwd09ZRL?`r+zT}VtJH&7v?e*G}_I?pdH1wPHb!P{G@C^A5zC zi5brP_Bo1! z*!}ro`kM86+XC%vi+`<;`~2>^d|-ag^+5aGHCnIq-{0dYQ8AlT=bC-w<%V_L;xSq0 zUH6te$}yDNEOR<~_x(lxBI+33q^Mp=6Gl|OYmo*Uh>weYIjpLK8juE*=g z_g7VXPPwvOZcj(m-dpqjIa(W=sapw2d;0sY{TVlVS?AY_86i{sw*54j{q%CC-9$6r z;HB4P&g^EF?d)B$`(o78M_;}_OI!0^XN}nYH}Bo$q;%fo_}Jgo*4~^H=ANYdGI&ec z;az<*_Le_PT62G2)nW^l8^#V5Keb;y&yRQg`{eWTorl3j9ltnh|C05g-AB1U`A0?m zd#QEXxcuw+@EacgPG{&IdvjRZyV!q2zubEF+W&vU^5?boiLC9o#w^A6CjFgN_P$$3 z6&t`J&OJBR_!q8HcGX_=RUp~yb?}^59?~ZRzp@K&FWDgWw`(FO20UH;T-G@yGywor Cc>~}8 literal 0 HcmV?d00001 diff --git a/website/raw_sprites/spritesmith_large/promo_mystery_201802.png b/website/raw_sprites/spritesmith_large/promo_mystery_201802.png new file mode 100644 index 0000000000000000000000000000000000000000..c08dd02f81fb1c05cf5660d574d34fd37ff3b449 GIT binary patch literal 8818 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 Xb$doJ literal 0 HcmV?d00001 diff --git a/website/raw_sprites/spritesmith_large/promo_seasonalshop_broken.png b/website/raw_sprites/spritesmith_large/promo_seasonalshop_broken.png new file mode 100644 index 0000000000000000000000000000000000000000..7f70478f325c74803c29f730c7b71a06247d9fe8 GIT binary patch literal 7321 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 p8vX_{*dRuwr=N&ON+5M$t*k}Z{{Y86L8kx! literal 0 HcmV?d00001 diff --git a/website/server/controllers/api-v3/news.js b/website/server/controllers/api-v3/news.js index 0b88529d46..19e2777876 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 = 'WORLD BOSS RAGE STRIKE, GUILD SPOTLIGHT, AND WIKI WEDNESDAY'; +const LAST_ANNOUNCEMENT_TITLE = 'FEBRUARY SUBSCRIBER ITEMS AND BEHIND THE SCENES BLOG'; const worldDmg = { // @TODO bailey: false, }; @@ -32,27 +32,20 @@ api.getNews = {

${res.t('newStuff')}

-

2/21/2018 - ${LAST_ANNOUNCEMENT_TITLE}

+

2/22/2018 - ${LAST_ANNOUNCEMENT_TITLE}


-

World Boss: Dysheartener attacks the Seasonal Sorceress!

-

Oh, no! After feasting on our undone Dailies, the Dysheartener has gained the strength to unleash its Shattering Heartbreak attack. With a shrill shriek, it brings its spiny forelegs down upon the pavilion that houses the Seasonal Shop! The concussive blast of magic shreds the wood, and the Seasonal Sorceress is overcome by sorrow at the sight.

-

Quickly, let's keep doing our Dailies so that the beast won't strike again!

-
by Lemoness, Beffymaroo, SabreCat, viirus, Apollo, and piyorii
+

February Subscriber Items Revealed!

+

The February Subscriber Items have been revealed: The Love Bug Set!! It's a special three-piece set in honor of our ongoing battle with the Dysheartener. You only have until February 28 to receive the item set when you subscribe. If you're already an active subscriber, reload the site and then head to Inventory > Items to claim your gear!

+

Subscribers also receive the ability to buy Gems for Gold -- the longer you subscribe, the more Gems you can buy per month! There are other perks as well, such as longer access to uncompressed data and a cute Jackalope pet. Best of all, subscriptions let us keep Habitica running. Thank you very much for your support -- it means a lot to us.

+
+
by Beffymaroo
-

Sharing the Love: Guilds for Interpersonal Relationships

-

There's a new Guild Spotlight on the blog that highlights the Guilds that can help you as you work on building and maintaining your relationships with others! Check it out now to find Habitica's best places for support and help with your interpersonal connections.

-
by Beffymaroo
-
-
-
-
-
-
-

Blog Post: Routines

-

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

-
by Beffymaroo and the Wiki Wizards
+

Behind the Scenes: Bringing a World Boss to Life

+

There's a new Behind the Scenes post on the Habitica blog! Ever wonder what goes into bringing a World Boss to Habitica? Check out this post for a behind the scenes glimpse of how the team makes these events happen. It's all fun and no spoilers (we promise)!

+
by Beffymaroo
+
`,