From 5e71abe64fc73fab46ef70072bfc8a2acdd228f3 Mon Sep 17 00:00:00 2001 From: Sabe Jones Date: Thu, 28 Oct 2021 13:52:46 -0500 Subject: [PATCH] feat(content): Habitoween 2021 Royal Purple Jack-O-Lantern Mount, Candy, Spooky Gem Sale, Subscriber Mystery Items for November --- .../2021/20211028_habitoween_ladder.js | 86 ++++++++++++++++++ website/common/locales/en/gear.json | 4 + website/common/locales/en/subscriber.json | 1 + .../common/script/content/constants/events.js | 8 ++ .../script/content/gear/sets/mystery.js | 4 + website/common/script/content/index.js | 2 +- website/common/script/content/stable.js | 2 + .../mystery_202111/head_mystery_202111.png | Bin 0 -> 675 bytes .../shop_head_mystery_202111.png | Bin 0 -> 601 bytes .../shop_set_mystery_202111.png | Bin 0 -> 1029 bytes .../shop_weapon_mystery_202111.png | Bin 0 -> 666 bytes .../mystery_202111/weapon_mystery_202111.png | Bin 0 -> 733 bytes .../Mount_Body_JackOLantern-RoyalPurple.png | Bin 0 -> 3001 bytes .../Mount_Head_JackOLantern-RoyalPurple.png | Bin 0 -> 3606 bytes .../Mount_Icon_JackOLantern-RoyalPurple.png | Bin 0 -> 3599 bytes website/server/models/user/hooks.js | 30 +++--- 16 files changed, 119 insertions(+), 18 deletions(-) create mode 100644 migrations/archive/2021/20211028_habitoween_ladder.js create mode 100644 website/raw_sprites/spritesmith/gear/events/mystery_202111/head_mystery_202111.png create mode 100644 website/raw_sprites/spritesmith/gear/events/mystery_202111/shop_head_mystery_202111.png create mode 100644 website/raw_sprites/spritesmith/gear/events/mystery_202111/shop_set_mystery_202111.png create mode 100644 website/raw_sprites/spritesmith/gear/events/mystery_202111/shop_weapon_mystery_202111.png create mode 100644 website/raw_sprites/spritesmith/gear/events/mystery_202111/weapon_mystery_202111.png create mode 100644 website/raw_sprites/spritesmith/stable/mounts/body/Mount_Body_JackOLantern-RoyalPurple.png create mode 100644 website/raw_sprites/spritesmith/stable/mounts/head/Mount_Head_JackOLantern-RoyalPurple.png create mode 100644 website/raw_sprites/spritesmith/stable/mounts/icon/Mount_Icon_JackOLantern-RoyalPurple.png diff --git a/migrations/archive/2021/20211028_habitoween_ladder.js b/migrations/archive/2021/20211028_habitoween_ladder.js new file mode 100644 index 0000000000..518e907040 --- /dev/null +++ b/migrations/archive/2021/20211028_habitoween_ladder.js @@ -0,0 +1,86 @@ +/* + * Award Habitoween ladder items to participants in this month's Habitoween festivities + */ +/* eslint-disable no-console */ + +const MIGRATION_NAME = '20211028_habitoween_ladder'; // Update when running in future years + +import { model as User } from '../../../website/server/models/user'; + +const progressCount = 1000; +let count = 0; + +async function updateUser (user) { + count++; + + const set = {}; + const inc = { + 'items.food.Candy_Skeleton': 1, + 'items.food.Candy_Base': 1, + 'items.food.Candy_CottonCandyBlue': 1, + 'items.food.Candy_CottonCandyPink': 1, + 'items.food.Candy_Shade': 1, + 'items.food.Candy_White': 1, + 'items.food.Candy_Golden': 1, + 'items.food.Candy_Zombie': 1, + 'items.food.Candy_Desert': 1, + 'items.food.Candy_Red': 1, + }; + + set.migration = MIGRATION_NAME; + + if (user && user.items && user.items.pets && user.items.pets['JackOLantern-RoyalPurple']) { + set['items.mounts.JackOLantern-RoyalPurple'] = true; + } else if (user && user.items && user.items.mounts && user.items.mounts['JackOLantern-Glow']) { + set['items.pets.JackOLantern-RoyalPurple'] = 5; + } else if (user && user.items && user.items.pets && user.items.pets['JackOLantern-Glow']) { + set['items.mounts.JackOLantern-Glow'] = true; + } else if (user && user.items && user.items.mounts && user.items.mounts['JackOLantern-Ghost']) { + set['items.pets.JackOLantern-Glow'] = 5; + } else if (user && user.items && user.items.pets && user.items.pets['JackOLantern-Ghost']) { + set['items.mounts.JackOLantern-Ghost'] = true; + } else if (user && user.items && user.items.mounts && user.items.mounts['JackOLantern-Base']) { + set['items.pets.JackOLantern-Ghost'] = 5; + } else if (user && user.items && user.items.pets && user.items.pets['JackOLantern-Base']) { + set['items.mounts.JackOLantern-Base'] = true; + } else { + set['items.pets.JackOLantern-Base'] = 5; + } + + if (count % progressCount === 0) console.warn(`${count} ${user._id}`); + return await User.update({_id: user._id}, {$inc: inc, $set: set}).exec(); +} + +export default async function processUsers () { + let query = { + migration: {$ne: MIGRATION_NAME}, + 'auth.timestamps.loggedin': {$gt: new Date('2021-10-01')}, + }; + + 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/gear.json b/website/common/locales/en/gear.json index d090e851ea..892ae6378e 100644 --- a/website/common/locales/en/gear.json +++ b/website/common/locales/en/gear.json @@ -436,6 +436,8 @@ "weaponMystery202102Notes": "The glowing pink gem in this wand holds the power to spread joy and friendship far and wide! Confers no benefit. February 2021 Subscriber Item.", "weaponMystery202104Text": "Thorny Thistle Staff", "weaponMystery202104Notes": "Your enemies had better look out- you've got powerful and prickly defenses! Confers no benefit. April 2021 Subscriber Item.", + "weaponMystery202111Text": "Chronomancer's Staff", + "weaponMystery202111Notes": "Shape the flow of time with this mysterious and powerful staff. Confers no benefit. November 2021 Subscriber Item.", "weaponMystery301404Text": "Steampunk Cane", "weaponMystery301404Notes": "Excellent for taking a turn about town. March 3015 Subscriber Item. Confers no benefit.", @@ -1766,6 +1768,8 @@ "headMystery202108Notes": "You're looking super fresh, just sayin'. Confers no benefit. August 2021 Subscriber Item.", "headMystery202110Text": "Mossy Gargoyle Helm", "headMystery202110Notes": "The frightening visage of this stony helm will surely repel malevolent forces or even bad habits! Confers no benefit. October 2021 Subscriber Item.", + "headMystery202111Text": "Chronovision Hat", + "headMystery202111Notes": "A fine and fancy hat, with goggles that let you see through time. Pretty cool, right? Confers no benefit. November 2021 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", diff --git a/website/common/locales/en/subscriber.json b/website/common/locales/en/subscriber.json index d429a7f4e5..ef9a6337eb 100644 --- a/website/common/locales/en/subscriber.json +++ b/website/common/locales/en/subscriber.json @@ -127,6 +127,7 @@ "mysterySet202108": "Fiery Shounen Set", "mysterySet202109": "Lunar Lepidopteran Set", "mysterySet202110": "Mossy Gargoyle Set", + "mysterySet202111": "Cosmic Chronomancer Set", "mysterySet301404": "Steampunk Standard Set", "mysterySet301405": "Steampunk Accessories Set", "mysterySet301703": "Peacock Steampunk Set", diff --git a/website/common/script/content/constants/events.js b/website/common/script/content/constants/events.js index 16e5c3fe66..ccd464cae7 100644 --- a/website/common/script/content/constants/events.js +++ b/website/common/script/content/constants/events.js @@ -15,6 +15,14 @@ export const EVENTS = { season: 'normal', npcImageSuffix: '', }, + spooky_extra_gems: { // eslint-disable-line camelcase + start: '2021-10-29T08:00-04:00', + end: '2021-10-31T20:00-04:00', + npcImageSuffix: '_fall', + season: 'fall', + gemsPromo, + promo: 'spooky_extra_gems', + }, fall_extra_gems: { // eslint-disable-line camelcase start: '2021-10-05T08:00-04:00', end: '2021-10-12T20:00-04:00', diff --git a/website/common/script/content/gear/sets/mystery.js b/website/common/script/content/gear/sets/mystery.js index ffa70f74e7..156a36e859 100644 --- a/website/common/script/content/gear/sets/mystery.js +++ b/website/common/script/content/gear/sets/mystery.js @@ -177,6 +177,7 @@ const head = { 202107: { }, 202108: { }, 202110: { }, + 202111: { }, 301404: { }, 301405: { }, 301703: { }, @@ -229,6 +230,9 @@ const weapon = { 202104: { twoHanded: true, }, + 202111: { + twoHanded: true, + }, 301404: { }, }; diff --git a/website/common/script/content/index.js b/website/common/script/content/index.js index ebc6937a55..9b154f9b28 100644 --- a/website/common/script/content/index.js +++ b/website/common/script/content/index.js @@ -187,7 +187,7 @@ api.specialMounts = stable.specialMounts; api.mountInfo = stable.mountInfo; // For seasonal events, change this constant: -const FOOD_SEASON = moment().isBefore('2021-02-02') ? 'Cake' : 'Normal'; +const FOOD_SEASON = moment().isBefore('2021-11-02T20:00-04:00') ? 'Candy' : 'Normal'; api.food = { Meat: { diff --git a/website/common/script/content/stable.js b/website/common/script/content/stable.js index ea1617fa69..9119cfca23 100644 --- a/website/common/script/content/stable.js +++ b/website/common/script/content/stable.js @@ -128,6 +128,7 @@ const canFindSpecial = { 'JackOLantern-Base': false, 'JackOLantern-Glow': false, 'JackOLantern-Ghost': false, + 'JackOLantern-RoyalPurple': false, // Naming Day 'Gryphon-RoyalPurple': false, // Summer Splash Orca @@ -194,6 +195,7 @@ const specialMounts = { 'Hippogriff-Hopeful': 'hopefulHippogriffMount', 'Gryphon-Gryphatrice': 'gryphatrice', 'JackOLantern-Glow': 'glowJackolantern', + 'JackOLantern-RoyalPurple': 'royalPurpleJackolantern', }; each(specialPets, (translationString, key) => { diff --git a/website/raw_sprites/spritesmith/gear/events/mystery_202111/head_mystery_202111.png b/website/raw_sprites/spritesmith/gear/events/mystery_202111/head_mystery_202111.png new file mode 100644 index 0000000000000000000000000000000000000000..4b2cff99034cd551cdfa035d4b86c0559724c850 GIT binary patch literal 675 zcmV;U0$lxxP)D?9|rI4htJP|AzKfG#35^OVGx`#Dth= zq9Jx@u(_xt9vdNYc5`#dZuS;#@Ai)8sV2*?GcbH_=7vcU005}Fxmo?eT34IBQNOdZ zmDcw6)$q4G8!Y6EI6bRz+Fm|W#Sp!t#%w&dDk54%idIDH7~=HTkM79FYA-LAirIK> z&33ej-cpfRNYQ%Y;xzqzkn@#pVayIjaer<*n|mq}3n^Mpnt?doTgdK{>}SSovz`5( zoz4F9s?TXvq-aI79@Dk7AARd9S2FuNUVWGO{KeYs%;)!3KZo|)?cKr;_-XDYbYX09 zsv<=zbu~3N1nyiqA7btGnO05(~+c?potG zT}pPt^TV$jp}oEFH?&tiJ_zkk4{v3@bC~||Sn(X{9J4A?v|`tKglNsPzIMIv1O9RP z$G$Z83;Rs!?yHIvt%%m7{FVN*2Ny&8&;0jNV~y&LYy4mSym!WZoV8*h9SDp$PRqyL z&(J!Tl>6RMU3`k~rsiMtnp2TjNYOf}fy>@OjW0EIKK!dRzgjm>^|I%X6S)`WRU{UY zIvfZzTa6H3i%Z4Rs5(x|#%%Xn_IXCyIds;Fg|us()WCxg)X2=KVIsHc*soiJsz}j_ zUF!%Vu5MALBC(K6X|#%26=@*>0000000000000000001(od4r~wTG~vOmF}I002ov JPDHLkV1jzGJ?Q`d literal 0 HcmV?d00001 diff --git a/website/raw_sprites/spritesmith/gear/events/mystery_202111/shop_head_mystery_202111.png b/website/raw_sprites/spritesmith/gear/events/mystery_202111/shop_head_mystery_202111.png new file mode 100644 index 0000000000000000000000000000000000000000..6777e5f3cd3ce74595f61e6ce4b3b200dfae8c9f GIT binary patch literal 601 zcmeAS@N?(olHy`uVBq!ia0vp^E+EXo1|%(nCvO5$Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP#m#C1wTE)yzpd8~fPZ!6Kid%1I82TS_kZ6lvJwc?$ z%E0u|GB{<0|KFti;!#49laI+o0dtcbCR&{rI3`*>XpPa_ zvSo@>&HT0HcVtg~fAagCb%THthhhtu_>--6$i`;lnpttzUb-r8_`mi7=ggG`XD@Wv0U|S`l7Bgii>kQ;*ERGx1}!0%J#aw z;F{%Ar{2&soz*_~)2=M~WbtZ}<|?)S`(i%S#V=G$l-QKCMQM(=zUSlinbI$R>+II7 zeV-!7$Z&mWSFWg`RglY-@4nO8cs5VJ88yR{@xiB891I((3%M99EG^g>*4&lbzG%~q zyT$uvYraW6X4=kSJZS|3!>sd_3=W$Ac^N$Jzh`8S`)0nR^zO5xc1iaYd>1MnKB1^I zDXi#b=xwb>WpN*tTw|_QU#Qq@a^&UF>|KWZ3_rT|Se2~*ySKYT?&vPRp3ibZWm60P zKl;kYFvIao=#jfh_bjb;r~TKQ*v9io?$MWZio5*(zB?YjE^5BX(^}nQXIv}zB~NNC zRud6sc;xvz_s^_{DPCV)^@`f=J+Vz$QsiN+)FrYi@7NDhLk{H(4~Z3=M@0f<%`-TF jPJ@I!Bo>S`>KOgbZoK<@*{i+4M8M$b>gTe~DWM4fpThj~ literal 0 HcmV?d00001 diff --git a/website/raw_sprites/spritesmith/gear/events/mystery_202111/shop_set_mystery_202111.png b/website/raw_sprites/spritesmith/gear/events/mystery_202111/shop_set_mystery_202111.png new file mode 100644 index 0000000000000000000000000000000000000000..cbd25c07a9963d886c1671cb0bcf5b51e4509ec0 GIT binary patch literal 1029 zcmV+g1p51lP)}z z5mC@TFbj!Hf)-L>NkTCh1diy!v5TZ*+IU)=`LOSJ=5%Jp%b9$ijhyey`Hu4bc;4sz z91w{_qU`1K>Ms_m3K-cu7mp@#`kM-b30;L=B_muL%ytXI4Jqn9*3StcUM0jz#V8@%AX2muibiALA6q#l6)k72+75o5Tx~~I({*GS& zw7fqKK<|k?+H>jdt9{hIxsoD;Wa=T!m1fd=)Ol4~SCw6Mw9A(bAyz%VS8dxx+}>CE z7?{lIoJ0t5ONb)l!Rt3of3GJ?)rJ@~LtFeijY%t}nOZ#MwSFZQ^s>{kF*5Oh^>w^HXE zv!`ZvRwsnaRSr3}qXvLyuV0!T)6*9D`~JVqHPrMOf0xWDH-vWj4Sin=F{_Fshs-G< zDqpC|AF10Pak^GsG7=xrTs$yRU;va>*aMI&8PROk)K4>)B;wPOL*~Up(ve~9 zI)LUOGZiV&DwmF!Y!wKZ`zs=5zh7pV`AMo<*A^N8q0(YoQmndmstka==bE+k;!W3m zb`{OGg7YmQB-8j7d$PrGCW-bY0k~0Sb{Xr5R=R1}tE31aSp|FtO|;h=0M&QR8OFbU z0+>0`%JjTM2>D-T8KvP=LcL!Twq0+i45rRH$9+P`QuGiTXdEqHS$N~_ekrEsIt$E6>vJ%Z}yhe%;vVepD(D7y5(Nn}jmS7HX zl~ZC*%x?^Bs6PqJJ~t6UmWqd@qcYl?G`}a(Vv?c$W4PF)2q7Nu5WNds-e>?+ZSw=r zd}Ux!XC5KMYlK+4&tgxHIp( zg!{=Sge*}Hv8A|a-x>p;v9nLQj7TIB<%|9R=2UPwmHqv~00000NkvXXu0mjfs?gT; literal 0 HcmV?d00001 diff --git a/website/raw_sprites/spritesmith/gear/events/mystery_202111/shop_weapon_mystery_202111.png b/website/raw_sprites/spritesmith/gear/events/mystery_202111/shop_weapon_mystery_202111.png new file mode 100644 index 0000000000000000000000000000000000000000..3a32ef711b04d554a8ce96a0fbee4f389013dfaf GIT binary patch literal 666 zcmV;L0%iS)P)aaHRI#*iVJXXRIhdS6#-H? z*Y&QuX8^uz;K-0981nD;v;lZL`Y!N%YJb~3Zc2qT0M*hR6NgNZA&ttA(|DE}0^sZN zHy41_$)YkO35NLdh5zQC3_mJ{9s60b^LIycNFp=jBs1!}4xkK4)Gl+Yx6=SzzR(qD zN?e^ZPO+(YuV#_R)m;Vd!dLJ)cb*fbSc7jtog+h6G@BrODxo0Q}tA zCkm#>kXC0%h?NFlw_5Yfh(xBykO&xJnNrz3urlRtrrXMzR+}P2B4h{vi+}b)GesGa zz&Yehb4q1l0D%6HF`#wdO=L*aGUOy{*UB{maP5U>hX2Q~*`~;l7-WdugpF07*qoM6N<$g0oy9 Ay#N3J literal 0 HcmV?d00001 diff --git a/website/raw_sprites/spritesmith/gear/events/mystery_202111/weapon_mystery_202111.png b/website/raw_sprites/spritesmith/gear/events/mystery_202111/weapon_mystery_202111.png new file mode 100644 index 0000000000000000000000000000000000000000..ac48e94b85a9965e698de12bafb9230cb52cf8a6 GIT binary patch literal 733 zcmeAS@N?(olHy`uVBq!ia0vp^ML-jA5L~c#`DCC7XMsm# zF#`j)FbFd;%$g$s6l5>)^mS!_$|WkKrfK=)^JxYKrYuhv$B>F!Z||JfK3phs{NwqY zna`da&p4&$;xVmRp56YD!mDam?LNO#u6mQ0j~+ei$+zeav$cokDMy(lWuF#L(PWR2 zF)=E>RW1K>-Osv-A8YOW-ap$t_5JSer+1&<7YK4S0wm1TzRZ8fajMVN?A^x8uJ4)m z-Xr!x{ewqk|K{1`G4{IfeN5@PeD$!ha_Ihy>neNxd8{gH=TZK9PptC&v#CmHGd(VN zsJp-Ze6+_UDgS)XHS-(rwlclO&IVB;BW?tgXMek(j& zn^!b){Y#EtDqY{#%XLNqt)8^@s?g=;*3N56EBo{3i5Q*+nzU)_t=|03o9z`&{lVM7 ziZcFIojE2K=d=Chvxe&>k5z%8BE`ALboJcR?%ua`W_U<-?pGE!ckH}*!>xBu#63F| z)AL7+CYlHV!{zZmlUWmHtd;RRzVe@bYDc8nB)6uuSN|~{3YmH&Gk0-x9KV13YjzGj zpj(7oUQg%et?20PTryE1s@^26RMv6+;-qOn?g`a-^&hNf*kwN0(!K*|ALq7f@irzi zWWIaHS{6M^QgT#2crEMo`L>IpI)=A5SDyp=f{Ee7^*xM&=9@O2+1+&xlpZ`?{an^L HB{Ts5zsf_+ literal 0 HcmV?d00001 diff --git a/website/raw_sprites/spritesmith/stable/mounts/body/Mount_Body_JackOLantern-RoyalPurple.png b/website/raw_sprites/spritesmith/stable/mounts/body/Mount_Body_JackOLantern-RoyalPurple.png new file mode 100644 index 0000000000000000000000000000000000000000..7f501510fdf2835d7bad71cf2dc846b8e8801a82 GIT binary patch literal 3001 zcmV;q3r6&bP)uJ@VVD_UC<6{NG_fI~0ue<-1QkJoA_k0xBC#Thg@9ne9*`iQ#9$Or zQF$}6R&?d%y_c8YA7_1QpS|}zXYYO1x&V;8{kgn!SPFnNo`4_X6{c}T{8k*B#$jdxfFg<9uYy1K45IaYvHg`_dOZM)Sy63ve6hvv z1)yUy0P^?0*fb9UASvow`@mQCp^4`uNg&9uGcn1|&Nk+9SjOUl{-OWr@Hh0;_l(8q z{wNRKos+;6rV8ldy0Owz(}jF`W(JeRp&R{qi2rfmU!TJ;gp(Kmm5I1s5m_f-n#TRsj}B0%?E`vOzxB2#P=n*a3EfYETOrKoe*ICqM@{4K9Go;5xVgZi5G4 z1dM~{UdP6d+Yd3o?MrAqM0Kc|iV92owdyL5UC#5<>aVCa44|hpM4E zs0sQWIt5*Tu0n&*J!lk~f_{hI!w5`*sjxDv4V%CW*ah~3!{C*0BD@;TgA3v9a1~q+ zAA{TB3-ERLHar49hi4Ih5D^-ph8Q6X#0?2VqLBoIkE}zAkxHZUgRb+f=nat zP#6>iMMoK->`~sRLq)(kHo*Vn{;LcG6+edD1=7D>9j^O?D{Qg|tCDK{ym)H7&wDr6*;uGTJg8GHjVbnL{!cWyUB7MT6o-VNo_w8Yq`2<5Ub)hw4L3rj}5@qxMs0 zWMyP6Wy582WNT#4$d1qunl{acmP#w5ouJ*Jy_Zv#bCKi7ZIf$}8d zZdVy&)LYdbX%I9R8VMQ|8r>Q*nyQ)sn)#Z|n)kKvS`4iu ztvy=3T65Yu+7a4Yv^%sXb>ww?bn(=Yu(!=O6^iuTp>)p_Y^{w=i z^lS773}6Fm1Fpe-gF!>Ip{*g$u-szvGhed;vo5pW&GpS$<~8QGEXWp~7V9lKEnZq0SaK{6Sl+dwSOr*Z zvFf(^Xl-N7w{EeXveC4Ov)N}e%%C!Y7^RFWwrE>d+x51mZQt2h+X?JW*!^a2WS?Sx z)P8cQ&Qi|OhNWW;>JChYI)@QQx?`Nj^#uJBl~d&PK+RZLOLos~K(b5>qmrMN0})tOkySZ3_W zICNY@+|jrX%s^&6b2i>5eqa0y%Z;^%^_=a@u3%4b9605ii3Ep)@`TAmhs0fpQ%O!q zl}XcFH*PieWwLj2ZSq`7V9Mc?h17`D)-+sNT-qs~3@?S(ldh7UlRlVXkWrK|vf6I- z?$tAVKYn8-l({mqQ$Q8{O!WzMg`0(=S&msXS#Pt$vrpzo=kRj+a`kh!z=6$;c zwT88(J6|n-WB%w`m$h~4pmp)YIh_ z3ETV2tjiAU!0h1dxU-n=E9e!)6|Z;4?!H=SSy{V>ut&IOq{_dl zbFb#!9eY1iCsp6Bajj|Hr?hX|zPbJE{X++w546-O*Ot`2Kgd0Jx6Z4syT zu9enWavU5N9)I?I-1m1*_?_rJ$vD~agVqoG+9++s?NEDe`%Fht$4F;X=in*dQ{7$m zU2Q)a|9JSc+Uc4zvS-T963!N$T{xF_ZuWe}`RNOZ7sk3{yB}PPym+f8xTpV;-=!;; zJuhGEb?H5K#o@~7t9DmUU1MD9xNd#Dz0azz?I)|B+WM{g+Xrk0I&awC=o(x)cy`EX z=)z6+o0o6-+`4{y+3mqQ%kSJBju{@g%f35#FZJHb`&swrA8dGtepviS>QUumrN{L@ z>;2q1Vm)$Z)P1z?N$8UYW2~{~zhwUMVZ87u`Dx{Z>O|9|`Q+&->FRy-Sjp7DHs zy69KwU-!MxeeuI@&cF4|M9z%AfP?@5 z`Tzg`fam}Kbua(`>RI+y?e7jT@qQ9J+u00v@9M??Vs0RI60puMM)00009a7bBm z000XU000XU0RWnu7ytkO2XskIMF-^y1r!Z7mIx?%0002QNkl^}{*e v*FnuJ@VVD_UC<6{NG_fI~0ue<-1QkJoA_k0xBC#Thg@9ne9*`iQ#9$Or zQF$}6R&?d%y_c8YA7_1QpS|}zXYYO1x&V;8{kgn!SPFnNo`4_X6{c}T{8k*B#$jdxfFg<9uYy1K45IaYvHg`_dOZM)Sy63ve6hvv z1)yUy0P^?0*fb9UASvow`@mQCp^4`uNg&9uGcn1|&Nk+9SjOUl{-OWr@Hh0;_l(8q z{wNRKos+;6rV8ldy0Owz(}jF`W(JeRp&R{qi2rfmU!TJ;gp(Kmm5I1s5m_f-n#TRsj}B0%?E`vOzxB2#P=n*a3EfYETOrKoe*ICqM@{4K9Go;5xVgZi5G4 z1dM~{UdP6d+Yd3o?MrAqM0Kc|iV92owdyL5UC#5<>aVCa44|hpM4E zs0sQWIt5*Tu0n&*J!lk~f_{hI!w5`*sjxDv4V%CW*ah~3!{C*0BD@;TgA3v9a1~q+ zAA{TB3-ERLHar49hi4Ih5D^-ph8Q6X#0?2VqLBoIkE}zAkxHZUgRb+f=nat zP#6>iMMoK->`~sRLq)(kHo*Vn{;LcG6+edD1=7D>9j^O?D{Qg|tCDK{ym)H7&wDr6*;uGTJg8GHjVbnL{!cWyUB7MT6o-VNo_w8Yq`2<5Ub)hw4L3rj}5@qxMs0 zWMyP6Wy582WNT#4$d1qunl{acmP#w5ouJ*Jy_Zv#bCKi7ZIf$}8d zZdVy&)LYdbX%I9R8VMQ|8r>Q*nyQ)sn)#Z|n)kKvS`4iu ztvy=3T65Yu+7a4Yv^%sXb>ww?bn(=Yu(!=O6^iuTp>)p_Y^{w=i z^lS773}6Fm1Fpe-gF!>Ip{*g$u-szvGhed;vo5pW&GpS$<~8QGEXWp~7V9lKEnZq0SaK{6Sl+dwSOr*Z zvFf(^Xl-N7w{EeXveC4Ov)N}e%%C!Y7^RFWwrE>d+x51mZQt2h+X?JW*!^a2WS?Sx z)P8cQ&Qi|OhNWW;>JChYI)@QQx?`Nj^#uJBl~d&PK+RZLOLos~K(b5>qmrMN0})tOkySZ3_W zICNY@+|jrX%s^&6b2i>5eqa0y%Z;^%^_=a@u3%4b9605ii3Ep)@`TAmhs0fpQ%O!q zl}XcFH*PieWwLj2ZSq`7V9Mc?h17`D)-+sNT-qs~3@?S(ldh7UlRlVXkWrK|vf6I- z?$tAVKYn8-l({mqQ$Q8{O!WzMg`0(=S&msXS#Pt$vrpzo=kRj+a`kh!z=6$;c zwT88(J6|n-WB%w`m$h~4pmp)YIh_ z3ETV2tjiAU!0h1dxU-n=E9e!)6|Z;4?!H=SSy{V>ut&IOq{_dl zbFb#!9eY1iCsp6Bajj|Hr?hX|zPbJE{X++w546-O*Ot`2Kgd0Jx6Z4syT zu9enWavU5N9)I?I-1m1*_?_rJ$vD~agVqoG+9++s?NEDe`%Fht$4F;X=in*dQ{7$m zU2Q)a|9JSc+Uc4zvS-T963!N$T{xF_ZuWe}`RNOZ7sk3{yB}PPym+f8xTpV;-=!;; zJuhGEb?H5K#o@~7t9DmUU1MD9xNd#Dz0azz?I)|B+WM{g+Xrk0I&awC=o(x)cy`EX z=)z6+o0o6-+`4{y+3mqQ%kSJBju{@g%f35#FZJHb`&swrA8dGtepviS>QUumrN{L@ z>;2q1Vm)$Z)P1z?N$8UYW2~{~zhwUMVZ87u`Dx{Z>O|9|`Q+&->FRy-Sjp7DHs zy69KwU-!MxeeuI@&cF4|M9z%AfP?@5 z`Tzg`fam}Kbua(`>RI+y?e7jT@qQ9J+u00v@9M??Vs0RI60puMM)00009a7bBm z000XU000XU0RWnu7ytkO2XskIMF-^y1r!bld_-mv0009aNkl1%2H+RB)hnvYHo(BK`000000000000000 z0000000000000000000000000tzcc$3Yy7Pj#uN8)9tta#W#IDeaD-QUcykyxjRR1 zRpV4*NaZ|Ux)4gOhjyI*U5yu4=hX8TkKI2}s|M+G^nzYOQOc=3msHN@)lVvZz4lbQ zPNTFVH6l5X%xd#*&QH{=8af@lpqEgTBAH#dqT->gr?oj!J3&<=l`;@JsGjdkY}3|| z?j380YUp(I@_(=)Y6ZD$XOngY`U~0#WUhR}swtV1PK;@5aH)+>M=#Jay|_#)F55P_ zv&Vn1;AtlfBV~vDvi?}_-z{5JBhN*i<4msN=_VOE9lfBJmeC#WwJK%ga@>!-DHZ3( zOIj7UAlEPCr?ffwaZkIxsb)GIy+Bj-;xe&3E8SD^{&>c!l+uSv!}TRGtuJeks`0#x z_FP;h89E)kpqHi+YujSo&T`9VhbOf8cOUrM`Qc=bb&`?#Ix-pyw7#rua%9 zm3GU^4F_o%de+3Y8E>R)TpMbO*fOvjS7(dp;~Y((Nm z0ekz>DrfQIa}}q$_Nlo0$DoS;y2DoJ!nFN^-nA=pRyGx_wYf|zbUJ!rdTA;yADT?6 z@w)8Oj#Pp1LruV(Mk$3(M=wk-pR07*qoM6N<$g2Oi3+W-In literal 0 HcmV?d00001 diff --git a/website/raw_sprites/spritesmith/stable/mounts/icon/Mount_Icon_JackOLantern-RoyalPurple.png b/website/raw_sprites/spritesmith/stable/mounts/icon/Mount_Icon_JackOLantern-RoyalPurple.png new file mode 100644 index 0000000000000000000000000000000000000000..c37a20bcabe633e70b5c71e4f75fdb537edb719a GIT binary patch literal 3599 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 VR_