V=-0C=2J zR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+(=$pSoZ^zil2jm5 zsW>||C$%I$FF8LyJ2O>@i!&v&s2C_=$iz>&y-7qtR9J=Wlx=T UpNUSM4rQQt8J^*P!CITMZ7JkP*lDF<4l4IUEG$a6;_8aN5WV~ z{e*415>zPjj? NvvH&X`lkCJPC$m zAVJ^^m4d?%ssWCMkOZMFPZdUps=%d!QQz Q%jz^kl{^~=up`oGSFX22LBc}0` zA4s`Te$0 !)SI{{eYgVh&&Qul(b1Z-JRl(hw`F98cQ>?xtPpp^>&vIM3#26;5V2?qK9;v3Tz VD^zaYoq7NO002ovPDHLkV1ngPf^Gl+ From 74892648e5a58c7ce91ca067666bc4ee154512e3 Mon Sep 17 00:00:00 2001 From: Fermi <> Date: Tue, 1 Oct 2019 08:20:53 +0100 Subject: [PATCH 008/150] Enable spookytimes --- tgstation.dme | 1 + 1 file changed, 1 insertion(+) diff --git a/tgstation.dme b/tgstation.dme index cceeb1f915..92ff049a91 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -1698,6 +1698,7 @@ #include "code\modules\goonchat\browserOutput.dm" #include "code\modules\goonchat\jsErrorHandler.dm" #include "code\modules\holiday\easter.dm" +#include "code\modules\holiday\halloween.dm" #include "code\modules\holiday\holidays.dm" #include "code\modules\holodeck\area_copy.dm" #include "code\modules\holodeck\computer.dm" From 72ccc5fe69b4c73319d042a2a204328befcf5fbd Mon Sep 17 00:00:00 2001 From: Thalpy <48600475+ThalpySci@users.noreply.github.com> Date: Wed, 2 Oct 2019 06:52:01 +0100 Subject: [PATCH 009/150] Loopzoop --- code/modules/holiday/jacqueen.dm | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 code/modules/holiday/jacqueen.dm diff --git a/code/modules/holiday/jacqueen.dm b/code/modules/holiday/jacqueen.dm new file mode 100644 index 0000000000..29f0cacf5b --- /dev/null +++ b/code/modules/holiday/jacqueen.dm @@ -0,0 +1,26 @@ +//Jacq test +/mob/living/jacq + name = "Jacqueline" + real_name = "Jacqueline" + icon = 'icons/obj/halloween_items.dmi' + icon_state = "jacqueline" + maxHealth = INFINITY + health = INFINITY + speak_emote = list("croons") + emote_hear = list("spooks","giggles") + density = FALSE + var/destinations = list("Bar", "Brig", "Bridge", "Chapel", "Chemistry", "Cyrogenics", "Engineering", ) + var/tricked = list() //Those who have been tricked + +/mob/living/jacq/proc/poof() + var/area/A = GLOB.sortedAreas["[pick(destinations)]"] + if(A && istype(A)) + if(M.forceMove(safepick(get_area_turfs(A)))) + + +/mob/living/jacq/proc/chit_chat() + + +/mob/living/jacq/proc/trick() + var/ +//var/area/A = input(usr, "Pick an area.", "Pick an area") in GLOB.sortedAreas|null From 797dcfc1e3e8bf5c27c311a480cfd23f32b68a58 Mon Sep 17 00:00:00 2001 From: Fermi <> Date: Wed, 2 Oct 2019 10:08:45 +0100 Subject: [PATCH 010/150] ahaha --- code/modules/holiday/jacqueen.dm | 69 ++++++++++++++++++++++++++++--- sound/spookoween/ahaha.ogg | Bin 0 -> 14943 bytes 2 files changed, 64 insertions(+), 5 deletions(-) create mode 100644 sound/spookoween/ahaha.ogg diff --git a/code/modules/holiday/jacqueen.dm b/code/modules/holiday/jacqueen.dm index 29f0cacf5b..e6bce4fc40 100644 --- a/code/modules/holiday/jacqueen.dm +++ b/code/modules/holiday/jacqueen.dm @@ -1,25 +1,84 @@ -//Jacq test +//Whacha doing in here like? Yae wan tae ruin ta magicks? /mob/living/jacq name = "Jacqueline" real_name = "Jacqueline" icon = 'icons/obj/halloween_items.dmi' icon_state = "jacqueline" maxHealth = INFINITY - health = INFINITY + health = 20 speak_emote = list("croons") emote_hear = list("spooks","giggles") density = FALSE - var/destinations = list("Bar", "Brig", "Bridge", "Chapel", "Chemistry", "Cyrogenics", "Engineering", ) + var/destinations = list("Bar", "Brig", "Bridge", "Chapel", "Chemistry", "Cyrogenics", "Engineering", "Xenobiology") var/tricked = list() //Those who have been tricked + var/progression = list() //Keep track of where people are in the story. + + +/mob/living/jacq/proc/Destroy() //I.e invincible + visible_message("[src] cackles, \"You'll nae get rid a me that easily!\"") + playsound(loc, 'sound/spookoween/ahaha.ogg', 100, 1) + var/mob/living/Jacq = new src(loc) + Jacq.tricked = tricked + Jacq.progression = progression + Jacq.poof() + ..() + +/mob/living/jacq/death() //What is alive may never die + visible_message("[src] cackles, \"You'll nae get rid a me that easily!\"") + playsound(loc, 'sound/spookoween/ahaha.ogg', 100, 1) + health = 20 + poof() + /mob/living/jacq/proc/poof() var/area/A = GLOB.sortedAreas["[pick(destinations)]"] if(A && istype(A)) if(M.forceMove(safepick(get_area_turfs(A)))) +//Ye wee bugger, gerrout of it. Ye've nae tae enjoy reading the code fer mae secrets like. +/mob/living/jacq/proc/chit_chat(var/mob/living/L) + if(istype(L, mob/living/carbon)) + var/mob/living/carbon/C = L -/mob/living/jacq/proc/chit_chat() - + //Very important + var/gender = "lamb" + if(C) + if(C.gender == MALE) + gender = "laddie" + if(C.gender == FEMALE) + gender = "lassie" + + if(!progression[C]) + visible_message("[src] smiles ominously at [L], \”Well halò there [gender]! Ah’m Jacqueline, tae great Pumpqueen, right in tae flesh fer ye.”") + sleep(20) + visible_message("[src] smiles ominously at [L], \”Well halò there [gender]! Ah’m Jacqueline, tae great Pumpqueen, right in tae flesh fer ye.”") + + var/choices = list("Trick", "Treat") + var/choice = input(usr, "Trick or Treat?", "Trick or Treat?") in choices + switch(choice) + if("Trick") + L. + if("Treat") + +/mob/living/jacq/proc/check_candies(var/mob/living/carbon/C) + var/inv = C.get_contents() + var/candy_count = 0 + for(var/item in inv) + if(istype(item, /obj/item/reagent_containers/food/snacks/special_candy)) + candy_count++ + return candy_count + +/mob/living/jacq/proc/take_candies(var/mob/living/carbon/C, amount) + var/inv = C.get_contents() + var/candies = list() + for(var/item in inv) + if(istype(item, /obj/item/reagent_containers/food/snacks/special_candy)) + candies += item + if(LAZYLEN(candy_count) == amount) + for(var/candy in candies) + qdel(candy) + return TRUE + return FALSE /mob/living/jacq/proc/trick() var/ diff --git a/sound/spookoween/ahaha.ogg b/sound/spookoween/ahaha.ogg new file mode 100644 index 0000000000000000000000000000000000000000..2e830ad6c79cd2d7607b89a83497e8894d8a28b2 GIT binary patch literal 14943 zcmeHuWmr^E_wS)3loX_f2I=k+2}Md|XpojJVF0C3Qba%+BqW9&5Mk&Nq@`g%Qb9^e z=@90g!MFbR!+q|D`|ZBxIn1oH*V=3E^;>JNy=Kp#ZEvp&U<3cS-m 51XsMopelqyKTa{gb$Q|AzBdpExLH z l(Bn5~x=_zsiTwDPeN7Znf@77+eBJy7bu*MAZCF9QEX;J*m`7lHpG z@c$12cz>%5b|qy4EZ{Bx&?u4d;2~^cWqPStVrcW;EA?~tFer_% nKUQ6(d75>X5@#MzH zy`WT$_9&tOsR9T{6=Nt@;kpFRA!(3WWsZb;R)}M`H1;H(*D+eUG5R(!nq$Q4CjQD@ z317X$VANkxZo+G~U= 8 z$iOH&F#)kL9$2;k1fbl5h=K>vaHCi|$L!mFd0ZKJJY^pp`# suga+rIE+Al`qgBp=QamQQr34{YW>6YZE`f)B;|}Mr8PhFSBwz{Hl|Nqa-~H k>_Y2z<44}be*Jz)_gA)v+yi)23>Vy0>3uI!-X2?A#yQ(L {||L1*WdI&BM68i&0 z9lRgJ7Ca!ja!x!JKn8^5OGPg~0R0imVVrQ=F~#0DrN}p<_!Z-o2 G8l=b%ii94!{fm$~usH zo_swCVj7^0<0``kk98!xbq!tr=>$*&bM?UFz`GBG0wfaU)W*fM{x5F~u-E_?e2}g* zf2exNkm3VjPJ7vINKM*15-KH46Ml&&Q8c#^J!9NT@%b6*z45})PTX)^0`3xc(ui<( zK_SY72VTPnI*%Ms0Y3;3uym8zL qI$kO8W~XMra`T{z&= zO5BLQjA`pHNaVB=S4kIU3^ zG{{in=uUvX=C6GW4qk-vbma#bU&Ol~`y-HR6DEifqzTCAp@WqpR~HmP%PCC3F+f%P z-6qQ1Rab*|T@7vo zAz_cy)e-ud!XO1|DM6|WcV~j>hnpLj0;Xe38#f#!vii3TK4F3nrXY22Ae6}_CL?jf z3nomQuiD@RNhYs_|F$JSorP1Nn7&C+XZ~)eIyZ*WKy;;nB-j^hqtOK^uy0itjSUC^ z3hdiW >zqE{4GzHiBW0DS^H! zZpQ+c+wZ>}B)tEUh}f7AC;(SluMnsP#5xIFQv@JXTwOF*kitl=9! 30tdbiS2kV)+Q|TLS^y3SxKZ9tdU2I~N-*$Y3=f0S!LR&UBBm}4`V|W8&rEy- zx(akXxZc2NBSOLG;6~oE!Ou-f0wboIM2QFU_=e#sfVydvLE&3AF~|r^Jb~`xzv3cS zO)!si&Vyi3hh4* 0HV ztLM yt#V|s=@k;*oI6AKP!yVshFcMLYRQX3lmngMzCwS1z?8c?=}h@ zlm|l%%%q^OH1#r=)!`G?Wym#1%+6KH#>CrBi^GT-xb{t8JM#Dza$tG@!%rTcDMlzS zDaE?H3Iz!uzfYs1uEF1(;Xl|yV-u#%-EHDO)UftAhWrlvmQ6*&F=K#0$H@}7cN{N; zlHMV(iisCqore8tp|*)3?dW|B6X>8>el65-!t8=*z_*A2_1OgMil4mq7w#ZniveHe zVWam>z!iI+#v%+0Xdov6qORYkfZEd<(0MEq(y+#ZYYz($26Hx8ixk9zV1v2+f0Uh> zSD6$5+Ho;E9q)9qu?bRVZbHrcK=Ip68Ea9IA5b1UPuBIfbWT+iTO&knzp$@T89)mF zKMInPO!(=P`V}3;qk5TF*t^(SZQ@^!y)23sj#BGqupwf>EAbf-4yVkggA%1fiJVHM zBVvV%g*m@N3E|hk$RPumnc0DMK=IQJKuGE?jWpRh0rOJ_9N>mZucqZA0%8&otZ!JX zN<6>=%|}TBUWx?d1+ST3;|pZg|NczO>E#f5RsMwlA*4V^7 Yon1x85;mK%O=y1S zG7h`S6ZR{CyTCWFoMgdb%}Y-&`%vHBJ2L%k{nrUVNKOkTtAAYB*qGuP^8p4d#<2f! z)XaO;1YnMuFmYeR6N^^y6Vc!DCbN3cZ}7<}i<*4QI{)>(VS22FLHOhejtyh72#> zq-{@yRd+91)b2NuC0K{TTAX3?i_eNex4aSlr0g6Jg~f~YR1Tmx`rS$Iem;7l(y!%< z?u>RQ1KQoaU$=}=qmWRV-^Vs+rfhJ)K(7KHSdWRU_Ie`jRFA78-$8DFOXOptIn8D( z-$GW$3R|OJD$ou@}_~G6$Z15``J4~%kGbdn=0x`e*N;B(ts@q zrBXAk0g(LhC{oAMyhRxch7cx=(YsxRBG2w(12Xbe(-eXc#94ukRZD^i$k|fc{u9V4U`sdhi&OSU0;>CJ7}7`Q&{_ys5Y{2s`*mfUq5ah zvS$y;Q8%f>yR@nw?~%*HDKvcBpiCn}Db^OWr^fp|V0b9##BX1mZm+of$n#RpBUT#> z(xcYO1_SBOjBk$8++J4RzxTH7tH8we!Ju$uuXtqFbn6fwd2m^isUYXqiJissBh+R` z+o$4cYwu+=x+g4&C#`8~f1CXNPf8$09AM9(^G4c?N?QhrJ-U%b!Vq?c_d^Y9*a~@v zODs_iHcJ+-O~()e)TOF%zYF`kHCn~ofA)2%HMp`Yxuv%H-j= 5V=Ap&}gSCcm0reYNi!8`ZOD?%ppjq}2D9^qYT^ zN(uRD$!cR&pW%7uq4m@EIi2RofodEUtDhd|&NO--78t{3Xs}`yxg{i9TM`_MuDiK1 z2b}Hf3PuvKcGq7l1s~l>N6>hgNtpd$=O?Y=92L3iyzTY<+2%%%hd&=n?d8l$d#%@M z>C{X=k6sC)<=oKS<*d%)>$iz(M9!rz9e%vp?wQ)2Td}}vpWKNiU%>;+Ptz$cRjM9~ zH ”If you must know, I got kicked out of the witch academy for being too much of a “loose cannon”. A bloody loose cannon? Nae they were just pissed off I had the brass to proclaim myself as the Pumpqueen…. And also maybe the time I went and blew up one of the towers by trying to make a huge batch of astrogen might’ve had something to do with it. I mean it would’ve worked fine if the cauldrons weren’t so shite and were actually upgraded by the faculty. So technically no, I’m not a witch.” +So you got ex-spell-ed? +Gives you a blank look at the pun, before continuing ”Not quite, I know I can get back into the academy, it’s only an explosion, they happen all the time, but, to be fair it’s my fault that things came to their explosive climax. You don’t know what it’s like when you’re after a witch doctorate, everyone else is doing well, everyone’s making new spells and the like, and I’m just good at making explosions really, or fireworks. So, I did something I knew was dangerous, because I had to do something to stand out, but I know this life isn’t for me, I don’t want to be locked up in dusty towers, grinding reagent after reagent together, trying to find new reactions, some of the wizards in there haven’t left for years. I want to live, I want to fly around on a broom, turn people into cats for a day and disappear cackling! That’s what got me into witchcraft!” she throws her arms up in the arm, spinning the pumpkin upon her head slightly. She carefully spins it back to face you, giving out a soft sigh, ”I know my mother’s obsession with this dumb thing on my head is just her trying to fill the void of me and my sis moving out, and it really shouldn’t be on my head. And I know that I’m really here to get help from my sis… She’s the sensible one, and she gives good hugs.” +Thanks [L], I guess I didn’t realise I needed someone to talk to but, I’m glad you spent all your candies talking to me.” she gives a grin underneath the pumpkin upon her head, ”Though I’m still keeping the candies!” +Will you go on a date with me? +”…You want to ask me out on a date? Me? After all that nonsense I just said? It seems a waste of a candy honestly.” +[src] looks to the side. +”Look, I like ye but, I don’t think I can right now. If you can’t tell, the stations covered in volatile candies, I’ve a few other laddies and lassies running after me treats, and to top it all off, I’ve the gods breathing down me neck, watching every treat I make for the lot of yous.” she sighs, ”But that’s not a no, right? That’s.. just a not right now.” +[src] takes off the pumpkin on her head, a rich blush on her cheeks. She leans over planting a kiss upon your forehead quickly before popping the pumpkin back on her head. + +” There, that aught to be worth a candy.” + +Ondeath: +visible_message("[src] cackles, "You'll nae get rid a me that easily!"") +(the last message is if I can't get a ghost/a person in it) +*/ + /mob/living/jacq/proc/check_candies(mob/living/carbon/C) var/invs = C.get_contents() var/candy_count = 0 From aff7f808ece4b3fc5a4ac25a7aeefd6540bf476d Mon Sep 17 00:00:00 2001 From: Fermi <33956696+Thalpy@users.noreply.github.com> Date: Sun, 6 Oct 2019 00:36:57 +0100 Subject: [PATCH 017/150] oops --- code/modules/holiday/jacqueen.dm | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/code/modules/holiday/jacqueen.dm b/code/modules/holiday/jacqueen.dm index d1883df0d2..2f7343e7d8 100644 --- a/code/modules/holiday/jacqueen.dm +++ b/code/modules/holiday/jacqueen.dm @@ -1,3 +1,16 @@ +/datum/round_event_control/jacqueline + name = "Jacqueline the Pumpqueen" + holidayID = "Jacqueline" + typepath = /datum/round_event/jacq + weight = -1 //forces it to be called, regardless of weight + max_occurrences = 1 + earliest_start = 0 MINUTES + +/datum/round_event/jaqc/start() + ..() + for(var/mob/living/simple_animal/parrot/Poly/Poly in GLOB.mob_living_list) + new /mob/living/jacq(Poly.loc)//She poofs on init, so it doesn't matter, so long as poly exists. + //Whacha doing in here like? Yae wan tae ruin ta magicks? /mob/living/jacq name = "Jacqueline the Pumpqueen" @@ -11,6 +24,8 @@ var/tricked = list() //Those who have been tricked var/progression = list() //Keep track of where people are in the story. +/mob/living/jacq/Initialize() + poof() /mob/living/jacq/Destroy() //I.e invincible visible_message("[src] cackles, \"You'll nae get rid a me that easily!\"") @@ -18,7 +33,6 @@ var/mob/living/jacq/Jacq = new src.type(loc) Jacq.tricked = tricked Jacq.progression = progression - Jacq.poof() ..() /mob/living/jacq/death() //What is alive may never die From d023d58b2c05a79de338c3bbab220f3ce0872e74 Mon Sep 17 00:00:00 2001 From: Fermi <33956696+Thalpy@users.noreply.github.com> Date: Sun, 6 Oct 2019 02:10:46 +0100 Subject: [PATCH 018/150] Changes --- code/modules/holiday/jacqueen.dm | 70 +++++++++++++++++++++++++++++--- 1 file changed, 64 insertions(+), 6 deletions(-) diff --git a/code/modules/holiday/jacqueen.dm b/code/modules/holiday/jacqueen.dm index 0bd473ba59..43f8a6a482 100644 --- a/code/modules/holiday/jacqueen.dm +++ b/code/modules/holiday/jacqueen.dm @@ -1,3 +1,18 @@ +//Conversation +#define JACQ_HELLO (1<<0) +#define JACQ_CANDIES (1<<1) +#define JACQ_HEAD (1<<2) +#define JACQ_FAR (1<<3) +#define JACQ_WITCH (1<<4) +#define JACQ_EXPELL (1<<5) +#define JACQ_DATE (1<<6) +//Tricks +#define JACQ_TRICKED (1<<0) +#define JACQ_LATERN (1<<1) +#define JACQ_DULLA (1<<2) + +////ROUND EVENT + /datum/round_event_control/jacqueline name = "Jacqueline the Pumpqueen" holidayID = "Jacqueline" @@ -11,6 +26,8 @@ for(var/mob/living/simple_animal/parrot/Poly/Poly in GLOB.mob_living_list) new /mob/living/jacq(Poly.loc)//She poofs on init, so it doesn't matter, so long as poly exists. +/////// MOBS + //Whacha doing in here like? Yae wan tae ruin ta magicks? /mob/living/jacq name = "Jacqueline the Pumpqueen" @@ -61,6 +78,10 @@ /mob/living/jacq/proc/chit_chat(mob/living/L) var/mob/living/carbon/C = L + if(!iscarbon) + //Maybe? It seems like a lot of faff for something that is very unlikely to happen. + return + //Very important var/gender = "lamb" if(C) @@ -69,25 +90,62 @@ if(C.gender == FEMALE) gender = "lassie" - if(!progression[C]) - visible_message("[src] smiles ominously at [L], \"Well hal� there [gender]! Ah�m Jacqueline, tae great Pumpqueen, right in tae flesh fer ye.\"") - sleep(20) - visible_message("[src] smiles ominously at [L], \"Well hal� there [gender]! Ah�m Jacqueline, tae great Pumpqueen, right in tae flesh fer ye.\"") - var/choices = list("Trick", "Treat") + + if(!progression["[C.real_name]"] || !(progression["[C.real_name]"] & JACQ_HELLO)) + visible_message("[src] smiles ominously at [L], \"Well hal� there [gender]! Ah�m Jacqueline, tae great Pumpqueen, great tae meet ye.\"") + sleep(20) + visible_message("[src] continues, says, ”Ah’m sure yae well stunned, but ah’ve got nae taem fer that. Ah’m after the candies around this station. If yae get mae enoof o the wee buggers, Ah'll give you a treat, or if yae feeling bold, Ah ken trick ye instead.” giving [L] a wide grin.") + if(!progression["[C.real_name]"]) + progression["[C.real_name]"] += JACQ_HELLO //TO MAKE SURE THAT THE LIST ENTRY EXISTS. + else + progression["[C.real_name]"] = progression["[C.real_name]"] | JACQ_HELLO + return + + + var/choices = list("Trick", "Treat", "How do I get candies?") var/choice = input(usr, "Trick or Treat?", "Trick or Treat?") in choices switch(choice) if("Trick") + trick(C) return if("Treat") + if(check_candies()) + Treat() + else + visible_message("[src] raises an eyebrown, \"You've nae got any candies I want! They're the orange ones, now bugger off an go get em first.\"") return + if("How do I get candies?") + visible_message("[src] says, \"Gae find my familiar; Bartholomew. Ee's tendin the cauldron which ken bring out t' magic energy in items scattered aroond. Knowing him, ee's probably gone tae somewhere with books.\"") + return + return + +/mob/living/jacq/proc/treat(mob/living/carbon/C) + if(!progression["[C.real_name]"]) //I really don't want to get here without a hello. + progression["[C.real_name]"] += JACQ_HELLO + + + if(progression["[C.real_name]"] & JACQ_TRICKED) + + if(progression["[C.real_name]"] & JACQ) + + if(progression["[C.real_name]"] & ) + + if(progression["[C.real_name]"] & ) + + if(progression["[C.real_name]"] & ) + + if(progression["[C.real_name]"] & ) + + if("Why do you want the candies?") + visible_message("[src] says, \ ”Ave you tried them? They’re full of all sorts of reagents. Ah’m after them so ah ken magic em up an hopefully find rare stuff for me brews. Honestly it’s a lot easier magicking up tatt for you lot than runnin aroond on me own like. I'd ask me familiars but most a my familiars are funny fellows 'n constantly bugger off on adventures when given simple objectives like; Go grab me a tea cake or watch over me cauldron. I mean, ye might run into Bartholomew my cat. ee’s supposed to be tending my cauldron, but I’ve no idea where ee’s got tae.\"") /* visible_message("[src] smiles ominously at [L], ”Well halò there [gender]! Ah’m Jacqueline, tae great Pumpqueen, right in tae flesh fer ye.”") says, ”Ah’m sure yae well stunned, but ah’ve got nae taem fer that. Ah’m after yer candies. If yae get mae enoof o the wee buggers, I’ll give you a treat, or if yae feeling bold, Ah ken trick ye instaed.” giving [L] a wide grin. Why do you want the candies? -”Have you tried them? They’re full of all sorts of reagents. I’m after them so I can magic them up and hopefully find some rare stuff for me brews. Honestly it’s a lot cheaper magicking up tatt for you lot than sending a familiar off to pick them up for me. Most of my familiars are funny fellows and constantly go off on adventures when given simple objectives like; Go grab me a tea cake or watch over me cauldron. I mean, you might run into Bernkastel my cat. She’s supposed to be tending my cauldron, but I’ve no idea where she’s got to. + What is that on your head? Points at the pumpkin atop her head, ”This thing? This isn’t any ordinary pumpkin! My mother grew this monster over a year of love, dedication and hard work. Honestly it felt like she loved this thing more than she any of her kids, which I know isn’t true and it’s not like she was heartless or anything but.. well, we had a falling out when I got back home with all me stuff in tow. And all she had done is sent me owl after owl over the last year about this bloody pumpkin and I had enough. So I took it, and put it on my head. You know, as you do. I am the great Pumpqueen after all, I deserve this. Isn’t it a bit far to get candy? From ea031d6d40b266541aa9185e5393b8b9eaa3a375 Mon Sep 17 00:00:00 2001 From: Fermi <33956696+Thalpy@users.noreply.github.com> Date: Sun, 6 Oct 2019 11:09:54 +0100 Subject: [PATCH 019/150] Slowly getting there --- code/modules/holiday/jacqueen.dm | 210 +++++++++++++----- .../carbon/human/species_types/dullahan.dm | 5 +- 2 files changed, 160 insertions(+), 55 deletions(-) diff --git a/code/modules/holiday/jacqueen.dm b/code/modules/holiday/jacqueen.dm index 43f8a6a482..c99af41ab5 100644 --- a/code/modules/holiday/jacqueen.dm +++ b/code/modules/holiday/jacqueen.dm @@ -23,8 +23,8 @@ /datum/round_event/jaqc/start() ..() - for(var/mob/living/simple_animal/parrot/Poly/Poly in GLOB.mob_living_list) - new /mob/living/jacq(Poly.loc)//She poofs on init, so it doesn't matter, so long as poly exists. + for(var/mob/living/simple_animal/pet/dog/corgi/Ian/Ian in GLOB.mob_living_list) + new /mob/living/jacq(Poly.loc)//She poofs on init, so it doesn't matter, so long as Ian exists. /////// MOBS @@ -73,15 +73,17 @@ return TRUE return FALSE +/mob/living/jacq/on_click(whatever this proc is called) + chit_chat(L) + C.stun(0)//Okay, you're done talking now. //Ye wee bugger, gerrout of it. Ye've nae tae enjoy reading the code fer mae secrets like. /mob/living/jacq/proc/chit_chat(mob/living/L) var/mob/living/carbon/C = L - if(!iscarbon) //Maybe? It seems like a lot of faff for something that is very unlikely to happen. return - + C.stun(1000)//You're talking, don't leave. //Very important var/gender = "lamb" if(C) @@ -90,19 +92,16 @@ if(C.gender == FEMALE) gender = "lassie" - - if(!progression["[C.real_name]"] || !(progression["[C.real_name]"] & JACQ_HELLO)) visible_message("[src] smiles ominously at [L], \"Well hal� there [gender]! Ah�m Jacqueline, tae great Pumpqueen, great tae meet ye.\"") sleep(20) - visible_message("[src] continues, says, ”Ah’m sure yae well stunned, but ah’ve got nae taem fer that. Ah’m after the candies around this station. If yae get mae enoof o the wee buggers, Ah'll give you a treat, or if yae feeling bold, Ah ken trick ye instead.” giving [L] a wide grin.") + visible_message("[src] continues, says, ”Ah’m sure yae well stunned, but ah’ve got nae taem fer that. Ah’m after the candies around this station. If yae get mae enoof o the wee buggers, Ah'll give ye a treat, or if yae feeling bold, Ah ken trick ye instead.” giving [L] a wide grin.") if(!progression["[C.real_name]"]) progression["[C.real_name]"] += JACQ_HELLO //TO MAKE SURE THAT THE LIST ENTRY EXISTS. else progression["[C.real_name]"] = progression["[C.real_name]"] | JACQ_HELLO return - var/choices = list("Trick", "Treat", "How do I get candies?") var/choice = input(usr, "Trick or Treat?", "Trick or Treat?") in choices switch(choice) @@ -110,64 +109,148 @@ trick(C) return if("Treat") - if(check_candies()) - Treat() + if(check_candies(C)) + treat(C, gender) else - visible_message("[src] raises an eyebrown, \"You've nae got any candies I want! They're the orange ones, now bugger off an go get em first.\"") + visible_message("[src] raises an eyebrown, \"You've nae got any candies Ah want! They're the orange round ones, now bugger off an go get em first.\"") return if("How do I get candies?") - visible_message("[src] says, \"Gae find my familiar; Bartholomew. Ee's tendin the cauldron which ken bring out t' magic energy in items scattered aroond. Knowing him, ee's probably gone tae somewhere with books.\"") + visible_message("[src] says, \"Gae find my familiar; Bartholomew. Ee's tendin the cauldron which ken bring oot t' magic energy in items scattered aroond. Knowing him, ee's probably gone tae somewhere with books.\"") return - return -/mob/living/jacq/proc/treat(mob/living/carbon/C) - if(!progression["[C.real_name]"]) //I really don't want to get here without a hello. - progression["[C.real_name]"] += JACQ_HELLO +/mob/living/jacq/proc/treat(mob/living/carbon/C, gender) + visible_message("[src] gives off a glowing smile, \"What ken Ah offer ye? I can magic in you an object, A potion or a plushie. \"") + var/choices_reward = list("Object - 3 candies", "Potion - 2 candies", "Plushie - 1 candy", "Can I ask you a question instead?") + var/choice_reward = input(usr, "Trick or Treat?", "Trick or Treat?") in choices + switch(choice_reward) + if("Object - 3 candies") + var/new_obj = pick(subtypesof(/obj)) + //for(var/item in blacklist) + // if(new_obj == item) + // panic() + new new_obj(C.loc) + if("Potion - 2 candies") + new /obj/item/reagent_containers/potion_container(C.loc) + if("Plushie - 1 candy") + new /obj/item/toy/plush/random(C.loc) + if("Can I ask you a question instead?") + + var/choices = list() + //Figure out where the C is in the story + if(!progression["[C.real_name]"]) //I really don't want to get here withoot a hello, but just to be safe + progression["[C.real_name]"] += JACQ_HELLO + if(!progression["[C.real_name]"] & JACQ_FAR) + if(progression["[C.real_name]"] & JACQ_CANDIES) + choices += "You really came all this way for candy?" + else + choices += "Why do you want the candies?" + if(!progression["[C.real_name]"] & JACQ_HEAD) + choices += "What is that on your head?" + if(!progression["[C.real_name]"] & JACQ_EXPELL) + if(progression["[C.real_name]"] & JACQ_WITCH & JACQ_FAR) + choices += "So you got ex-spell-ed?" + else + choices += "Are you a witch?" + + //for Kepler, delete this, or just delete the whole story aspect if you want. + //If fully completed + if(progression["[C.real_name]"] JACQ_FAR & JACQ_EXPELL & JACQ_HEAD) + choices = "Can I take you out on a date?" + + //If you've nothing to ask + if(!LAZYLEN(choices)) + visible_message("[src] raises an eyebrown, \"Ah'm all questioned oot fer noo, [gender].\"") + return + //Otherwise, lets go! + visible_message("[src] says, \"A question? Sure, it'll cost you a candy though!\"") + choices += "Nevermind" + //Candies for chitchats + var/choice = input(usr, "What do you want to ask?", "What do you want to ask?") in choices + if(!take_candies(C, 1)) + visible_message("[src] raises an eyebrown, \"It's a candy per question [gender]! Thems the rules!\"") + return + //Talking + switch(choice) + if("Why do you want the candies?") + visible_message("[src] says, \”Ave ye tried them? They’re full of all sorts of reagents. Ah’m after them so ah ken magic em up an hopefully find rare stuff fer me brews. Honestly it’s a lot easier magicking up tatt fer ye lot than runnin aroond on me own like. I'd ask me familiars but most a my familiars are funny fellows 'n constantly bugger off on adventures when given simple objectives like; Go grab me a tea cake or watch over me cauldron. Ah mean, ye might run into Bartholomew my cat. Ee’s supposed tae be tending my cauldron, but I’ve nae idea where ee’s got tae.\"") + progression["[C.real_name]"] = progression["[C.real_name]"] | JACQ_CANDIES + + if("You really came all this way for candy?") + visible_message("[src] looks tae the side sheepishly, \"Aye, well, tae be honest, Ah’m here tae see me sis, but dunnae let her knew that. She’s an alchemist too like, but she dunnae use a caldron like mae, she buggered off like tae her posh ivory tower tae learn bloody chemistry instead!” [src] scowls, “She’s tae black sheep o’ the family too, so we dunnae see eye tae eye sometimes on alchemy. Ah mean, she puts moles in her brews! Ye dunnae put moles in yer brews! Yae threw your brews at tae wee bastards an blew em up!” [src] sighs ”But she’s a heart o gold so.. Ah wanted tae see her an check up oon her, make sure she’s okay.\"") + progression["[C.real_name]"] = progression["[C.real_name]"] | JACQ_FAR + + if("What is that on your head?") + visible_message("[src] pats the pumpkin atop her head, \"This thing? This ain’t nae ordinary pumpkin! Me Ma grew this monster ooer a year o love, dedication an hard work. Honestly it felt like she loved this thing more than any of us, which Ah knew ain’t true an it’s not like she was hartless or anything but.. well, we had a falling oot when Ah got back home with all me stuff in tow. An all she had done is sent me owl after owl over t' last year aboot this bloody pumpkin and ah had enough. So ah took it, an put it on me head. You know, as ye do. Ah am the great Pumpqueen after all, Ah deserve this.\"") + progression["[C.real_name]"] = progression["[C.real_name]"] | JACQ_HEAD + + if("Are you a witch?") + visible_message("[src] grumbles, \"If ye must know, Ah got kicked oot of the witch academy fer being too much of a “loose cannon”. A bloody loose cannon? Nae they were just pissed off Ah had the brass tae proclaim myself as the Pumpqueen…. And also maybe the time Ah went and blew up one of the towers by trying tae make a huge batch of astrogen might’ve had something tae do with it. Ah mean it would’ve worked fine if the cauldrons weren’t so shite and were actually upgraded by the faculty. So technically no, I’m not a witch.\"") + progression["[C.real_name]"] = progression["[C.real_name]"] | JACQ_WITCH + + if("So you got ex-spell-ed?") + visible_message("[src] Gives you a blank look at the pun, before continuing, \"Not quite, Ah know Ah ken get back into the academy, it’s only an explosion, they happen all the time, but, tae be fair it’s my fault that things came tae their explosive climax. You don’t know what it’s like when you’re after a witch doctorate, everyone else is doing well, everyone’s making new spells and the like, and I’m just good at making explosions really, or fireworks. So, Ah did something Ah knew was dangerous, because Ah had tae do something tae stand oot, but Ah know this life ain’t fer me, Ah don’t want tae be locked up in dusty towers, grinding reagent after reagent together, trying tae find new reactions, some of the wizards in there haven’t left fer years. Ah want tae live, Ah want tae fly around on a broom, turn people into cats fer a day and disappear cackling! That’s what got me into witchcraft!” she throws her arms up in the arm, spinning the pumpkin upon her head slightly. She carefully spins it back to face you, giving oot a soft sigh, ”Ah know my mother’s obsession with this dumb thing on my head is just her trying tae fill the void of me and my sis moving oot, and it really shouldn’t be on my head. And Ah know that I’m really here tae get help from my sis… She’s the sensible one, and she gives good hugs.\"") + sleep(50) + visible_message("[src] says, \"Thanks [C], Ah guess Ah didn’t realise Ah needed someone tae talk tae but, I’m glad ye spent all your candies talking tae me. Funny how things seem much worse in yer head.\"") + progression["[C.real_name]"] = progression["[C.real_name]"] | JACQ_EXPELL + + if("Can I take you out on a date?") + visible_message("[src] blushes, \"...You want tae ask me oot on a date? Me? After all that nonsense Ah just said? It seems a waste of a candy honestly.\"") + progression["[C.real_name]"] = progression["[C.real_name]"] | JACQ_DATE + dating_start(C, gender) + + if("Nevermind") + visible_message("[src] shurgs, \"Suit yerself then.\"") - if(progression["[C.real_name]"] & JACQ_TRICKED) +/mob/living/jacq/proc/trick(mob/living/carbon/C, gender) + var/option = rand(1,6) + switch(option) + if(1) + visible_message("[src] waves their arms around, \"Hocus pocus, making friends is now your focus!\"") + var/objective = pick("Make a tasty sandwich for", "Compose a poem for", "Aquire a nice outfit to give to", "Strike up a conversation about pumpkins with", "Write a letter and deliver it to", "Give a nice hat to") + var/mob/living/L2 = pick(GLOB.player_list) + objective += " [L2.name]." + if(2) + visible_message("[src] waves their arms around, \"Off comes your head, atleast you're not dead.\"") + C.reagents.add_reagent("pumpkinmutationtoxin", 5) + if(3) + visible_message("[src] waves their arms around, \"If only you had a better upbringing, your ears are now full of my singing!\"") + //playsound + if(4) + visible_message("[src] waves their arms around, \"A cute little bumpkin, In your hand is a pumpkin!\"") + //Sticky latern + if(5) + visible_message("[src] waves their arms around, \"In your arms a jokester, keep him close if you don't want to be a toaster!\"") + //sans + if(6) + visible_message("[src] waves their arms around, \"A new familiar for me, and you'll see it's thee!\"") + C.reagents.add_reagent("secretcatchem", 30) + if(7) + visible_message("[src] waves their arms around, \"While you may not be a ghost, for this sheet you'll always be it's host.\"") + C.place_on_head(new /obj/item/bedsheet/sticky(C)) - if(progression["[C.real_name]"] & JACQ) - - if(progression["[C.real_name]"] & ) - - if(progression["[C.real_name]"] & ) - - if(progression["[C.real_name]"] & ) - - if(progression["[C.real_name]"] & ) - - if("Why do you want the candies?") - visible_message("[src] says, \ ”Ave you tried them? They’re full of all sorts of reagents. Ah’m after them so ah ken magic em up an hopefully find rare stuff for me brews. Honestly it’s a lot easier magicking up tatt for you lot than runnin aroond on me own like. I'd ask me familiars but most a my familiars are funny fellows 'n constantly bugger off on adventures when given simple objectives like; Go grab me a tea cake or watch over me cauldron. I mean, ye might run into Bartholomew my cat. ee’s supposed to be tending my cauldron, but I’ve no idea where ee’s got tae.\"") - -/* -visible_message("[src] smiles ominously at [L], ”Well halò there [gender]! Ah’m Jacqueline, tae great Pumpqueen, right in tae flesh fer ye.”") -says, ”Ah’m sure yae well stunned, but ah’ve got nae taem fer that. Ah’m after yer candies. If yae get mae enoof o the wee buggers, I’ll give you a treat, or if yae feeling bold, Ah ken trick ye instaed.” giving [L] a wide grin. - -Why do you want the candies? - -What is that on your head? -Points at the pumpkin atop her head, ”This thing? This isn’t any ordinary pumpkin! My mother grew this monster over a year of love, dedication and hard work. Honestly it felt like she loved this thing more than she any of her kids, which I know isn’t true and it’s not like she was heartless or anything but.. well, we had a falling out when I got back home with all me stuff in tow. And all she had done is sent me owl after owl over the last year about this bloody pumpkin and I had enough. So I took it, and put it on my head. You know, as you do. I am the great Pumpqueen after all, I deserve this. -Isn’t it a bit far to get candy? -looks to the side sheepishly, ”Aye, well, tae be honest, Ah’m here tae see me sis, but dunnae let her knew that. She’s an alchemist too like, but she dunnae use a caldron like mae, she buggered off like to her posh ivory tower tae learn bloody chemistry instead!” [src] scowls, “She’s tae black sheep o’ the family too, so we dunnae see eye to eye sometimes on alchemy. Ah mean, she puts moles in her brews! Ye dunnae put moles in yer brews! Yae threw your brews at tae wee bastards an blew em up!” [src] sighs ”But she’s a heart o gold so.. Ah wanted tae see her an check up oon her, make sure she’s okay.” -Are you a witch? -grumbles ”If you must know, I got kicked out of the witch academy for being too much of a “loose cannon”. A bloody loose cannon? Nae they were just pissed off I had the brass to proclaim myself as the Pumpqueen…. And also maybe the time I went and blew up one of the towers by trying to make a huge batch of astrogen might’ve had something to do with it. I mean it would’ve worked fine if the cauldrons weren’t so shite and were actually upgraded by the faculty. So technically no, I’m not a witch.” -So you got ex-spell-ed? -Gives you a blank look at the pun, before continuing ”Not quite, I know I can get back into the academy, it’s only an explosion, they happen all the time, but, to be fair it’s my fault that things came to their explosive climax. You don’t know what it’s like when you’re after a witch doctorate, everyone else is doing well, everyone’s making new spells and the like, and I’m just good at making explosions really, or fireworks. So, I did something I knew was dangerous, because I had to do something to stand out, but I know this life isn’t for me, I don’t want to be locked up in dusty towers, grinding reagent after reagent together, trying to find new reactions, some of the wizards in there haven’t left for years. I want to live, I want to fly around on a broom, turn people into cats for a day and disappear cackling! That’s what got me into witchcraft!” she throws her arms up in the arm, spinning the pumpkin upon her head slightly. She carefully spins it back to face you, giving out a soft sigh, ”I know my mother’s obsession with this dumb thing on my head is just her trying to fill the void of me and my sis moving out, and it really shouldn’t be on my head. And I know that I’m really here to get help from my sis… She’s the sensible one, and she gives good hugs.” -Thanks [L], I guess I didn’t realise I needed someone to talk to but, I’m glad you spent all your candies talking to me.” she gives a grin underneath the pumpkin upon her head, ”Though I’m still keeping the candies!” -Will you go on a date with me? -”…You want to ask me out on a date? Me? After all that nonsense I just said? It seems a waste of a candy honestly.” +/*Will you go on a date with me? +”…You want tae ask me oot on a date? Me? After all that nonsense Ah just said? It seems a waste of a candy honestly.” [src] looks to the side. -”Look, I like ye but, I don’t think I can right now. If you can’t tell, the stations covered in volatile candies, I’ve a few other laddies and lassies running after me treats, and to top it all off, I’ve the gods breathing down me neck, watching every treat I make for the lot of yous.” she sighs, ”But that’s not a no, right? That’s.. just a not right now.” -[src] takes off the pumpkin on her head, a rich blush on her cheeks. She leans over planting a kiss upon your forehead quickly before popping the pumpkin back on her head. +”Look, Ah like ye but, Ah don’t think Ah can right now. If ye can’t tell, the stations covered in volatile candies, I’ve a few other laddies and lassies running after me treats, and tae top it all off, I’ve the gods breathing down me neck, watching every treat Ah make fer the lot of yous.” she sighs, ”But that’s not a no, right? That’s.. just a not right now.” +[src] takes off the pumpkin on her head, a rich blush on her cheeks. She leans over planting a kiss upon your forehead quickly befere popping the pumpkin back on her head. -” There, that aught to be worth a candy.” +” There, that aught tae be worth a candy.” Ondeath: visible_message("[src] cackles, "You'll nae get rid a me that easily!"") (the last message is if I can't get a ghost/a person in it) */ +/obj/item/bedsheet/sticky + item_flags = NODROP + +var/datum/reagent/mutationtoxin/pumpkinhead + name = "Pumpkin head mutation toxin" + id = "pumpkinmutationtoxin" + race = /datum/species/dullahan/pumpkin + mutationtext = "The pain subsides. You feel your head roll off your shoulders." + /mob/living/jacq/proc/check_candies(mob/living/carbon/C) var/invs = C.get_contents() var/candy_count = 0 @@ -183,15 +266,34 @@ visible_message("[src] cackles, "You'll nae get rid if(istype(item, /obj/item/reagent_containers/food/snacks/special_candy)) candies += item if(LAZYLEN(candies) == candy_amount) - for(var/candy in candies) - qdel(candy) - return TRUE + break + if(LAZYLEN(candies) == candy_amount) //I know it's a double check but eh, to be safe. + for(var/candy in candies) + qdel(candy) + return TRUE return FALSE -/mob/living/jacq/proc/trick() +/mob/living/jacq/proc/trick(C) //var/area/A = input(usr, "Pick an area.", "Pick an area") in GLOB.sortedAreas|null +//Potions +/obj/item/reagent_containers/potion_container + name = "potion" + //TODO icons + +/obj/item/reagent_containers/potion_container/Initialize() + ..() + var/datum/reagent/R = pick(subtypesof(/datum/reagent)) + reagents.add_reagent(R.id, 30) + name = "[R.id] Potion" + +/obj/item/reagent_containers/potion_container/throw_impact(atom/target) + var/datum/effect_system/smoke_spread/chem/s = new() + s.set_up(src.reagents, 3, target.loc) + s.start() + ..() + //Candies /obj/item/reagent_containers/food/snacks/special_candy name = "Magic candy" diff --git a/code/modules/mob/living/carbon/human/species_types/dullahan.dm b/code/modules/mob/living/carbon/human/species_types/dullahan.dm index 4a7580e978..9ab598aa87 100644 --- a/code/modules/mob/living/carbon/human/species_types/dullahan.dm +++ b/code/modules/mob/living/carbon/human/species_types/dullahan.dm @@ -32,6 +32,9 @@ head.throwforce = 25 myhead = new /obj/item/dullahan_relay (head, H) H.put_in_hands(head) + var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES) + for(/datum/action/item_action/organ_action/OA in eyes.actions) + OA.Toggle() /datum/species/dullahan/on_species_loss(mob/living/carbon/human/H) H.flags_1 |= ~HEAR_1 @@ -138,4 +141,4 @@ D.myhead = null owner.gib() owner = null - ..() \ No newline at end of file + ..() From fce6f134719ee788ea646f33ab8d64950e566f76 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Mon, 7 Oct 2019 23:58:15 +0200 Subject: [PATCH 020/150] Ports "Chat Subsystem ported from TerraGov-Marine-Corps" --- code/__DEFINES/misc.dm | 3 ++ code/__DEFINES/subsystems.dm | 5 +- code/__HELPERS/roundend.dm | 30 +++++------ code/_globalvars/misc.dm | 2 - code/controllers/subsystem/chat.dm | 67 +++++++++++++++++++++++++ code/modules/admin/verbs/adminhelp.dm | 6 +-- code/modules/antagonists/devil/devil.dm | 8 +-- code/modules/goonchat/browserOutput.dm | 11 ++-- tgstation.dme | 1 + 9 files changed, 105 insertions(+), 28 deletions(-) create mode 100644 code/controllers/subsystem/chat.dm diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index b6115e93e9..97c904d4c8 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -499,3 +499,6 @@ GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_S #define VOMIT_TOXIC 1 #define VOMIT_PURPLE 2 + +//Misc text define. Does 4 spaces. Used as a makeshift tabulator. +#define FOURSPACES " " diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 3394fba90c..d4086bc4d9 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -83,7 +83,9 @@ #define INIT_ORDER_SHUTTLE -21 #define INIT_ORDER_MINOR_MAPPING -40 #define INIT_ORDER_PATH -50 -#define INIT_ORDER_PERSISTENCE -100 +#define INIT_ORDER_PERSISTENCE -95 +#define INIT_ORDER_CHAT -100 //Should be last to ensure chat remains smooth during init. + // Subsystem fire priority, from lowest to highest priority // If the subsystem isn't listed here it's either DEFAULT or PROCESS (if it's a processing subsystem child) @@ -114,6 +116,7 @@ #define FIRE_PRIORITY_MOBS 100 #define FIRE_PRIORITY_TGUI 110 #define FIRE_PRIORITY_TICKER 200 +#define FIRE_PRIORITY_CHAT 400 #define FIRE_PRIORITY_OVERLAYS 500 #define FIRE_PRIORITY_INPUT 1000 // This must always always be the max highest priority. Player input must never be lost. diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index 0e9413520b..8e59106d98 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -280,41 +280,41 @@ if(GLOB.round_id) var/statspage = CONFIG_GET(string/roundstatsurl) var/info = statspage ? "[GLOB.round_id]" : GLOB.round_id - parts += "[GLOB.TAB]Round ID: [info]" + parts += "[FOURSPACES]Round ID: [info]" var/list/voting_results = SSvote.stored_gamemode_votes if(length(voting_results)) - parts += "[GLOB.TAB]Voting: " + parts += "[FOURSPACES]Voting: " var/total_score = 0 for(var/choice in voting_results) var/score = voting_results[choice] total_score += score - parts += "[GLOB.TAB][GLOB.TAB][choice]: [score]" + parts += "[FOURSPACES][FOURSPACES][choice]: [score]" - parts += "[GLOB.TAB]Shift Duration: [DisplayTimeText(world.time - SSticker.round_start_time)]" - parts += "[GLOB.TAB]Station Integrity: [mode.station_was_nuked ? "Destroyed" : "[popcount["station_integrity"]]%"]" + parts += "[FOURSPACES]Shift Duration: [DisplayTimeText(world.time - SSticker.round_start_time)]" + parts += "[FOURSPACES]Station Integrity: [mode.station_was_nuked ? "Destroyed" : "[popcount["station_integrity"]]%"]" var/total_players = GLOB.joined_player_list.len if(total_players) - parts+= "[GLOB.TAB]Total Population: [total_players]" + parts+= "[FOURSPACES]Total Population: [total_players]" if(station_evacuated) - parts += "f<(B5)HA3j!nPQvLk9pr0vuTed@fNXO z1?Fb|$_T!g>BN2Iva*XaxZPY7SeQb2ooJ}zk33t6jD6j$GS~UNbWMKy$KJ1&?cJ-x z&tI)w@Ngvcgf*{N9sHRj-AD)u4>_ENu1ff34s}lta^4uukw8EZ(QdF4cQXd(EzkJe zw+EC?lRRrJ@;B0RI#Jm1>=|hfct4L7*vUQ--&jajHVq;+6U73uPk-MGE{px0H< ySFRR7D05qyDOPO1!;}JGy8~NAF*7*% nk4%MRS%1y1d)?uZQ5%FP-HqLXK6{VK4RiVH@B}&wA#xJBF-4r#Od>YJ| zQlz3 vWa%=9f`mDp6*$kYI9^gF5q+e8 `{h_ZFP$CbyEQ{7Y5L!A>Tq#B6Q9CC!wRceEro)%nww7co};`kp3Hjp zRsATI59S+=h-u@bh@c3M_ZF1d8Da`vd9Ji(b*!BVYg>SJ^azZ}>WCCSEWC!Tu4Pu) z@=D9HK%r#s(sz3L<8Z#spPUloM0+@jgI0#{ghpo<^)Le3idy!x&@kEF(>AOxY|h_J z=WJVXen;d^JU<)gI*!@m9AL5lz@BSeBLpc3@|*-HOnhi7CGI%gCVZb~9#@u9_OdNr zXEq$qsY#5H?oDFlk<9_}@u9`Bb^V`8*q`4Bk?joN+uGT=dCs?st|{!}d|CO;O5Yw! zJ+^q^m$W@@kj-M3{I*P#F1zoI`&jI7bxXW8(hE5CY6YR>rtj?X!Q7iU`LFBvTN2hM z&Mn(G^cAD;{rnowKjo*+yYWJ#p+V-gR6xkO*O`%Y=JbR#hoM5hd?97Z%#nYU29bz; z&ip(3`H! j=Tz7vV^gnOLJlT~beB88hxuYM}~b>e`@mhMBv zukoGzuIFaDCfyR}Pf=@vf*MTsg!c~m@HiK$=UKw?mA*%&kp`bk3hqQraGSD&WiGGb zS0wd(=)e!3jXu4^!1}t31fq^sHn&)+!TY}#7U#Vk@5FAO50=}Z?b$}9Q+!Lu4`)7> zJ6;?pX7HHJHk~2woNS=w4FtG}1&oA1xam_5A{5Hx@~>~%vZieMmsxX28UAe6UF5Is z+;eN%)b`(fG`YA%x9R842>|h=BQ66UV_rTHrFWb+^jWU)$(1#lay%JicbCh7@3bZD zOuezc&@eo++vU|?T$YkmZ!y=bRB=8ZStzqn#3t{=xhKB-+gsBfdxp^>m}npHJ2f7p zjcyh6EZrx0-@5h&J5?a0sAd31u53|K24L3dvp#wExw5h(Zo5~c=#}Kw`i0wk>j!0s z+qIrnitJ7cS23AIN0DhlYfDJ*{RsEr+grudKxvBc@=FJtEIo 8_-3b>WF^Dz0j;6Vc>v3n3Nxi@O_5hG7FmfN*f @%e#Z52NYV!Ah|#F(tU)d2w%ljV5;O+IAe^pH5&Q12f=IW$0Vnr&vRO|6R+{>p zFu^W%8Ni%-PvWpRj#?U_@&~XZt@Q-RQtZP~BSsEcBE^R*PhpSnfOgJ=TD9u>oF8=_ zsJzED%ri~PC3SytbCOVwsvqX)HfRk6H&X0>`ub}#{<*wCy`5bPba eyvqlw+`n-q6)p%W4=CZ>{@n z)Xy{)8N(;_jCl9;59U8Sh;x%tt`9fazGQ6zsuX~^G*68}Mi4L6iZ}i@>3q+A)tB zdq=5!GI2xVb@C2UrH7)kT@+e$JqVF<#?7yKY>KMtwzGQs8LNCRs*#+X8}8rF3lzl8 zy#K6@-WrX&=6mt3jxr<2v-bDso9B5^6579?zt_Mc9%k#&!pkF*jQdd@-SMj^$Azof zIC^PhYh%agJKebH!cYGXdBs(g`u%tIql>nWE)M0h5gT3~8&0<+gA6}Cs_>$s*U`g8 zQc3sR0C&lf^RIec+B_vpW%$5Tgk|~Kr;2N~RX9&(~k!0+#PoNyuo{BeI7+Sj;Nh zl-aP|yd&r5W!GajuT%VPsOG&lm00Z EyMs4RYxbE#Gf^; z02vXlLC}Zk;kLG;WBA4D?JqHJb)So6uv_`P(Qs$fXWjvL8Mz);1R>Ru-aGJ^m9Q61 z+ZnE`l%~3h$y>BFN0m&~(2z`q3TiW6yxL)8gU%;UdY~bGlJ5H!XtYQeiTOs!b@W1) zF1PREAHXBF?Un50iw6IL_13WMJa1wHty*m0Zms1k`NFFN#IGXrgp%Hu-bD-dW{kot zi;N|_5pA0k2~X`#Pu-lCA0-P?pU%uxYN0HG^Pe%(JC`>|aC$r$;2p{tRvHkzQ7*uq zNX>vg30V5_BB)%#KunMaU7(@W!=v+a-FrOuZGyg*;aBeDd)K7kzPp|#zE2PFj4JV| z4`5~ o-_jrBgTV&3_g{|+Ok<|uk*BevxRbI3xqA$0nkgweZ zm9bK!l|DwlR^~3*bq-lxRFJ&eP|;m?O$Z<_RQQl`IVQH)GBJ;k=J`>R>S=nhKy^Du zK$@d|dvj%bMjB@Jdt$){u^E}D)f4_m_tv(wxODI{o1J>TKt~ymV2kRXjHH9|_q)b- z-pZUda#OIWn{Lf^aq9*AnQoO!vkPz`Zj(#s^k}PFirFj|RBHNp{&95jt#!TkeW?wN zr#>x|qjw5-cw@PK6vuGN|ANPlp3H`_0qk(=Pet>0 o3cIh_z8Z00QsN z==`!4XP+*{llD8$W>XeAd=R&0s^B|$IJGob_IzA};`AXlKqea_r##AM+EC2)!n+?Z zb%Hi-Z8WDD&L4Mw`JO!CqU9yK-$owJ*-RoaFKJq`?@++mBz}0?v1sQ~LwJU|5y=eS zxJWm7yd9^`D~T5QP$=dA))90 DGgWH3K>Ur z7M8R5=PrJHKhzgBt$4<;7(}PSVGkWn@mZ}H`1!H_D9kFzB74qvE5{Z~F4y`)W2Hg> z J3T>Q3Q4yP`GUM+?wk%4We+nmJeZL6(q;U#{s`f}a}1mpsu zE{3s$Z3`x_rf})7ZzFS@Xz4-)KYzCfxAW`N{;^2W`P=DBk9Ql6o!CT8N6+GD-)NQ| zOHZ*xjgn)Xy-GXTq7t(;Tl{qW>I~xVc|?f*-(v;Lc?1qfMl1VA(KprRyG8j|e?<8D z`3IEe$KSDb@~N(E>*{W;^*j9?PRe=%K6L(_^eI1DOyv8Xl84A)=}}<6$e~`MLGuA~ zDu9EX;A5FDKP}$$0iwlx{=;g=oMWLRfJhn3x7J2$&AbMeO(uAj;#`p}vxg5Lu(-e4 zvaQ`k`P$ZYsEw{LH*)S6J=&W7Ttwm2Nqj2r>0-iRTgrmI!o*|KnJnW&rtzV2k>?Sw z43)2sA`)#YBk$PK@e=z?o@ul2_qF174kP9i;G?U$Wt>ck5F(28Ve{>hR4-dBb6QsY z2*N>q?ym}#o9Iow>z=-k>R)nX3cgSzKPXS?!P%k$m{o4(QI2@bwYnuf;yGnUHz`o4 zqQ=TC;q@?s9Il|s4{XRB6Q=V;f7zc!f)I<~`xA6K%oDXkpT$tlP2N6(>Y{YZ3BpzP zrPjVQ$5gk6wk&)T_KP{MyW>4R2%iindm3jeDE_sgB4~U5OvKP7F3r`qf(zBZo~KI3 z#Qeo@^Iqf3@p}b?f2;nZ(J#Lnu^-_XsF^&~R}GYk>} dRLcxF@vm+J6!i)SuwcNcJfqh#ipgbCK+8bgYI+Ft`=1N zJW|V2QCSBu=uRl!M0h_cGfNaIX=M)np=Ne52ww@wF4!ZpiCNwI!80$o8tKjUoc+FQ zywN4T;;@71#uIip{f@47HRO38a({e=^quRhvNV`abm3G2_buA?TTBzdZ->*I>ArWC z>be%CpBqY3UDS1wlZD9DHa_mT3ERAFNGhr9E!MC!2b(q5pq_7fSLW%2o}S*a_?gpq zSy!|mqts%|>vE=1v?A+qM6=<0^Mzuk;-0r{;g>iHCC7sTEC~G9#rX|tCe<5C8M2?h zT^ k?fAZaJ6~^&TTkDR7y*u{=`fB$Ne)r`@RzT 1mUZ*|#JKX7ik{JN6z6Yy8k} zsvHQV2@D`7qLv}UdkU5hdS4qN9_J%Xj$+?Q200JsjtbIhN7Iqk2e^4RP -S5t zkIp`|rl=k}g)oc{&nVKsi+4XKWp$)6+|j#7f3Dcz5g(OE2AFV{HY+F{X@|Gf2Hg$z zFD6*>)zw!W&0@hfGgo$QiZ#f^0v-^TMakT;J*;LD#tHZF-?^;)HBu{UM=mTA`{s52 z4YtTT!1HA487RbJJL&qo$hTss>RaVL*arP8|FPztwZpXN2d?rY+5%aO*Q6K5J6Q}i zJ@vkZ$Y;zBzNZK-@K)DtnvgmUYb|QXdLt0QIyJi6@AmHEc+j&s1qg|la!zo%-b1xe z@fK)HuM7@Yg_(0>GY~Gd=$|Z{VHIsov3gww(6{Tj0Ll7zz>^epWu@Lc-_vI&!ZmO4 zP=UI#I_^yVYLj`%7Sh3wWV2S>Z0|gFmZkq$*Au1iiqO>jJI>hy^-tpWeI~TBIz_2| z-chv}Q`AMobs=u8EeTGU5i;p=QiY2?bj9&D{O()3pTH>G3`?i44(*sB_C^4JXGEgA z`Gb3gq0%F1qK!Zm;@LZw9r55l?#Hg%i;qQWoncDYDaKAUDz9yNeHH3)0?#g2ZWBBq zO-`o+$VMBQq$_2O#9&Pva=$z1bBtnJb<5^A95>bt@!5tOzOo5Eo~|H$5SMCLf3f#1 zn*a01*PSE7O|NRxTnlu_B=yyA-^|i?w1Rs#);>->U@X#oR&gZf^^SCN16rA+H eKxCj}c=fh46q1=jErz!1LCx{LU0M#kZ;0EBB_GIIWUVJ%$O|pX^}S^kJHZiTKIv z934yJ-El4F#--$vTIAyE1ciIR-Jm&bc)Kza6 z&T7Z0o(_&&3Y`@!YdI>>!X37+<3L*;tUp@uO_?pt`LnCPcT{6p;bGd4Vo`q}r=5f1 zZCv=`|9YV^*8O@2&Hb=MTlRc)OUFW{Aa+H`hJNJbS=#=xZ#I%470H7jxyZK9*|lcf z9HdlMSQLnCc_JL^Q AtJ%8nAD(G)dM}K;1c5pD5eZ(jqevzNf8V}=Ukfn6?zs^6k z5=sE5F#UlW#Nrq}#6@)TZyY%6W;@4KZoNIK_OE}tt9G$a+3A%rMn-z{G~eU6{_`7{ zU4w&q?VX%EG79r`aU0#d0ch|$UO % z+$ztlHVKwHcABKS^ZUeRc)A-I#M~du#{{&&tj;&&vP^}Jn5yqn)iYh&wF>oi^ERms zwD$9rq6B~q)A8hm3+9{;JUD_2tP_F~l7aFAUG$$4%lv!~ZvsKw>fWqGo0SE_l2h%M zUJ4ZK&r(qiTmW-SfAv&_%_sHmOA|Y1f+(Iz{gj#Sq7&Hd-Jjs1k zH)dw?Q$KYF^$ &*@K^Rlue_lYXe9%wJV?;g)z~I_Y0Gj zHv8G=8$I+gahIUl;E&O`OmYk^GGdv++Y)M!2Cw{Z!S7@IEi@x9_Pu}`L|mV(f5yqe ze44+I&ybUMOZ4P @9TJG~^q17IeP1v*I@ViaY#WaCsmF z0GOy{e2(f^OZw%1#PD=>8`t^k+r`oD{%WESA?0YoiY(Ed*cv_CZJwE=F1kK=(zr%X zEt-*Oar<4zrwOtsxOAYt=1}sYdAjbY!bsIu;|hsFDZF foxm65p=I;FRC z=zN~wbEeIfmXXNq1~0A mTN3|+w8<+v>>Wo7TXHQwR74C+K_@IPHuXMgHZRP%9fZ|yDNuHgda z#-(rtCF&nuZ-c)bk;YyB^NaVpkCm!grg*yw-={zCsYCMCuDic9M}{|Jk>J?QjCXQ} zhVMI7Xa5<^aq3$dh+_^=a0<*I%%girK_>LI>$cKdW8&@3<6Y=& 9&n~M8y>^* z`Nwh8!a`h(%_9l-1|VGmxfpQ1x>;L9&D7-9*kY>LE#%7vFiQV~(T5>69xtI^pl@du zenv^YYCMtupfXxmS?TzwP^IK+bBFKuBN|N)>)#Vm*19 ELPbXg+IT;xB|IT zC_DJIRqZsgGfTeTy8l_Si-;w!WQKz!bBHapO|F_D!og=AmGs6|(whVsbevbiCR++{ zO($JuEmled&~7o`7#&Ec!`1zC{-p4W*u!{5cwZ;(4{He{!sqj+V>S^N=uLW}obU6W zdj`kkg8F}a9lD98!mdR{^5X-TND5SWZNIYqta$++Xpf@pSGe7%3f&Na6zx9<$sX~^ z`vCrSsz#%i<-uY@xY^g^8`AVIGj(#HVO=U4>cVU-i5;`?O$^MWjSP)4tj*#n3cig< zy4}xxEF51oH-UDqqJd|mA%?d!#8o^tA7N37U~@m5Uvf3K!%-WwL8BwE4;=^h#+g0G z z*>KD;`d(j+C0KlpcCzBS%zEqw?DURp(y7C8;O6}Tc;Mu|@f(}46X97qBGaj6Nv1YN zQtESwr#Oqg74jnKYCeN-!^g8XmYU`{7CD<7efmDJ9#M*#L$Y5z!}sT}n5>KqF2NFY zG6=efO}4BWdi}1;u5(wXRVm2@)bJVJB`)~0y{p3m+)DF*A0FU>WJ#L%2L8tq6HiNJ ztRUm)hVtk$aSnc7v~n;^?gs2>*0=8?QnwJu+i)PnWHrj=b?(z0u>o7=ahp0Lok{S2 z=w?jbHC7oQL~(Uz1W~>lGL56%zF6b71+bvKj?~Js@_8HUsTxc7uf66J%C5 K-0B4_K3~h~O-9;1}wc?P{zsNGxj8)BhkiO-{6@e9E zY??=gZbl{kc5)>-YHXFwE&NlBdZRJ=EGE`nR;z3@c=^D8+1Fmtrl6X*K*I_yh0JyD z+S;Ug=R6r9XzScPMQZB*Vedyyqmn&2UutS@F#6WL`lF38<+iptg_ylw@2XneM-S{K zy`eR<0*H%t!Jk&LH?u0*y%3&lOm2qEG)c|GB|g?0H0cE3=k2`OQ~Lei^Zh2tGJpK& zars_a-j$|x<84T+;cuKI&)k2t*%Dy2lVL3D{+b4Bsp3iWFX!*>9p2uSy538-3iY$Z zJxa;O6CJx_2AiT3V9fa$!}RipLPVhEP2ZIl8d^J3rKP1lRFJCm^4gWv3qie=SRMUa z#ciZcJx(i0lhR8&CgQlo4v9jXZN~|kp9T_?N@#cNN=&S+$RXWfS-xT%bqM%m@z!8& z>|1osdFh1p;_+ejWu?XE9+c6!!X({buLRNhgcLYpiN9`)l_jCludQKiVj~HKn#ka3 z!n;^h+D&^==&7F^lVZEi6#^!!_x6u}pSpRO_UzxCMf;@pD}~u?di$0HAbF26Iu5+5 zVPJ*xx@VEz+|?G}%xwH4q%G6H7#HyS`*WF)BoQ{SLJF%l)11i=(;gc|+z$Odo`se% pWs;`D5p2S0@3ws<+_X^pdv54w)3%PkL+EFbR5m=q=hpy|{{@sT7DWI6 literal 0 HcmV?d00001 From b099a01a6599e1d5b5809efe424933a32349f16e Mon Sep 17 00:00:00 2001 From: Fermi <> Date: Wed, 2 Oct 2019 11:06:00 +0100 Subject: [PATCH 011/150] Whats life without colour? --- .../browserassets/css/browserOutput.css | 3 +- code/modules/holiday/halloween.dm | 38 +++++------- code/modules/holiday/jacqueen.dm | 62 +++++++++++-------- goon/browserassets/css/browserOutput.css | 1 + interface/stylesheet.dm | 1 + tgstation.dme | 1 + 6 files changed, 59 insertions(+), 47 deletions(-) diff --git a/code/modules/goonchat/browserassets/css/browserOutput.css b/code/modules/goonchat/browserassets/css/browserOutput.css index 7b942494f4..e78c6f1606 100644 --- a/code/modules/goonchat/browserassets/css/browserOutput.css +++ b/code/modules/goonchat/browserassets/css/browserOutput.css @@ -17,7 +17,7 @@ body { line-height: 1.2; overflow-x: hidden; overflow-y: scroll; - word-wrap: break-word; + word-wrap: break-word; scrollbar-face-color:#1A1A1A; scrollbar-track-color:#171717; scrollbar-highlight-color:#171717; @@ -404,6 +404,7 @@ h1.alert, h2.alert {color: #99aab5;} .redtext {color: #c51e1e; font-size: 24px;} .clown {color: #ff70c1; font-size: 24px; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;} .his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;} +.spooky {color: #FF9100;} .velvet {color: #660015; font-weight: bold; animation: velvet 5000ms infinite;} @keyframes velvet { 0% { color: #400020; } diff --git a/code/modules/holiday/halloween.dm b/code/modules/holiday/halloween.dm index 7f2f6a785a..37099c1314 100644 --- a/code/modules/holiday/halloween.dm +++ b/code/modules/holiday/halloween.dm @@ -5,19 +5,27 @@ //spooky recipes -/datum/recipe/sugarcookie/spookyskull - reagents = list("flour" = 5, "sugar" = 5, "milk" = 5) - items = list( - /obj/item/reagent_containers/food/snacks/egg, +/datum/crafting_recipe/food/sugarcookie/spookyskull + time = 15 + name = "Sugar cookie" + reqs = list( + /datum/reagent/consumable/sugar = 5, + /obj/item/reagent_containers/food/snacks/pastrybase = 1 ) result = /obj/item/reagent_containers/food/snacks/sugarcookie/spookyskull + subcategory = CAT_PASTRY -/datum/recipe/sugarcookie/spookycoffin - reagents = list("flour" = 5, "sugar" = 5, "coffee" = 5) - items = list( - /obj/item/reagent_containers/food/snacks/egg, +/datum/crafting_recipe/food/sugarcookie/spookycoffin + time = 15 + name = "Sugar cookie" + reqs = list( + /datum/reagent/consumable/sugar = 5, + /datum/reagent/consumable/coffee = 5, + /obj/item/reagent_containers/food/snacks/pastrybase = 1 ) result = /obj/item/reagent_containers/food/snacks/sugarcookie/spookycoffin + subcategory = CAT_PASTRY + ////////////////////////////// //Spookoween trapped closets// @@ -34,7 +42,7 @@ var/trapped = 0 var/mob/trapped_mob -/obj/structure/closet/initialize() +/obj/structure/closet/Initialize() ..() if(prob(30)) set_spooky_trap() @@ -264,15 +272,3 @@ category = "Holiday" item = /obj/item/card/emag/halloween surplus = 0 - -//Jacq test -/mob/living/simple_animal/jacq - name = "Jacqueline" - real_name = "Jacqueline" - icon = 'icons/obj/halloween_items.dmi' - icon_state = "jacqueline" - maxHealth = 1e6 - health = 1e6 - speak_emote = list("croons") - emote_hear = list("spooks","giggles") - density = FALSE \ No newline at end of file diff --git a/code/modules/holiday/jacqueen.dm b/code/modules/holiday/jacqueen.dm index e6bce4fc40..131f2243e2 100644 --- a/code/modules/holiday/jacqueen.dm +++ b/code/modules/holiday/jacqueen.dm @@ -1,44 +1,51 @@ //Whacha doing in here like? Yae wan tae ruin ta magicks? /mob/living/jacq - name = "Jacqueline" + name = "Jacqueline the Pumpqueen" real_name = "Jacqueline" icon = 'icons/obj/halloween_items.dmi' icon_state = "jacqueline" maxHealth = INFINITY health = 20 - speak_emote = list("croons") - emote_hear = list("spooks","giggles") density = FALSE - var/destinations = list("Bar", "Brig", "Bridge", "Chapel", "Chemistry", "Cyrogenics", "Engineering", "Xenobiology") - var/tricked = list() //Those who have been tricked + var/destinations = list("Bar", "Brig", "Bridge", "Chapel", "Chemistry", "Cyrogenics", "Engineering", "Xenobiology") + var/tricked = list() //Those who have been tricked var/progression = list() //Keep track of where people are in the story. -/mob/living/jacq/proc/Destroy() //I.e invincible - visible_message("[src] cackles, \"You'll nae get rid a me that easily!\"") +/mob/living/jacq/Destroy() //I.e invincible + visible_message("[src] cackles, \"You'll nae get rid a me that easily!\"") playsound(loc, 'sound/spookoween/ahaha.ogg', 100, 1) - var/mob/living/Jacq = new src(loc) + var/mob/living/jacq/Jacq = new src.type(loc) Jacq.tricked = tricked Jacq.progression = progression Jacq.poof() ..() /mob/living/jacq/death() //What is alive may never die - visible_message("[src] cackles, \"You'll nae get rid a me that easily!\"") + visible_message("[src] cackles, \"You'll nae get rid a me that easily!\"") playsound(loc, 'sound/spookoween/ahaha.ogg', 100, 1) health = 20 poof() /mob/living/jacq/proc/poof() - var/area/A = GLOB.sortedAreas["[pick(destinations)]"] - if(A && istype(A)) - if(M.forceMove(safepick(get_area_turfs(A)))) + var/datum/reagents/R = new/datum/reagents(100)//Hey, just in case. + var/datum/effect_system/smoke_spread/chem/s = new() + R.add_reagent("secretcatchem", (10)) + s.set_up(R, 2, loc) + s.start() + + for(var/i = 1, i <= 5, i+=1)//try 5 times to teleport + var/area/A = GLOB.sortedAreas["[pick(destinations)]"] + if(A && istype(A)) + if(forceMove(safepick(get_area_turfs(A)))) + return TRUE + return FALSE + //Ye wee bugger, gerrout of it. Ye've nae tae enjoy reading the code fer mae secrets like. -/mob/living/jacq/proc/chit_chat(var/mob/living/L) - if(istype(L, mob/living/carbon)) - var/mob/living/carbon/C = L +/mob/living/jacq/proc/chit_chat(mob/living/L) + var/mob/living/carbon/C = L //Very important var/gender = "lamb" @@ -49,37 +56,42 @@ gender = "lassie" if(!progression[C]) - visible_message("[src] smiles ominously at [L], \”Well halò there [gender]! Ah’m Jacqueline, tae great Pumpqueen, right in tae flesh fer ye.”") + visible_message("[src] smiles ominously at [L], \"Well hal� there [gender]! Ah�m Jacqueline, tae great Pumpqueen, right in tae flesh fer ye.\"") sleep(20) - visible_message("[src] smiles ominously at [L], \”Well halò there [gender]! Ah’m Jacqueline, tae great Pumpqueen, right in tae flesh fer ye.”") + visible_message("[src] smiles ominously at [L], \"Well hal� there [gender]! Ah�m Jacqueline, tae great Pumpqueen, right in tae flesh fer ye.\"") var/choices = list("Trick", "Treat") - var/choice = input(usr, "Trick or Treat?", "Trick or Treat?") in choices + var/choice = input(usr, "Trick or Treat?", "Trick or Treat?") in choices switch(choice) if("Trick") - L. + return if("Treat") + return -/mob/living/jacq/proc/check_candies(var/mob/living/carbon/C) - var/inv = C.get_contents() +/mob/living/jacq/proc/check_candies(mob/living/carbon/C) + var/invs = C.get_contents() var/candy_count = 0 - for(var/item in inv) + for(var/item in invs) if(istype(item, /obj/item/reagent_containers/food/snacks/special_candy)) candy_count++ return candy_count -/mob/living/jacq/proc/take_candies(var/mob/living/carbon/C, amount) +/mob/living/jacq/proc/take_candies(mob/living/carbon/C, candy_amount = 1) var/inv = C.get_contents() var/candies = list() for(var/item in inv) if(istype(item, /obj/item/reagent_containers/food/snacks/special_candy)) candies += item - if(LAZYLEN(candy_count) == amount) + if(LAZYLEN(candies) == candy_amount) for(var/candy in candies) qdel(candy) return TRUE return FALSE /mob/living/jacq/proc/trick() - var/ //var/area/A = input(usr, "Pick an area.", "Pick an area") in GLOB.sortedAreas|null + + +//Candies +/obj/item/reagent_containers/food/snacks/special_candy + name = "Magic candy" diff --git a/goon/browserassets/css/browserOutput.css b/goon/browserassets/css/browserOutput.css index 58129ac1cb..5ed60b1d0a 100644 --- a/goon/browserassets/css/browserOutput.css +++ b/goon/browserassets/css/browserOutput.css @@ -393,6 +393,7 @@ h1.alert, h2.alert {color: #000000;} .redtext {color: #FF0000; font-size: 24px;} .clown {color: #FF69Bf; font-size: 24px; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;} .his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;} +.spooky {color: #FF9100;} .velvet {color: #660015; font-weight: bold; animation: velvet 5000ms infinite;} @keyframes velvet { 0% { color: #400020; } diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm index 2ecd9f9004..c51778bbdb 100644 --- a/interface/stylesheet.dm +++ b/interface/stylesheet.dm @@ -153,6 +153,7 @@ h1.alert, h2.alert {color: #000000;} .redtext {color: #FF0000; font-size: 3;} .clown {color: #FF69Bf; font-size: 3; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;} .his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;} +.spooky {color: #FF9100;} .velvet {color: #660015; font-weight: bold; animation: velvet 5000ms infinite;} @keyframes velvet { 0% { color: #400020; } diff --git a/tgstation.dme b/tgstation.dme index 92ff049a91..3cc8ed3b26 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -1700,6 +1700,7 @@ #include "code\modules\holiday\easter.dm" #include "code\modules\holiday\halloween.dm" #include "code\modules\holiday\holidays.dm" +#include "code\modules\holiday\jacqueen.dm" #include "code\modules\holodeck\area_copy.dm" #include "code\modules\holodeck\computer.dm" #include "code\modules\holodeck\holo_effect.dm" From 8686633cc5502bd1fc3d8d10384388f83a5e7ebe Mon Sep 17 00:00:00 2001 From: Fermi <> Date: Wed, 2 Oct 2019 19:35:36 +0100 Subject: [PATCH 012/150] Changing branch --- code/modules/holiday/jacqueen.dm | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/code/modules/holiday/jacqueen.dm b/code/modules/holiday/jacqueen.dm index 131f2243e2..d1883df0d2 100644 --- a/code/modules/holiday/jacqueen.dm +++ b/code/modules/holiday/jacqueen.dm @@ -13,7 +13,7 @@ /mob/living/jacq/Destroy() //I.e invincible - visible_message("[src] cackles, \"You'll nae get rid a me that easily!\"") + visible_message("[src] cackles, \"You'll nae get rid a me that easily!\"") playsound(loc, 'sound/spookoween/ahaha.ogg', 100, 1) var/mob/living/jacq/Jacq = new src.type(loc) Jacq.tricked = tricked @@ -22,7 +22,7 @@ ..() /mob/living/jacq/death() //What is alive may never die - visible_message("[src] cackles, \"You'll nae get rid a me that easily!\"") + visible_message("[src] cackles, \"You'll nae get rid a me that easily!\"") playsound(loc, 'sound/spookoween/ahaha.ogg', 100, 1) health = 20 poof() @@ -56,7 +56,7 @@ gender = "lassie" if(!progression[C]) - visible_message("[src] smiles ominously at [L], \"Well hal� there [gender]! Ah�m Jacqueline, tae great Pumpqueen, right in tae flesh fer ye.\"") + visible_message("[src] smiles ominously at [L], \"Well hal� there [gender]! Ah�m Jacqueline, tae great Pumpqueen, right in tae flesh fer ye.\"") sleep(20) visible_message("[src] smiles ominously at [L], \"Well hal� there [gender]! Ah�m Jacqueline, tae great Pumpqueen, right in tae flesh fer ye.\"") @@ -95,3 +95,7 @@ //Candies /obj/item/reagent_containers/food/snacks/special_candy name = "Magic candy" + +/obj/item/reagent_containers/food/snacks/special_candy/Initialize() + reagents.add_reagent(get_random_reagent_id(), 5) + ..() From d706944e20a9027f818a2cd0d0c496ab4d73e9ea Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Sat, 5 Oct 2019 04:37:01 +0200 Subject: [PATCH 013/150] The niche singularity beacon now also moderately buffs meteor waves. --- code/game/machinery/syndicatebeacon.dm | 14 ++++++++++++++ code/modules/events/meteor_wave.dm | 8 ++++++++ code/modules/uplink/uplink_items.dm | 7 ++++--- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm index a1ed7fb848..cacc109793 100644 --- a/code/game/machinery/syndicatebeacon.dm +++ b/code/game/machinery/syndicatebeacon.dm @@ -1,3 +1,7 @@ +GLOBAL_INIT_LIST(singularity_beacons) + +#define METEOR_DISASTER_MODIFIER 0.5 + //////////////////////////////////////// //Singularity beacon //////////////////////////////////////// @@ -18,11 +22,16 @@ var/icontype = "beacon" + + /obj/machinery/power/singularity_beacon/proc/Activate(mob/user = null) if(surplus() < 1500) if(user) to_chat(user, "The connected wire doesn't have enough current.") return + GLOB.singularity_beacons += src + for(var/datum/round_event_control/meteor_wave/W in SSevents.control) + W.weight += round(initial(W.weight) * METEOR_DISASTER_MODIFIER)) for(var/obj/singularity/singulo in GLOB.singularities) if(singulo.z == z) singulo.target = src @@ -40,6 +49,9 @@ active = 0 if(user) to_chat(user, "You deactivate the beacon.") + GLOB.singularity_beacons -= src + for(var/datum/round_event_control/meteor_wave/W in SSevents.control) + W.weight -= round(initial(W.weight) * METEOR_DISASTER_MODIFIER)) /obj/machinery/power/singularity_beacon/attack_ai(mob/user) @@ -133,3 +145,5 @@ /obj/item/sbeacondrop/clownbomb desc = "A label on it reads: Warning: Activating this device will send a silly explosive to your location." droptype = /obj/machinery/syndicatebomb/badmin/clown + +#undef METEOR_DISASTER_MODIFIER diff --git a/code/modules/events/meteor_wave.dm b/code/modules/events/meteor_wave.dm index af22ae3b96..fc10b5ac90 100644 --- a/code/modules/events/meteor_wave.dm +++ b/code/modules/events/meteor_wave.dm @@ -1,5 +1,8 @@ // Normal strength +#define SINGULO_BEACON_DISTURBANCE 0.2 //singularity beacon also improve the odds of meteor waves and speed them up a little. +#define SINGULO_BEACON_MAX_DISTURBANCE 0.6 //maximum cap due to how meteor waves can be potentially round ending. + /datum/round_event_control/meteor_wave name = "Meteor Wave: Normal" typepath = /datum/round_event/meteor_wave @@ -18,6 +21,8 @@ /datum/round_event/meteor_wave/setup() announceWhen = 1 startWhen = rand(300, 600) //Yeah for SOME REASON this is measured in seconds and not deciseconds??? + if(GLOB.singularity_beacons.len) + startWhen *= 1 - min(GLOB.singularity_beacons.len * SINGULO_BEACON_DISTURBANCE, SINGULO_BEACON_MAX_DISTURBANCE) endWhen = startWhen + 60 @@ -79,3 +84,6 @@ /datum/round_event/meteor_wave/catastrophic wave_name = "catastrophic" + +#undef SINGULO_BEACON_DISTURBANCE +#undef SINGULO_BEACON_MAX_DISTURBANCE diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index 09e955d2f9..c7cc7d59e8 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -1487,9 +1487,10 @@ datum/uplink_item/stealthy_weapons/taeclowndo_shoes /datum/uplink_item/device_tools/singularity_beacon name = "Power Beacon" desc = "When screwed to wiring attached to an electric grid and activated, this large device pulls any \ - active gravitational singularities or tesla balls towards it. This will not work when the engine is still \ - in containment. Because of its size, it cannot be carried. Ordering this \ - sends you a small beacon that will teleport the larger beacon to your location upon activation." + active gravitational singularities or tesla balls towards it (provided they are not safely \ + contained), as well as increasing the odds of incoming meteor waves. \ + Because of its size, it cannot be carried. Ordering this sends you a small beacon \ + that will teleport the larger beacon to your location upon activation." item = /obj/item/sbeacondrop cost = 14 From 35a69913008073ecfe2c9919159deb46b817b4b6 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Sat, 5 Oct 2019 05:14:38 +0200 Subject: [PATCH 014/150] lone rogue parenthesis --- code/game/machinery/syndicatebeacon.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm index cacc109793..175a3f72ec 100644 --- a/code/game/machinery/syndicatebeacon.dm +++ b/code/game/machinery/syndicatebeacon.dm @@ -31,7 +31,7 @@ GLOBAL_INIT_LIST(singularity_beacons) return GLOB.singularity_beacons += src for(var/datum/round_event_control/meteor_wave/W in SSevents.control) - W.weight += round(initial(W.weight) * METEOR_DISASTER_MODIFIER)) + W.weight += round(initial(W.weight) * METEOR_DISASTER_MODIFIER) for(var/obj/singularity/singulo in GLOB.singularities) if(singulo.z == z) singulo.target = src @@ -51,7 +51,7 @@ GLOBAL_INIT_LIST(singularity_beacons) to_chat(user, "You deactivate the beacon.") GLOB.singularity_beacons -= src for(var/datum/round_event_control/meteor_wave/W in SSevents.control) - W.weight -= round(initial(W.weight) * METEOR_DISASTER_MODIFIER)) + W.weight -= round(initial(W.weight) * METEOR_DISASTER_MODIFIER) /obj/machinery/power/singularity_beacon/attack_ai(mob/user) From 52fb4b03ac30d80035c89c3788d0b93905ec9ef4 Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Sat, 5 Oct 2019 05:29:57 +0200 Subject: [PATCH 015/150] we are only keeping track of the number of singu beacons, var more efficient. --- code/game/machinery/syndicatebeacon.dm | 6 +++--- code/modules/events/meteor_wave.dm | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm index 175a3f72ec..3fb78ad37f 100644 --- a/code/game/machinery/syndicatebeacon.dm +++ b/code/game/machinery/syndicatebeacon.dm @@ -1,4 +1,4 @@ -GLOBAL_INIT_LIST(singularity_beacons) +GLOBAL_VAR_INIT(singularity_counter, 0) #define METEOR_DISASTER_MODIFIER 0.5 @@ -29,7 +29,7 @@ GLOBAL_INIT_LIST(singularity_beacons) if(user) to_chat(user, "The connected wire doesn't have enough current.") return - GLOB.singularity_beacons += src + GLOB.singularity_counter++ for(var/datum/round_event_control/meteor_wave/W in SSevents.control) W.weight += round(initial(W.weight) * METEOR_DISASTER_MODIFIER) for(var/obj/singularity/singulo in GLOB.singularities) @@ -49,7 +49,7 @@ GLOBAL_INIT_LIST(singularity_beacons) active = 0 if(user) to_chat(user, "You deactivate the beacon.") - GLOB.singularity_beacons -= src + GLOB.singularity_counter-- for(var/datum/round_event_control/meteor_wave/W in SSevents.control) W.weight -= round(initial(W.weight) * METEOR_DISASTER_MODIFIER) diff --git a/code/modules/events/meteor_wave.dm b/code/modules/events/meteor_wave.dm index fc10b5ac90..6f01caa275 100644 --- a/code/modules/events/meteor_wave.dm +++ b/code/modules/events/meteor_wave.dm @@ -21,8 +21,8 @@ /datum/round_event/meteor_wave/setup() announceWhen = 1 startWhen = rand(300, 600) //Yeah for SOME REASON this is measured in seconds and not deciseconds??? - if(GLOB.singularity_beacons.len) - startWhen *= 1 - min(GLOB.singularity_beacons.len * SINGULO_BEACON_DISTURBANCE, SINGULO_BEACON_MAX_DISTURBANCE) + if(GLOB.singularity_counter) + startWhen *= 1 - min(GLOB.singularity_counter * SINGULO_BEACON_DISTURBANCE, SINGULO_BEACON_MAX_DISTURBANCE) endWhen = startWhen + 60 From 3f21c0af5ba12fe33229b29e5b62949e85604012 Mon Sep 17 00:00:00 2001 From: Thalpy <48600475+ThalpySci@users.noreply.github.com> Date: Sun, 6 Oct 2019 00:32:42 +0100 Subject: [PATCH 016/150] Text --- code/modules/holiday/jacqueen.dm | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/code/modules/holiday/jacqueen.dm b/code/modules/holiday/jacqueen.dm index d1883df0d2..ec9acefe2a 100644 --- a/code/modules/holiday/jacqueen.dm +++ b/code/modules/holiday/jacqueen.dm @@ -68,6 +68,34 @@ if("Treat") return +/* +visible_message("[src] smiles ominously at [L], ”Well halò there [gender]! Ah’m Jacqueline, tae great Pumpqueen, right in tae flesh fer ye.”") +says, ”Ah’m sure yae well stunned, but ah’ve got nae taem fer that. Ah’m after yer candies. If yae get mae enoof o the wee buggers, I’ll give you a treat, or if yae feeling bold, Ah ken trick ye instaed.” giving [L] a wide grin. + +Why do you want the candies? +”Have you tried them? They’re full of all sorts of reagents. I’m after them so I can magic them up and hopefully find some rare stuff for me brews. Honestly it’s a lot cheaper magicking up tatt for you lot than sending a familiar off to pick them up for me. Most of my familiars are funny fellows and constantly go off on adventures when given simple objectives like; Go grab me a tea cake or watch over me cauldron. I mean, you might run into Bernkastel my cat. She’s supposed to be tending my cauldron, but I’ve no idea where she’s got to. +What is that on your head? +Points at the pumpkin atop her head, ”This thing? This isn’t any ordinary pumpkin! My mother grew this monster over a year of love, dedication and hard work. Honestly it felt like she loved this thing more than she any of her kids, which I know isn’t true and it’s not like she was heartless or anything but.. well, we had a falling out when I got back home with all me stuff in tow. And all she had done is sent me owl after owl over the last year about this bloody pumpkin and I had enough. So I took it, and put it on my head. You know, as you do. I am the great Pumpqueen after all, I deserve this. +Isn’t it a bit far to get candy? +looks to the side sheepishly, ”Aye, well, tae be honest, Ah’m here tae see me sis, but dunnae let her knew that. She’s an alchemist too like, but she dunnae use a caldron like mae, she buggered off like to her posh ivory tower tae learn bloody chemistry instead!” [src] scowls, “She’s tae black sheep o’ the family too, so we dunnae see eye to eye sometimes on alchemy. Ah mean, she puts moles in her brews! Ye dunnae put moles in yer brews! Yae threw your brews at tae wee bastards an blew em up!” [src] sighs ”But she’s a heart o gold so.. Ah wanted tae see her an check up oon her, make sure she’s okay.” +Are you a witch? +grumbles
[GLOB.TAB]Evacuation Rate: [popcount[POPCOUNT_ESCAPEES]] ([PERCENT(popcount[POPCOUNT_ESCAPEES]/total_players)]%)" - parts += "[GLOB.TAB](on emergency shuttle): [popcount[POPCOUNT_SHUTTLE_ESCAPEES]] ([PERCENT(popcount[POPCOUNT_SHUTTLE_ESCAPEES]/total_players)]%)" - parts += "[GLOB.TAB]Survival Rate: [popcount[POPCOUNT_SURVIVORS]] ([PERCENT(popcount[POPCOUNT_SURVIVORS]/total_players)]%)" + parts += "
[FOURSPACES]Evacuation Rate: [popcount[POPCOUNT_ESCAPEES]] ([PERCENT(popcount[POPCOUNT_ESCAPEES]/total_players)]%)" + parts += "[FOURSPACES](on emergency shuttle): [popcount[POPCOUNT_SHUTTLE_ESCAPEES]] ([PERCENT(popcount[POPCOUNT_SHUTTLE_ESCAPEES]/total_players)]%)" + parts += "[FOURSPACES]Survival Rate: [popcount[POPCOUNT_SURVIVORS]] ([PERCENT(popcount[POPCOUNT_SURVIVORS]/total_players)]%)" if(SSblackbox.first_death) var/list/ded = SSblackbox.first_death if(ded.len) - parts += "[GLOB.TAB]First Death: [ded["name"]], [ded["role"]], at [ded["area"]]. Damage taken: [ded["damage"]].[ded["last_words"] ? " Their last words were: \"[ded["last_words"]]\"" : ""]" + parts += "[FOURSPACES]First Death: [ded["name"]], [ded["role"]], at [ded["area"]]. Damage taken: [ded["damage"]].[ded["last_words"] ? " Their last words were: \"[ded["last_words"]]\"" : ""]" //ignore this comment, it fixes the broken sytax parsing caused by the " above else - parts += "[GLOB.TAB]Nobody died this shift!" + parts += "[FOURSPACES]Nobody died this shift!" if(istype(SSticker.mode, /datum/game_mode/dynamic)) var/datum/game_mode/dynamic/mode = SSticker.mode - parts += "[GLOB.TAB]Threat level: [mode.threat_level]" - parts += "[GLOB.TAB]Threat left: [mode.threat]" - parts += "[GLOB.TAB]Executed rules:" + parts += "[FOURSPACES]Threat level: [mode.threat_level]" + parts += "[FOURSPACES]Threat left: [mode.threat]" + parts += "[FOURSPACES]Executed rules:" for(var/datum/dynamic_ruleset/rule in mode.executed_rules) - parts += "[GLOB.TAB][GLOB.TAB][rule.ruletype] - [rule.name]: -[rule.cost] threat" + parts += "[FOURSPACES][FOURSPACES][rule.ruletype] - [rule.name]: -[rule.cost] threat" return parts.Join("
") /client/proc/roundend_report_file() diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm index e7b2ae6cbe..037e5067d8 100644 --- a/code/_globalvars/misc.dm +++ b/code/_globalvars/misc.dm @@ -6,8 +6,6 @@ GLOBAL_VAR_INIT(timezoneOffset, 0) // The difference betwen midnight (of the hos // However it'd be ok to use for accessing attack logs and such too, which are even laggier. GLOBAL_VAR_INIT(fileaccess_timer, 0) -GLOBAL_VAR_INIT(TAB, " ") - GLOBAL_DATUM_INIT(data_core, /datum/datacore, new) GLOBAL_VAR_INIT(CELLRATE, 0.002) // conversion ratio between a watt-tick and kilojoule diff --git a/code/controllers/subsystem/chat.dm b/code/controllers/subsystem/chat.dm new file mode 100644 index 0000000000..37e53e8990 --- /dev/null +++ b/code/controllers/subsystem/chat.dm @@ -0,0 +1,67 @@ +SUBSYSTEM_DEF(chat) + name = "Chat" + flags = SS_TICKER|SS_NO_INIT + wait = 1 + priority = FIRE_PRIORITY_CHAT + init_order = INIT_ORDER_CHAT + var/list/payload = list() + + +/datum/controller/subsystem/chat/fire() + for(var/i in payload) + var/client/C = i + C << output(payload[C], "browseroutput:output") + payload -= C + + if(MC_TICK_CHECK) + return + + +/datum/controller/subsystem/chat/proc/queue(target, message, handle_whitespace = TRUE) + if(!target || !message) + return + + if(!istext(message)) + stack_trace("to_chat called with invalid input type") + return + + if(target == world) + target = GLOB.clients + + //Some macros remain in the string even after parsing and fuck up the eventual output + message = replacetext(message, "\improper", "") + message = replacetext(message, "\proper", "") + if(handle_whitespace) + message = replacetext(message, "\n", "
") + message = replacetext(message, "\t", "[FOURSPACES][FOURSPACES]") + message += "
" + + + //url_encode it TWICE, this way any UTF-8 characters are able to be decoded by the Javascript. + //Do the double-encoding here to save nanoseconds + var/twiceEncoded = url_encode(url_encode(message)) + + if(islist(target)) + for(var/I in target) + var/client/C = CLIENT_FROM_VAR(I) //Grab us a client if possible + + if(!C?.chatOutput || C.chatOutput.broken) //A player who hasn't updated his skin file. + continue + + if(!C.chatOutput.loaded) //Client still loading, put their messages in a queue + C.chatOutput.messageQueue += message + continue + + payload[C] += twiceEncoded + + else + var/client/C = CLIENT_FROM_VAR(target) //Grab us a client if possible + + if(!C?.chatOutput || C.chatOutput.broken) //A player who hasn't updated his skin file. + return + + if(!C.chatOutput.loaded) //Client still loading, put their messages in a queue + C.chatOutput.messageQueue += message + return + + payload[C] += twiceEncoded diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 91fdc78d20..4e58a9cba5 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -413,9 +413,9 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) dat += "CLOSED" else dat += "UNKNOWN" - dat += "[GLOB.TAB][TicketHref("Refresh", ref_src)][GLOB.TAB][TicketHref("Re-Title", ref_src, "retitle")]" + dat += "[FOURSPACES][TicketHref("Refresh", ref_src)][FOURSPACES][TicketHref("Re-Title", ref_src, "retitle")]" if(state != AHELP_ACTIVE) - dat += "[GLOB.TAB][TicketHref("Reopen", ref_src, "reopen")]" + dat += "[FOURSPACES][TicketHref("Reopen", ref_src, "reopen")]" dat += "
Opened at: [GAMETIMESTAMP("hh:mm:ss", closed_at)] (Approx [DisplayTimeText(world.time - opened_at)] ago)" if(closed_at) dat += "
Closed at: [GAMETIMESTAMP("hh:mm:ss", closed_at)] (Approx [DisplayTimeText(world.time - closed_at)] ago)" @@ -423,7 +423,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) if(initiator) dat += "Actions: [FullMonty(ref_src)]
" else - dat += "DISCONNECTED[GLOB.TAB][ClosureLinks(ref_src)]
" + dat += "DISCONNECTED[FOURSPACES][ClosureLinks(ref_src)]
" dat += "
Log:
" for(var/I in _interactions) dat += "[I]
" diff --git a/code/modules/antagonists/devil/devil.dm b/code/modules/antagonists/devil/devil.dm index 3f2bd003a3..dc649025d2 100644 --- a/code/modules/antagonists/devil/devil.dm +++ b/code/modules/antagonists/devil/devil.dm @@ -539,10 +539,10 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master", var/list/parts = list() parts += "The devil's true name is: [truename]" parts += "The devil's bans were:" - parts += "[GLOB.TAB][GLOB.lawlorify[LORE][ban]]" - parts += "[GLOB.TAB][GLOB.lawlorify[LORE][bane]]" - parts += "[GLOB.TAB][GLOB.lawlorify[LORE][obligation]]" - parts += "[GLOB.TAB][GLOB.lawlorify[LORE][banish]]" + parts += "[FOURSPACES][GLOB.lawlorify[LORE][ban]]" + parts += "[FOURSPACES][GLOB.lawlorify[LORE][bane]]" + parts += "[FOURSPACES][GLOB.lawlorify[LORE][obligation]]" + parts += "[FOURSPACES][GLOB.lawlorify[LORE][banish]]" return parts.Join("
") /datum/antagonist/devil/roundend_report() diff --git a/code/modules/goonchat/browserOutput.dm b/code/modules/goonchat/browserOutput.dm index 082f20f524..72e0576f4c 100644 --- a/code/modules/goonchat/browserOutput.dm +++ b/code/modules/goonchat/browserOutput.dm @@ -181,8 +181,8 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico log_world("\[[time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")]\] Client: [(src.owner.key ? src.owner.key : src.owner)] triggered JS error: [error]") //Global chat procs -/proc/to_chat(target, message, handle_whitespace=TRUE) - if(!target) +/proc/to_chat_immediate(target, message, handle_whitespace=TRUE) + if(!target || !message) return //Ok so I did my best but I accept that some calls to this will be for shit like sound and images @@ -204,7 +204,7 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico message = replacetext(message, "\proper", "") if(handle_whitespace) message = replacetext(message, "\n", "
") - message = replacetext(message, "\t", "[GLOB.TAB][GLOB.TAB]") + message = replacetext(message, "\t", "[FOURSPACES][FOURSPACES]") if(islist(target)) // Do the double-encoding outside the loop to save nanoseconds @@ -247,6 +247,11 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico // url_encode it TWICE, this way any UTF-8 characters are able to be decoded by the Javascript. C << output(url_encode(url_encode(message)), "browseroutput:output") +/proc/to_chat(target, message, handle_whitespace = TRUE) + if(Master.current_runlevel == RUNLEVEL_INIT || !SSchat?.initialized) + to_chat_immediate(target, message, handle_whitespace) + return + SSchat.queue(target, message, handle_whitespace) /datum/chatOutput/proc/swaptolightmode() //Dark mode light mode stuff. Yell at KMC if this breaks! (See darkmode.dm for documentation) owner.force_white_theme() diff --git a/tgstation.dme b/tgstation.dme index cceeb1f915..8b5ea81313 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -231,6 +231,7 @@ #include "code\controllers\subsystem\atoms.dm" #include "code\controllers\subsystem\augury.dm" #include "code\controllers\subsystem\blackbox.dm" +#include "code\controllers\subsystem\chat.dm" #include "code\controllers\subsystem\communications.dm" #include "code\controllers\subsystem\dbcore.dm" #include "code\controllers\subsystem\dcs.dm" From 9ee1987dec41ef91ff44a4216a376e69fd4d990e Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Tue, 8 Oct 2019 20:04:08 +0200 Subject: [PATCH 021/150] Applying kevinz' ominous warning suggestion --- code/game/machinery/syndicatebeacon.dm | 14 ++++++++++---- code/modules/events/meteor_wave.dm | 2 +- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm index 3fb78ad37f..67c9627423 100644 --- a/code/game/machinery/syndicatebeacon.dm +++ b/code/game/machinery/syndicatebeacon.dm @@ -25,10 +25,12 @@ GLOBAL_VAR_INIT(singularity_counter, 0) /obj/machinery/power/singularity_beacon/proc/Activate(mob/user = null) + if(active) + return FALSE if(surplus() < 1500) if(user) to_chat(user, "The connected wire doesn't have enough current.") - return + return FALSE GLOB.singularity_counter++ for(var/datum/round_event_control/meteor_wave/W in SSevents.control) W.weight += round(initial(W.weight) * METEOR_DISASTER_MODIFIER) @@ -36,22 +38,26 @@ GLOBAL_VAR_INIT(singularity_counter, 0) if(singulo.z == z) singulo.target = src icon_state = "[icontype]1" - active = 1 + active = TRUE if(user) to_chat(user, "You activate the beacon.") + return TRUE -/obj/machinery/power/singularity_beacon/proc/Deactivate(mob/user = null) +/obj/machinery/power/singularity_beacon/proc/Deactivate(mob/user) + if(!active) + return FALSE for(var/obj/singularity/singulo in GLOB.singularities) if(singulo.target == src) singulo.target = null icon_state = "[icontype]0" - active = 0 + active = FALSE if(user) to_chat(user, "You deactivate the beacon.") GLOB.singularity_counter-- for(var/datum/round_event_control/meteor_wave/W in SSevents.control) W.weight -= round(initial(W.weight) * METEOR_DISASTER_MODIFIER) + return TRUE /obj/machinery/power/singularity_beacon/attack_ai(mob/user) diff --git a/code/modules/events/meteor_wave.dm b/code/modules/events/meteor_wave.dm index 6f01caa275..4584d1c2e9 100644 --- a/code/modules/events/meteor_wave.dm +++ b/code/modules/events/meteor_wave.dm @@ -57,7 +57,7 @@ kill() /datum/round_event/meteor_wave/announce(fake) - priority_announce("Meteors have been detected on collision course with the station. Estimated time until impact: [round(startWhen/60)] minutes.", "Meteor Alert", 'sound/ai/meteors.ogg') + priority_announce("Meteors have been detected on collision course with the station. Estimated time until impact: [round(startWhen/60)] minutes.[GLOB.singularity_counter ? " Warning: Anomalous gravity pulse detected, Syndicate technology interference likely.", ""]", "Meteor Alert", 'sound/ai/meteors.ogg') /datum/round_event/meteor_wave/tick() if(ISMULTIPLE(activeFor, 3)) From 9071826e702e1faca018b399fca397c943d50681 Mon Sep 17 00:00:00 2001 From: Fermi <> Date: Wed, 9 Oct 2019 08:34:16 +0100 Subject: [PATCH 022/150] I can't focus --- code/modules/holiday/jacqueen.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/holiday/jacqueen.dm b/code/modules/holiday/jacqueen.dm index c99af41ab5..e12ce7cf5b 100644 --- a/code/modules/holiday/jacqueen.dm +++ b/code/modules/holiday/jacqueen.dm @@ -227,7 +227,7 @@ C.reagents.add_reagent("secretcatchem", 30) if(7) visible_message("[src] waves their arms around, \"While you may not be a ghost, for this sheet you'll always be it's host.\"") - C.place_on_head(new /obj/item/bedsheet/sticky(C)) + C.place_on_head(new /obj/item/clothing/suit/ghost_sheet/sticky(C)) /*Will you go on a date with me? ”…You want tae ask me oot on a date? Me? After all that nonsense Ah just said? It seems a waste of a candy honestly.” @@ -242,7 +242,7 @@ visible_message("[src] cackles, "You'll nae get rid (the last message is if I can't get a ghost/a person in it) */ -/obj/item/bedsheet/sticky +/obj/item/clothing/suit/ghost_sheet/sticky item_flags = NODROP var/datum/reagent/mutationtoxin/pumpkinhead From 1dce18962dd01efe7370a3b4d4d99b7090c8b185 Mon Sep 17 00:00:00 2001 From: Fermi <> Date: Wed, 9 Oct 2019 11:58:36 +0100 Subject: [PATCH 023/150] Jaqc complete. --- code/modules/holiday/jacqueen.dm | 135 +++++++++++++++++++++++-------- icons/mob/head.dmi | Bin 182367 -> 181566 bytes icons/obj/clothing/hats.dmi | Bin 88755 -> 88918 bytes 3 files changed, 102 insertions(+), 33 deletions(-) diff --git a/code/modules/holiday/jacqueen.dm b/code/modules/holiday/jacqueen.dm index e12ce7cf5b..9d4d1961eb 100644 --- a/code/modules/holiday/jacqueen.dm +++ b/code/modules/holiday/jacqueen.dm @@ -58,6 +58,17 @@ health = 20 poof() +/mob/living/jacq/attack_hand(mob/living/carbon/human/M) + if(M.a_intent == INTENT_HELP) + chit_chat(M) + else + ..() + +/mob/living/jacq/attack_paw(mob/living/carbon/monkey/M) + if(M.a_intent == INTENT_HELP) + chit_chat(M) + else + ..() /mob/living/jacq/proc/poof() var/datum/reagents/R = new/datum/reagents(100)//Hey, just in case. @@ -95,7 +106,7 @@ if(!progression["[C.real_name]"] || !(progression["[C.real_name]"] & JACQ_HELLO)) visible_message("[src] smiles ominously at [L], \"Well hal� there [gender]! Ah�m Jacqueline, tae great Pumpqueen, great tae meet ye.\"") sleep(20) - visible_message("[src] continues, says, ”Ah’m sure yae well stunned, but ah’ve got nae taem fer that. Ah’m after the candies around this station. If yae get mae enoof o the wee buggers, Ah'll give ye a treat, or if yae feeling bold, Ah ken trick ye instead.” giving [L] a wide grin.") + visible_message("[src] continues, says, \"Ah’m sure yae well stunned, but ah’ve got nae taem fer that. Ah’m after the candies around this station. If yae get mae enoof o the wee buggers, Ah'll give ye a treat, or if yae feeling bold, Ah ken trick ye instead.\" giving [L] a wide grin.") if(!progression["[C.real_name]"]) progression["[C.real_name]"] += JACQ_HELLO //TO MAKE SURE THAT THE LIST ENTRY EXISTS. else @@ -122,19 +133,37 @@ visible_message("[src] gives off a glowing smile, \"What ken Ah offer ye? I can magic in you an object, A potion or a plushie. \"") var/choices_reward = list("Object - 3 candies", "Potion - 2 candies", "Plushie - 1 candy", "Can I ask you a question instead?") var/choice_reward = input(usr, "Trick or Treat?", "Trick or Treat?") in choices + + //rewards switch(choice_reward) if("Object - 3 candies") + if(!take_candies(C, 3)) + visible_message("[src] raises an eyebrown, \"It's 3 candies per trinket [gender]! Thems the rules!\"") + return + var/new_obj = pick(subtypesof(/obj)) //for(var/item in blacklist) // if(new_obj == item) // panic() - new new_obj(C.loc) + var/reward = new new_obj(C.loc) + C.put_in_hands(reward) if("Potion - 2 candies") - new /obj/item/reagent_containers/potion_container(C.loc) - if("Plushie - 1 candy") - new /obj/item/toy/plush/random(C.loc) - if("Can I ask you a question instead?") + if(!take_candies(C, 2)) + visible_message("[src] raises an eyebrown, \"It's 2 candies per potion [gender]! Thems the rules!\"") + return + var/reward = new /obj/item/reagent_containers/potion_container(C.loc) + C.put_in_hands(reward) + if("Plushie - 1 candy") + if(!take_candies(C, 1)) + visible_message("[src] raises an eyebrown, \"It's 1 candy per plushie [gender]! Thems the rules!\"") + return + + var/reward = new /obj/item/toy/plush/random(C.loc) + C.put_in_hands(reward) + + //chitchats! + if("Can I ask you a question instead?") var/choices = list() //Figure out where the C is in the story if(!progression["[C.real_name]"]) //I really don't want to get here withoot a hello, but just to be safe @@ -172,11 +201,11 @@ //Talking switch(choice) if("Why do you want the candies?") - visible_message("[src] says, \”Ave ye tried them? They’re full of all sorts of reagents. Ah’m after them so ah ken magic em up an hopefully find rare stuff fer me brews. Honestly it’s a lot easier magicking up tatt fer ye lot than runnin aroond on me own like. I'd ask me familiars but most a my familiars are funny fellows 'n constantly bugger off on adventures when given simple objectives like; Go grab me a tea cake or watch over me cauldron. Ah mean, ye might run into Bartholomew my cat. Ee’s supposed tae be tending my cauldron, but I’ve nae idea where ee’s got tae.\"") + visible_message("[src] says, \"Ave ye tried them? They’re full of all sorts of reagents. Ah’m after them so ah ken magic em up an hopefully find rare stuff fer me brews. Honestly it’s a lot easier magicking up tatt fer ye lot than runnin aroond on me own like. I'd ask me familiars but most a my familiars are funny fellows 'n constantly bugger off on adventures when given simple objectives like; Go grab me a tea cake or watch over me cauldron. Ah mean, ye might run into Bartholomew my cat. Ee’s supposed tae be tending my cauldron, but I’ve nae idea where ee’s got tae.\"") progression["[C.real_name]"] = progression["[C.real_name]"] | JACQ_CANDIES if("You really came all this way for candy?") - visible_message("[src] looks tae the side sheepishly, \"Aye, well, tae be honest, Ah’m here tae see me sis, but dunnae let her knew that. She’s an alchemist too like, but she dunnae use a caldron like mae, she buggered off like tae her posh ivory tower tae learn bloody chemistry instead!” [src] scowls, “She’s tae black sheep o’ the family too, so we dunnae see eye tae eye sometimes on alchemy. Ah mean, she puts moles in her brews! Ye dunnae put moles in yer brews! Yae threw your brews at tae wee bastards an blew em up!” [src] sighs ”But she’s a heart o gold so.. Ah wanted tae see her an check up oon her, make sure she’s okay.\"") + visible_message("[src] looks tae the side sheepishly, \"Aye, well, tae be honest, Ah’m here tae see me sis, but dunnae let her knew that. She’s an alchemist too like, but she dunnae use a caldron like mae, she buggered off like tae her posh ivory tower tae learn bloody chemistry instead!" [src] scowls, “She’s tae black sheep o’ the family too, so we dunnae see eye tae eye sometimes on alchemy. Ah mean, she puts moles in her brews! Ye dunnae put moles in yer brews! Yae threw your brews at tae wee bastards an blew em up!" [src] sighs "But she’s a heart o gold so.. Ah wanted tae see her an check up oon her, make sure she’s okay.\"") progression["[C.real_name]"] = progression["[C.real_name]"] | JACQ_FAR if("What is that on your head?") @@ -184,11 +213,11 @@ progression["[C.real_name]"] = progression["[C.real_name]"] | JACQ_HEAD if("Are you a witch?") - visible_message("[src] grumbles, \"If ye must know, Ah got kicked oot of the witch academy fer being too much of a “loose cannon”. A bloody loose cannon? Nae they were just pissed off Ah had the brass tae proclaim myself as the Pumpqueen…. And also maybe the time Ah went and blew up one of the towers by trying tae make a huge batch of astrogen might’ve had something tae do with it. Ah mean it would’ve worked fine if the cauldrons weren’t so shite and were actually upgraded by the faculty. So technically no, I’m not a witch.\"") + visible_message("[src] grumbles, \"If ye must know, Ah got kicked oot of the witch academy fer being too much of a “loose cannon". A bloody loose cannon? Nae they were just pissed off Ah had the brass tae proclaim myself as the Pumpqueen…. And also maybe the time Ah went and blew up one of the towers by trying tae make a huge batch of astrogen might’ve had something tae do with it. Ah mean it would’ve worked fine if the cauldrons weren’t so shite and were actually upgraded by the faculty. So technically no, I’m not a witch.\"") progression["[C.real_name]"] = progression["[C.real_name]"] | JACQ_WITCH if("So you got ex-spell-ed?") - visible_message("[src] Gives you a blank look at the pun, before continuing, \"Not quite, Ah know Ah ken get back into the academy, it’s only an explosion, they happen all the time, but, tae be fair it’s my fault that things came tae their explosive climax. You don’t know what it’s like when you’re after a witch doctorate, everyone else is doing well, everyone’s making new spells and the like, and I’m just good at making explosions really, or fireworks. So, Ah did something Ah knew was dangerous, because Ah had tae do something tae stand oot, but Ah know this life ain’t fer me, Ah don’t want tae be locked up in dusty towers, grinding reagent after reagent together, trying tae find new reactions, some of the wizards in there haven’t left fer years. Ah want tae live, Ah want tae fly around on a broom, turn people into cats fer a day and disappear cackling! That’s what got me into witchcraft!” she throws her arms up in the arm, spinning the pumpkin upon her head slightly. She carefully spins it back to face you, giving oot a soft sigh, ”Ah know my mother’s obsession with this dumb thing on my head is just her trying tae fill the void of me and my sis moving oot, and it really shouldn’t be on my head. And Ah know that I’m really here tae get help from my sis… She’s the sensible one, and she gives good hugs.\"") + visible_message("[src] Gives you a blank look at the pun, before continuing, \"Not quite, Ah know Ah ken get back into the academy, it’s only an explosion, they happen all the time, but, tae be fair it’s my fault that things came tae their explosive climax. You don’t know what it’s like when you’re after a witch doctorate, everyone else is doing well, everyone’s making new spells and the like, and I’m just good at making explosions really, or fireworks. So, Ah did something Ah knew was dangerous, because Ah had tae do something tae stand oot, but Ah know this life ain’t fer me, Ah don’t want tae be locked up in dusty towers, grinding reagent after reagent together, trying tae find new reactions, some of the wizards in there haven’t left fer years. Ah want tae live, Ah want tae fly around on a broom, turn people into cats fer a day and disappear cackling! That’s what got me into witchcraft!" she throws her arms up in the arm, spinning the pumpkin upon her head slightly. She carefully spins it back to face you, giving oot a soft sigh, "Ah know my mother’s obsession with this dumb thing on my head is just her trying tae fill the void of me and my sis moving oot, and it really shouldn’t be on my head. And Ah know that I’m really here tae get help from my sis… She’s the sensible one, and she gives good hugs.\"") sleep(50) visible_message("[src] says, \"Thanks [C], Ah guess Ah didn’t realise Ah needed someone tae talk tae but, I’m glad ye spent all your candies talking tae me. Funny how things seem much worse in yer head.\"") progression["[C.real_name]"] = progression["[C.real_name]"] | JACQ_EXPELL @@ -196,6 +225,7 @@ if("Can I take you out on a date?") visible_message("[src] blushes, \"...You want tae ask me oot on a date? Me? After all that nonsense Ah just said? It seems a waste of a candy honestly.\"") progression["[C.real_name]"] = progression["[C.real_name]"] | JACQ_DATE + visible_message("[src] looks to the side, deep in thought.") dating_start(C, gender) if("Nevermind") @@ -203,53 +233,96 @@ /mob/living/jacq/proc/trick(mob/living/carbon/C, gender) - var/option = rand(1,6) + var/option = rand(1,7) switch(option) if(1) visible_message("[src] waves their arms around, \"Hocus pocus, making friends is now your focus!\"") - var/objective = pick("Make a tasty sandwich for", "Compose a poem for", "Aquire a nice outfit to give to", "Strike up a conversation about pumpkins with", "Write a letter and deliver it to", "Give a nice hat to") + var/datum/objective/brainwashing/objective = pick("Make a tasty sandwich for", "Compose a poem for", "Aquire a nice outfit to give to", "Strike up a conversation about pumpkins with", "Write a letter and deliver it to", "Give a nice hat to") var/mob/living/L2 = pick(GLOB.player_list) objective += " [L2.name]." + brainwash(H, objective) if(2) visible_message("[src] waves their arms around, \"Off comes your head, atleast you're not dead.\"") C.reagents.add_reagent("pumpkinmutationtoxin", 5) if(3) visible_message("[src] waves their arms around, \"If only you had a better upbringing, your ears are now full of my singing!\"") - //playsound + var/spowoky = "https://www.youtube.com/watch?v=PFrPrIxluWk" + C.chatOutput.sendMusic(spowoky, pitch)//I hope this works! if(4) - visible_message("[src] waves their arms around, \"A cute little bumpkin, In your hand is a pumpkin!\"") - //Sticky latern + visible_message("[src] waves their arms around, \"You're cute little bumpkin, In your hand is a pumpkin!\"") + for(var/obj/item/I in C.held_items) + C.dropItemToGround(I, TRUE) + var/jaqc_latern = new /obj/item/clothing/head/hardhat/pumpkinhead/jaqc + put_in_hands(jaqc_latern) if(5) - visible_message("[src] waves their arms around, \"In your arms a jokester, keep him close if you don't want to be a toaster!\"") - //sans + visible_message("[src] waves their arms around, \"In your body there's something amiss, you'll find it's a chem made by my sis!\"") + C.reagents.add_reagent("eigenstate", 30) if(6) visible_message("[src] waves their arms around, \"A new familiar for me, and you'll see it's thee!\"") C.reagents.add_reagent("secretcatchem", 30) if(7) visible_message("[src] waves their arms around, \"While you may not be a ghost, for this sheet you'll always be it's host.\"") - C.place_on_head(new /obj/item/clothing/suit/ghost_sheet/sticky(C)) + if(C.wear_suit) + var/obj/item/W = C.wear_suit + C.dropItemToGround(W, TRUE) + var/ghost = new /obj/item/clothing/suit/ghost_sheet/sticky + M.equip_to_slot(ghost, SLOT_WEAR_SUIT, 1, 1) + poof() -/*Will you go on a date with me? -”…You want tae ask me oot on a date? Me? After all that nonsense Ah just said? It seems a waste of a candy honestly.” -[src] looks to the side. -”Look, Ah like ye but, Ah don’t think Ah can right now. If ye can’t tell, the stations covered in volatile candies, I’ve a few other laddies and lassies running after me treats, and tae top it all off, I’ve the gods breathing down me neck, watching every treat Ah make fer the lot of yous.” she sighs, ”But that’s not a no, right? That’s.. just a not right now.” -[src] takes off the pumpkin on her head, a rich blush on her cheeks. She leans over planting a kiss upon your forehead quickly befere popping the pumpkin back on her head. +//Blame Fel +/mob/living/jacq/proc/dating_start(mob/living/carbon/C, gender) + candies = pollGhostCandidates("Do you want to go on a date with [C] as Jacqueline the great pumpqueen?") + //sleep(30) //If the poll doesn't autopause. + if(candies) + candies = shuffle(candies)//Shake those ghosts up! + for(var/mob/dead/observer/C2 in candies) + if(C2.key && C2) + key = C2.key + message_admins("[C2]/[C2.key] has agreed to go on a date with [C] as Jacqueline.") + log_game("HALLOWEEN: [C2]/[C2.key] has agreed to go on a date with [C] as Jacqueline") + return + else + candies =- C2 + visible_message("[src] looks to the side, \"Look, Ah like ye but, Ah don’t think Ah can right now. If ye can’t tell, the stations covered in volatile candies, I’ve a few other laddies and lassies running after me treats, and tae top it all off, I’ve the gods breathing down me neck, watching every treat Ah make fer the lot of yous.\" she sighs, \"But that’s not a no, right? That’s.. just a nae right noo.\"") + sleep(20) + visible_message("[src] takes off the pumpkin on her head, a rich blush on her cheeks. She leans over planting a kiss upon your forehead quickly befere popping the pumpkin back on her head.") + sleep(10) + visible_message("[src] waves their arms around, \"There, that aught tae be worth a candy.\"") + sleep(20) + poof() -” There, that aught tae be worth a candy.” - -Ondeath: -visible_message("[src] cackles, "You'll nae get rid a me that easily!"") -(the last message is if I can't get a ghost/a person in it) -*/ +/obj/item/clothing/head/hardhat/pumpkinhead/jaqc + name = "Jacq o' latern" + desc = "A jacqueline o' lantern! You can't seem to get rid of it." + icon_state = "hardhat0_pumpkin_j" + item_state = "hardhat0_pumpkin_j" + item_color = "pumpkin_j" + item_flags = NODROP + brightness_on = 4 /obj/item/clothing/suit/ghost_sheet/sticky item_flags = NODROP +/obj/item/clothing/suit/ghost_sheet/sticky/attack_hand(mob/user) + if(iscarbon(user)) + to_chat(user, "Boooooo~!") + return + else + ..() + +/obj/item/clothing/suit/ghost_sheet/sticky/attack_hand(mob/user) + if(iscarbon(user)) + to_chat(user, "Boooooo~!") + return + else + ..() + var/datum/reagent/mutationtoxin/pumpkinhead name = "Pumpkin head mutation toxin" id = "pumpkinmutationtoxin" race = /datum/species/dullahan/pumpkin mutationtext = "The pain subsides. You feel your head roll off your shoulders." + //I couldn't get the replace head sprite with a pumpkin to work so, it is what it is. /mob/living/jacq/proc/check_candies(mob/living/carbon/C) var/invs = C.get_contents() @@ -273,10 +346,6 @@ var/datum/reagent/mutationtoxin/pumpkinhead return TRUE return FALSE -/mob/living/jacq/proc/trick(C) -//var/area/A = input(usr, "Pick an area.", "Pick an area") in GLOB.sortedAreas|null - - //Potions /obj/item/reagent_containers/potion_container name = "potion" diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index 25183c5cea529cebd19adba38bf7bfccc1a1b5bf..1d9409919013213abe018b0dfeab29966cc1ede8 100644 GIT binary patch delta 142522 zcmYhi1zeNg7eBs{QWjE@q6m`G9TH+u(yammq`P@QKok(9I}N&}91N81?idK8d$2JE z+kbpNzu)Wkzr3D3b?dq3+;i^xeJ=2?RIn(juMYq}e?22lRT~d0cY9Y)dlzRA$T#ap z=CJ#`)a|Zelx`8EVm&3v+8gz+-{5Dxd)ln}8}U&3(ObC3G$X%`PXhAzb(r`r@&vMX z&x2^blH6S!T(8Uo@JG2qfRh3qgE)#1e;JjzF<1yVva>&|?sUqLWLK0^kV;uf#>ANw z9Rllq$d@@q7sqFB)R2Vht)sVzUys63o?PpI;kCu^9Kl-?5wV`aQEjHqTz7 zPTrzV!Y iTg?%%LxWRkgIJ#~ qrS&|=r__&G;PP>HWw=G|i<>|KA2eTyR zgPDLv@jF!atXe~bx6Y*%UyTuWTfWs@BXxbw68(Iq{q9}L-t*t=cFU*Vt|`DR);QeU zTA<9e9?h0 rTK#YryjfYo9T^*QtsYi{2(K8Qjl*qMS$>Dc>?O;m`?ed={B25?X`z#4 zL4EeE3Z0^}`z_SOt|(Ma+0B1bG{t)f07}4B0mi!7&iFB`1H~6yWcYIEn_e7vlIoR_ zr6UVg?&}IYKjqzuzwp>xr!e*Ren~Z@YYjBr7M!)Xj`mj3KKT+S(Oz^0UvXZ8##bXB zisTPYiE*PZIze6+^=|fyLS|*tBl8~%ZpEJcp8rEBdQRl>VKjB>hjn~HaAjb)9I(uM zO}4GG;4L4S+hM9cF|W)+R>sDGX(cA<^e?m?%bScmIxu$ v(=%(3uJk_c8ezBv@ z2?xSJW4*!WZv%Vy?fb6i<}6L!kvQO_k7cFtu`DI^$FCGGIGa0i#2%1tIEbq`6F=t{ zsF}94@Z->V_U1Loi=^)<-}Ia4Vl7i;t6s_Pq2Cz^`{sbVev7@yyLVHM>Mk_}3DYW! z^e_Rwa6K86vme`cy;CdhPQc);?iuCcJCQ_~7FzOvme>OQdI9a}EuJ|AzqGvzpr^{* zCbnutkB3c1hW+Wmk#wRo$029U^jO9nA~mWUzrq=u;G!IxSw|~dg^5HQDkVZM)<7Ur zz4QkCfzIXO!rkLCaW^df8!Y&v4^2?v*}316_;L2XQrm#(HZPM^u}%`Q>)AsQUU~8y zkCQ1Ecyu4fN_#|XCtH=Y$wu8N29&kOg3H>F94X?D>0&I`j+IRNI1|Y?Eo@p-KdCyT z+J7(Z$_^3pp;q-(x%<%z$n0)J+Y<%aJfl#v^1pZU$B2EOve37K=Lkp=GEeULuY+g- zcts;lZwB>X=W{AUYw-O5gD8=T4bw%&)mweXt+7p?R&G4@}x~X^`7@F#$Yd0zPsG zu{?>C^6d*H>eTJEpC7;%)9-7q7!E~L^E+zJ*F3+UvhI~L01kAs gUdX$Jj6VJd&Q5opCH*JV~8{ uh*A4 zR!a}F j|H2EfI*XZ&S? zT=NClR))9trm1|Xz*z`$G4b`qQ6kdL2#^Lz>g^{bg;Y-@{@#)*PrWU6YGGIPA#qfg z_O-GvasK+4sM#b%y%QOSq^# Geku(@%Q&zt;RrN2V3E2YO?gtN7~Jc!>*T|UHWPMu^h}ihfQ6~hsewZ%Bp FR`-MHv&^3fg+KQw!r&wXHP&uE8iXEo`+bxj?2pC=q1v sGMQ*z_-XvlHF-6Uj*)&Dao9(AXrTHJ-|L>x4Nt$#OWZH)*~!uS ze&YDI!b4xGtCTy#0G<5(b`0^z_DAWHm(xfm5>m`#BAdzh>iVcC!|K@H>w;=Sdjf?> zEFuJd`0K32#kv(|K45lgA|!A gnv)no+SQzqHKNR-7sa;MH^bYi&(lucmly zH(UH}4GVOq-mTx02Tvti8i_WrCf2Kkt|tcFjx*a>()Au`U~ajf6dOIH(zdn{p*BFh z% hUWxI_Omw@(bM5A3#iQdJsb#hK*W#0bZgm|tXAto4-dEz=%71T>Dkq7u zggzD2QspgDqfnzf{rg&b{(ZT+&^)ITA(hYJOggbjH ZIngA@cIG$! z0*FE~(&JV*wVP}VnHaAB$d#1sdSII#bm=8x4c6D!xd+PgskAUUACfJSH~#6^V3f|D zx&|=3(TC#icK$?lAEfLN9}1FPXSoLAEcX%W06o)uH3nO#*AKKhyT)bpwZEdI=%!6F zUBTJ%z1^8QssQwU=Rr#HBLRHK&p2>nFrZs3fKed>1Hd*h$3v#8lP3@$eSNT5*G~bY zr*KYoo4tkZvx>~WVg{e^PU<$S?G4hAn$=+wcWNb0PH3^hPL)_)oI=0gLZ2c~v0L$Z zLQ1@w=m95Zjc(qemZ>{bJ7#c*K3n_q_gFV6zlv`OR!gL-+b@OaiiP!yib{Y#_78Zo zFV#slyEEruhu8{QFu3iHO623+6b47>hdHyKm3DdXb2f_yyf3VoFgwM)j8d)~6)n!U zqi(P%n;cm9uDfh|f6h?^V2uadXlM-%o2y@OtQFfU^_0$PbMe0Z!ebd?^b+vJfovI` zdk#8q;_vul#ht8(6JZBEg#d Xqgwf%fCFdA^&4i?~bem4t)N52I?c^ zy*n52FDx tf%%}8l)1oar1qrHeRjgz?Z2Xg z(mJ9&=^?z7GRgfv>!U?MpFdqCGQz>hXq#BoaX&G-mN`+W7D71g0uBs)H-tvS-d+S( z+%&Okrx+e^Wl@oevHHW_atyp}Up-KQNX7oCa4R#18d%e?Qi6KstBGkJzB q4uy~+Ow(^nmD%+_q4iS7&bnGS-&!mZ2`s*a8Iw4_aQK=ZAQK^{SC*EH#tGLkh zL{+ss@nQHdJU)+q1Q3fS&b!$rF=MJAFd`<*qC^&AmRZ|wL# C<*1dKP6J5Ynuu} zrM#iS6@9*S8LIGHY5(EI3nlLEH{Iu{5xPsUtRN7k&Uj_wzwUIAwcXbZcJZoM^wa2N zLKiji?*xECw2&4xb-wN*vMk5hZ0Zom&u5>aJ%WIrKLIkR&q2KtYs|n9%5SvBzMmet zAHV?mVFJCr>A#hI({?y7_`p3WMPGSb3?x-YnALaGW`BTwU%U4;A?wp-sBT`JmQt^+ zkV;l1aY)i4)F=0KyoU96`;1L^YiqX+7PY5qp^WJd`UfNS-P~HLx9tyvzU*;jB)?TB zfW}{>0>M<@3fb^s$8dRqT4aPkK>@>$MJ*Iq{4pe;cH)Jp_adg0N#*Zfd4I_-K4pIu z%+qX}_Izt=tKygf^z>v}s8$9JPkYK}fsNTb0J3m`E&^89ehs`qmW#aoOCsRXeVrh* zs5*yfe`}_GNqx1Xam-S4zofLn Gf(`JqL7V5?dcfZ@_5wTP&wli!6p#5Ve5r$S}8wBqmA(#ofmN2{aAD85%O zpOo4_Al^|?QM{~Tb~g(O?z-;Cua5e3=!3+lnM6p!$Y_+^-Q81hmsmrS?8R09-v_L% ztqBsI|NVMT1!T7=`;T|Qf7n-5O 9>mG#d-RbykObM%3WjOZXQE~=8y*6NDwn11K^OoL1A z&d$KEbYFrnM#MBO5Z&a-fC4>$IeL zmW-98>8)QMlR48ymylJPMJ zd0i%^lJahF-h j6)5K_?KKY>jQYV+c|ZjoFs~t@64NNk`dqIx-m$>-^04z{ ztLL$qvk#bQmvLRt__qJ@*pGLAPPW(>nEG3(i_Gzm&arid(3b!NjcVLg!dX@=$7N_s z(>niQ7eAV*Z8<_El8 RtXA(sxwM7&%*`zy2KZBca+?#3Ds>Unk$4KEr1V zkzLN)z=hGR1cE1O7N$2;_^~}6ewuP*>FMe3c4w+T^;(Ah`}b}dVQ+8GDC^Bnkb6X5 zdI&KY^-aRj_StKPBfPD+h(}djof!1n`ye()J|L<+@&;f3LDE-kY5!d#76s31r!+*B zxHs29O5 ~(DhA6*1mpa; zKsGy9su#m7IaId<&V#`$FjfcIH$W h4~nPGNWYN(?~cy1nWW z21@$i4KD04t25@!*Pzi1Z~OF-hliqDzGqBEGGqtJURU=QB`*F8T~dN{J4^F
q#2!)U9V6pOqZAI*@#Y7MOlpizPooXa0)+evoY@pW3_VQWf @k V?-X+ z!_pL3zoqbp`WTb`azyLZDi4?W5-*6}5(RlWvCMzi8dq5osOPc*E$noc2m?K*_=vZQ z83@xRoH+)V2 3n&(Gv>;XUy1 z@u<;9ua+9OMZA}P545x1nmQ!l(ny@F2`5?ZS!r4u$T!_OG4`Ri YyY zTVtdf!@25?j{M;_N5p9A>gw$5?AofWx?R_LZv8+QDx0x cN~&23DpaQ%x!`uMc%m_O^XgwB`O#);=-l>}*xiu@~ J<)fP!b&xFFv(b_ zM=O8t0ovz}L2W&wIG?;gr(TKvuGOI27N@xx5NO8Z4YbC~)h#zzIn!Sjl=l+FwdwOD zfWO(F$QffNa2%J@SuBtV2EChgn6XT9!7%<$nZYe~i9gsuYhLW(g0rch5C=IbtB0Ue zzH<-+XnE)?-9R4_oC{u_NEz&rfpvQ&R{E?-mXc6!GltY$%XHwWZ%!Zdrm6#prdTHM z!zovcKX{$q&D0lN`D;T^Io4FhsaBRSV_^q1FhyhZV`J6ylvfXH7nKFtVi2jn2pT+H zCb>#2XLUqw l$AeppEB55FJJ1H>d}X63}?$SEJ_QHdKv3`)$Ih^LLg5MmRg_|`Y@laJm5)~ zYWJD%v=<^d`P1jm#qgE@pJ&`YNLy>~`e(yEZ58IwzzSwL-^bVQ(DTaEubw78qyTMt zjH)S2(*<3MgLr~22s2TuL?p1>K4Xk% #&-PWcLsky-Jna*ptG!$Hv{a9@*_6QiCHgCnmT0C{0o5}kHfJj0jUZzBu zwu-Vo|7`9$*zoYTAbuHMs-xpa>C#+B((tNP`W+IScR<|gA%DH=pGGV(sE_YOa!kI* z>nPB&8ywv7DTy-YqOML9^u MN?!Dbtrv2JaV(v`}tDU34M&{m9X~`K Mv5Z{~HYKB>X8}4rfLpT2dQ&r;Y=S{E(BUQX)@GXB$^%O8lNsTY z%~4|Po!BcW7L` $V;9L!CWE@ zeM^RJB=H$%3waSt!ue@`N2)38&=@6IqyG8gV)4aGsr1~1CR%?_FJQ#0Y>lI@PfNv1 z;btQ!X}Xkm1sF(i@&TWf26ZZ;d@c{Lh4Oo<;A@*)dFG^VjwB2J+4fqlHn=!-Q(@F! zO{-5=nCDiDG<^TQrcm483P1Q;2q3fHp6Sl2Ju|Hxm@?0w=QREc-j0H;Q`)>5JpV4G zUHtuc23YEsSQIxraufP%PpxT99Qu+gIU*5Vqv12C519Ezj5B8SJfzg)Ddx}oU|gS# zfk4UU_3L|CxVx8=3c|?abEsLQ^YInXeGv`DRzaDWll{^B1k(8|2khr|Tgs#jajtI; z3jPmII+0l3WJQ$i`}bcnGPd7e)-zVT)X-3~w=W*MaP_^Q{rArdEqYJzIw8Xer*rhi zxwcI|K#!KPMx|%mMN8e;lC`UX_Y#Fx)F#|i=9{T~+2h_1pEf|k07yh0OYU}Ht%#of zitR&%3VG*rw?d=FGaJJt0nz muWvRM--RZ#!ij=`Rv=<-g5~6VL1R&f=8bc zjRcs_Y^5;yP%6Rc&I!}S+{z)^Uu&Dh$d%xK-|(CNzSD?-fYxjAyQspN=qk^x*9+6e zz47Wj9A+;RziD?__p>__fL}pMhKG~l(FK4sCpA;4 ex~I wb$bY-3TQ@i1O0 -%JVUULxjV7!iWSWulD|7gsZe6(=}2>KF!;o)!o9(gQ*_C;tq#lo zYvpUM_&{wquYl~^eyOz}t>^peZcXOg_l_EvE4Gh?%#eezV7t>J0RNzN71U=1B0`lD zN3p!PPOm|r8LYXuU%-?Mf*$^Qp8CGv7tzeG{u~kKwKp2yA8gHfuSF!f`d=W*pmW>r zzuQ{RWCZ0^X>T#*e!h@4H~wKBj6qb0{EbcbS;Ba)llJ8Xt}YhrPH4`*=owGeH!19h ztuX$&)Xkx{w^f6j19oR?)e1GUzly(OJg#@{-Wo4FdN&I(?OO2+o}7?9^f%)MDNTKP zdq#uXa%-8TcwIK8?r@lX*?2j|&f&6y>Z-PR)c>=mgXxMLQN8mui*$1^b{1Ia2?#36 zis!avdEw-hO?xXMEY&jTc@NS4$=0~ =10+2ig{k+OZNKf8eu{1+-bq;D%Bl-2o zA?3x6jv7{6|4|eHRiFn22DSujVnV>^X^-E2_$l); 3*ICu6)*utvW4VIS3M{XtM}8( zxiB$1Rx>ai@_9#HzXtrUu?m^_=fULqV|K7%fiow3WokB{jvQ2mG=7TgI!qKG?o8|< zt6`839F_$_&P+#EU1k|;2stH)LG_@XDIsT;IO||V6;>76xKOkVdB|?d92e+KZxA7!B@o=<_^0oP{Td^4L*gso= z@8= M==8+M;b-FRsBv|V}J-4po*SJg`%|W7VPSep*)Yp33 z5_4hFR8!BQR+<;hC?uKK-=k zeDtXI#9fxMh_IY+pw`?VZYz@<>-@*X=QcUw@(+-mdee2%>x-Bou6GKkmUL!FUyRIm zXxQhGc4L9Yxv1|!+Z_kVLzu?7p@Mu%y3vzytPM8QwCr1gV`QDbVU|F%H5X{6<~qbK zgK_m#{*5IVk!=ZHCextxP7UdD>#3BSNs{m4gBN>^&_Ce*o(@~#lhtK0*qN(vdruHs zem|Q29xvr2!$8kyy+U^MzK=jnDQH|Gu1}?Ko<3XJgN*ey?I {~4J{mho z=fv#AkPkTD&fJ)ME^eUtrIVe5swrhC#3R*Wrw0B0h9gtauxF`2cVfk^qkMyeLw{oR zw}^G#!INCcSRfny&-C$idG|^SrHt4=0p?8IBMY}(2@_@yc&gEHPG5B>h_8{f{4j?! zJwXs=9rn&gdb$r4$3nr>+R}YNYX2CNPRZ=#bLn|sDjDPK#Z$pFLDYtKo^%975j24^ znJdo%XRq|(EiGT`gjaUoZRfdP_H(k#SV<*peDITvQw6KqQj&{`UXpN0r@*}xPgtw) zjPUhB_b=|iu}24NE~v< p5L89t;0wSZNVE5S~cjx7C@Wq|@(3Ye8vPq;3*c@u~!-E zeA_nBh8YYY
h zNJz3FGO4QZJ#J=!_r3;=Yowh$tJ5}b>-~o$SImrxvwYNs!n3x`V9AL }+7!vDEmgh~LVVpkT9SUZf%RvOfPZK}&2R9VtY8P~art z>7ON{0cbeOnmAi>aEk}`6gATa;VOXjj4wS#kKW3AgPZ&N=cB~^8~*&>$sZuIp PT?@&!D)Epc|32IyXy)rBL-HXw4-Ch42_32ch z-csgf)E!+!y*_gWM4Y^oMa6%b0FR9jj}4Be3TfZ=0`4(%=VlhmF^3o&zOL8|a)>3I zow3(hUF$2ZS05b}Rr4wdC4fMX+RJzIHc;;{(q-NPGM7W&j3%FPCufXJO=fkeFLO4{ z+MoN15<<*%j{&QNcfsCX*QGv|3FL^ 4P`3`$7+ak2Ud(`Yc`pklcuUOJZzqb-C>*n^?ofsx<5QB!q_Jb^u zblQPjuA`z#g9<<5)#F%5M=XVK-ewe^EJ3}~j|Rn%<{Grm&!3s0#4ViFDY&Sr;y?CF z%%%x-KNe~8D(PC$tI*K|f@6F3Qg;rHKMhOXl*UL`xZLfwHiX&CX519OLNS*IfF;4x zMle`ZwFG7o;w4g^n_pKExeun*a}|P;Vt*7BJ(H>%y4>@B|J|L;#G%Jfnye5B4noa4 zdAR&-a!2P}6VCp2c>aN|en2Vn?3vGKfTP^?V2dxu?HeOaw$y6?+Iz4q^YrQO&4gQF z1f>FjsG+>9odNH`N*Kn61VscX&E*+6;^APBKgOrzFl)>>t>&ZzR7IxL)a&Furw!Ua z@i3P;sV+B^`*<(oAq;+2=d;z&_3@%#TqCVKK*^H4gtBcdTx`_mD>}yxMu~FNc^%$+ zv9x8lyd0_(2vnq|nkMIFeSP>7?tdS&+%KU13fUagxcvyhmDl=u%rQIgK2{mjmLR!Q zXKi-nbN2k<4V!^BT&i&Pfl;wNzIz=ZMgI(Q8R+PgCYeR`8A6_i1y>gplu_5h;WGIZ zzwb&}#wDW{e$`i0T(7fKEEcnj1%v)!6@J-mzr?2lRl5Px<>eI>WG`ND)Uf3cFTYF1 zfKU#yxq%A2;&e1#UX4zOb&7)p|G~NK53K_v{BrbpZuHBWU3MAq22c?M0m<}J|#2=()?7=F$SLr*vpZ0rycFL+Vf{vn34HB(DW;=y$)B^K# zbB>pQBz e^G@|H$8c(pOF{))ZZp9M?^g@$f15jA#g8^$_|> zP?aJ y3W!;_ som$T{dhJ5&dJaV-=s3*Lh!s%qfwoH{;BJm}}z z?$N({XoZMc+x*UMm5B)e!~pmBar2-54@?G1;d<+@3Kd8GZPWqzYu$L%WGy=P?rCk| zHYFaiCv(WVYJJPbMC1$V(v_p*_C7ZoBK1MPWP7g^$oCEaI$6-xf~}ah)mc+3^+VuI zKC7q3_zKREOhaMj*I=d)!U84~iEa|IL&peo SlC6M<)nyR@OA^Po*N zIP+G}FGU|s<-%~1X(xrtUC|#d>j$G^_xf7_pKVVi3tahl;kXUOnNTNb9zQ;Y{e!pj z1t7aC1S-vE$c?_MNYu#OV^DW}e^l(q(Q4=whb)DXoDpa)?Vuq9S@51Z1rA(A3rl*G zHHSdIe(xRw-BQ@0AuBdAl?qxV^ILtZ16zXVjL$osN4Amm2B5xyp=^JSx HaP4JW@}ZSbJWsq;Egb)pHj=t~SmPB)9V8 zxv|3@FFOr}$R2(1Z>m8t^Ki ^HTo5VGU;e7Tc4AbYTQmAt!hupK5zBVn>RQs? z-Q1&@NIB-m#>-DMXggh#fn4Ivd0+i$mu!XX9J1v~N=qvFBKrcqklTqnYY1K>*aysG zi>CwH^>M7Ehl=+)EcMqNGEf{Lr69A%v^^=J-~i Q=W@wia#ygl{0wY9@I-}c|I#B9ANSE-8;^d=A()+ zVR__$Xi-^N$LaLq7Fwd_jCg`2Rr}Q?&~69%%FY)35>_R{=?dfjy`O K1*l|A&`S2#H;qU lu@R^2!skPQP&K=?5E zjnG6U=`N~Cw$OwRlSY5*GHh!92e_t~x0Lr29J)VC{%yKILZs3 >p_+!p0AJMaMGeUM|^|*8RLl zT!>f&Rd? Xeg!pgWTv-laQU=*EGY% zA>K(qS6SEX5pnuVyK7a<+l0R9wc=c5T6=E~^)iJB^xFIn4ug}kA5A^AI2Jhi;>aOB z=}X;Qd4xy-?)Om@xjt%KlM?Zdxe0O B3$ zC{16AEJrPC%6IW&*AAxyd&v5Pafk;NVUjbL7;+OJa3qOq&TYdASosGJ9~RWq-1dQA zCX6it1n}Hr44)J`I?&8c(Kj#%Hnm7eOFJ8C(9F#_H}?1U*U=e$qCa~>g5CwfeSXa| zo44j#S%^F$bJRy% ncP>$?c)7i=Qbjx)?hQ J}Xb@=hg=2#?xo$v|FE9R)Wy5mX#d;6{A_|&((O!3)6ai0GJ{ycUzwo&4k;jQYM z1fpQ}o*4uWM(q(fBKAy771TiC*j>dujFt6&oCTrwiI3twsO;)Mz5!kq+V@Nwp22yD z$kO%Lc+&svr?_Gp#7jSU9FuUA9EaJcKe6*7OZ=110A$q3mPZ-862hk4qZ6mR$gp&Z zUaKn->VHWmTB?PrVjL46_5Z2?yW;qpH8&*dc4L}jXuMg8tBT#kZ2k6>+5c~;TXhCq z<|di4#Fb69hcw+6>#wtIn_Ub9bZM21>iGX7M>sj7l)4HA4L*+zZe2{pLP50ur^$Fr z@7?3Ou^3Ibi>LrAt?mEoi<0K>Zx5N)y49=gK>wwJhf>1#M@n81+{6D(7M%7BZxWx> zJ^(-;;GKGt`_+VR^UL+@_?-Ba5S#mdIVZ|Q_eyx$vxaVb% HCO; wj)Kh>Eg=?VKZRHPPw_olC3zg9IfV=*W*T0u+j8I)ZsdEi)_kZ?OGDT$ _x$I eC{{~*R|Xswad}32uc&SA|o^%n(6$zclE0I zwiqVSt5{=F(w(=6S5gQ6O22<6S*iuwV7OgM{U7FtIn9Y(O-i7qX6zJi?z7016R FTe+Oj;tYBZz@*~V-vR%ubur+In zEu;FZpp>MHmEUFmtnVo-HqNJ*>tql4_)}}b@xumooIjaIMs6Pb=I1TByP-Lw8!VkI z)O|Diu8Y6 3w zSBIPavWp*fDudxeFjgRtsO``R4@st}oJ1)oNeH&1MqD6{UTQxMm=yY(J%nb9)M>F( z(*N@ifg!-H0xNht8=77FlI)p-T-(~_C`fz$Q25=qcY|F&?Wk80ggk!6pn?I~*Yn!Z z=~&yj<1?Y(zVXAC(+Ak&FF6hM^(3DDSPvO^0L#<(mP=^u;8GxSg(2=tHl5v$Wu^ME zbXbB9{s3AJ6dq^ZjWnOnyPVBohxLvvT02tWaWc6sJ@%yYtqC{4VScrF$2i$+A!%df zxs1yvnm;!e?%f4FhFVcrlmXjO6ThgyAkkGHD;=+gpk?c$Thpf?Z41LV2X~)Hxf~lw zYS%@0u3C0SR=#1oB^Y%P8+TavQEwWd3&+0bwR+3HvJO+c5nUqcRa@WCXiDFr^6k z{?q(Z`Vq8x`5aSE7Xm?KTB}oRc*0o1`0)h=CFZI9!o~ccY+kl60BM#n1=r-nL?bMA zf@q}d6LLwE`4I8HpgSSve%ff&9s7c^t)ztaD%kv_{=2UuN*L4v4 O^O_8w}@ivbhl4sW9F3 zwDa9)XLQIiVDY`)_a;OL2UcPq-yGd{D_J=~5$y8(0!|!ZJM~@wgM0C;>9REV;?f1* zWHD<{R(oiCu#&)D6s~tE*=RF6RjE>YOjEV@z&Cas3&(ZOo}q!PVLI5n;-j$%8H4k) z`Se8>_oznfg TL9aGIIL z8BFhW`}y9tqxoNy4?N@kWO7g4_tp_44E6A-5aD7;u9}Tv(dzK(bzNN7aDnE>EEg8_ z*4{_|!m?foUtr}s2t`&S`55xX=Uu=f(@);dMJVjFMG>83EG%ZA&r=cXAcBGc0vE0b zqGrE$@*jcL$TJRZ-JYY58GD147_!aOZqHhoQ6N}PuWl#T9D_SE )=;~fG$24i3@7>;^G`PL7_208ZxCtq?VUN4xcF;gu9YwHAShQ- ziT=Cu6b#e9XBcBAKw0^wY1nJjM9+$%*h%}eYjG>E$*eXI a}M+ z?yzX}+6T_;$ZOnA*o$DAM(1HbCD>lF5yD72SEIa0KkpBtQ*`N!d;)AMXuo&DghDvx zv1oYe#!Qxl?Zh0Sl7A96@ii){_Vi4{?RI^O>#KRxUtxiOqw9OM-PeEPY=oBbdv}6$ zv%;^k=&JA@8-7GRl>%&vQI61k!u*;OM`{cyC5hf((6{9j-&2m;k@fl1RlD~)G7CN- zrAg2Jr(pY4AZiA9B5>(aYPR!co~m1nuTOD{ARV@TP5eCXRYULH*Yo?Z`{g)m@og;w zC=3M~py*2X^|sBCU1?&w7#xWvS>j4UD^7N1j$_=ZAwP1r&0HWhZ(i;L(V9fcPS5ig z5{`M3X~pOKVT#NdJq =nMFc4ugO z*ZcvI7V!w&Wfvp?D%(_ix;fnRCg;Fl{{uZ6#-CybV9@iz{1NCkS1`R~vD*@{38mjo zn|lZ2$C=1DLv6L3L3tGy?+I9&>aTWF>fT|8(R *Yaw51;#9_XaYdWuz5iqz9+ppkY>1jQCi1uStGuD# zG+KOAkx+d#B>BTpF;OMnj`Z(L*Hl*+p7E@@1<#q0R9i_B7(p*F+8=89_4!jfuP;08 zoK(vH&T6g1y9_Z(k`W@erfQb;N0)gmfR8wDTSa}tXJ!ou$5Vq~j@rkhgq!4zg@?}6 z+PGqbMe85W+fxkjnj6qmdzjrYT*F`;nu@?;weGHZnC{f57( UYqZTGW-sUX>Ph)W2Wz= 4d0?2z}l*gdKE#UdcPN=7Hfea_*;ioHc~*h710QPf4E_GVJfwQgLeUR+vs_4}ou+ zk7N%{dki24XMI>;b02{?x;x7`(7e9ZR>;J~B~9hURCm-7G&SD^Sm#Qdqje=X^R>$G zN~a=y7?o?Dqt=TYs7ATvBmiU&adSpy$>!r7_Pr#E8t#9uHnZM(kz#KEPK!^iertMK z|0UoTFmyGbLmpO@O>ebt!NtphluA2XSD?<&q8c+0ansaX83BIYBp)YPe#CH zX{Oh*XYhRuA!d1|7f&MMLSc@zlHe~^HHf2D5@WV`I9HFzEUpY#-St#h7R-- kf$E1h7@LRRg6VCIs0sw+>ez%8^9%r{Vbzk6G7Ee9Si0q#gcLR0q!DSdq? z?A2iCVLRpvx;%m<$|ahJG7j0d>Djvh18l`E-RW9A+PT>uJL7ZSGrzyZEUt;!X`Lx@ z3&!IDAbgqNl0Vj$nPxv 2RRHrbl39)-pdu}uA1BA9_2O q8zw3MFlh-d9B8($aS`P_Gu-L6=$jhJlY9UM{ zWU4r%Gv45kjnRlx>8x(J5FUQ*2hVK1G=?f<4Y|B$fz9XqwrY#mK)E!V>#X`rDc}Ij zbxHB-!~H7q!I_f72vW(9+DN%>wgFTF6V)3Q+Xo23+n{;A8Xm=w#*mn11v?yyeeU4f zx)Y#zacP*zuGyrys80E;4MsFH#Lo$8>(ZiCB`mU7qE3U3Ps=7>Hjbud>!6w!&g?&c z-ela`l+l+6s>t<1FHkINmnmd!1M8oa?Qy2~NnY@;9sMw=gIcy+S+JRZ;#^=9{}Z~9 zKQK&6S@8XB&)}-ns&6E}0BVhvbn)PAwlkXd4#Sd`6|#!=E8_&>TCrb#DhR@NY{2UQ zK`%uIb38JuL8)&ly3x3<$qeM>m-eMVG;%<8{H(=mzP0-CHOSM%$@wQcz@VWyh*Xkn z)hWXiM`9=ykT~2qk{h;?%)TpivS)c3sWeBnirOE<2Q_RHQ^+cAQWCZn!7cEJDtQ2Z zncD2#Om>fx6Dwd`P65s{ELXtZ1U-$l*-{r6UlVK_6o7*`xOPm8>SPJ<%qejr(|)*? z$v+XA(P(*x0YVqihy&WW;Vq6%?KLp cc{ai;a*Cm3uk zW}seixL{s`Ubh5~n@@M?vV^hD|7@iOtSIG&1LVoj7xlpLk&g)cnb1@gzhY(qe&56Y z4q;zG%NA_}D*LlC^yFdw7nV}IhySYyf6^f8wy|csi9dARU8dDZIP-F(`@|hS@5dfl z$>k!~F2sJ*>L m56THy&Mk0j39g??vg;6b{N~aesvfN*o9!Rg4|U zX@JcqW60f0q6`a>L64++pYpMh6F_MlJ(x=AKntGf@8;CJ6s5Itg{hi-B#-2Jejnwc zPtOYx`8i4LTY-3j>5E8!PYg@gvJBcT065CpC?aPdvs!5jb)X6>Y}=V063N@*cgUeS z-?vt)K#*GG&XFPaDo@wRbNqHQ*-Z>QNMv(H;;;}DdRl6Hs;8nA?~TB&3c)E#y5Hf@ z42P2U4cT)3mZaNhZeTYu5BxT1=)@8i0sTQKZo=l6XLJ+PZR;$$g^x>JV V^t1{UHdSQA9Jn1k4YhL%%)XKhq8)@Fa7;^L)TR>$@*#%4aiQtqT7n+WR>5`*;u- zs<=>sviGISLlEI~vycu(j4z{Y_KYO5ynF+jz%75suN3{}G*f$cH5MaVZ~eHN+i|v$ zfb?Y9@_t|Z^mf}P9)=U+y6Cn&l;%e~^X rRcTZ299B|z*Lobp?HDM>n)eW7OUGtmGW zK4mSFm0Y-8>uBS^w#<*1c^7Fi6yi9`j6NK^krF^w6!lNZvVs;Za9AcYyzwnc^sP)b zdzvgfV=?v;2{gNu_*{B0WDH`UkVQDp1~L;G+>Sf|`g6IDo2If_gouLRbH|zeOMAJ5 zAu6)@zzfo?sZgsDlGDGVM?mcQ`%D6m?i^uv1~vnjl9!C)VJ~O^xktO3rYuAuVfExD zRB~Hy_xg@!u*VB|FWV1JLrfv%LifVV@wkT8kuG4>6V{@5aAFihiuKXgf3im~bb9Oa zLGb4OvY&nB>q`m?$g903oI21qE;CuRhb25K1Ty5|^biYn|C +WZD^ zOzY~Rbrjt`W`vCf(BE7d);QSHm knLbiNNu`fyg~x z=0yPi1wARxHguEl?_dQ#NwUB^H-I8|LZYkKhV5VR)}{~A+FnvZaDE|zKMup2Yc<2e z{SU}!=bYaYn5;ojIQob}9FE)wN@aiF#FVy>vhX88de!Yv&k?VQfRb8ti@=BWTDPoj znCSR6H7KH~RabYFSCP6FF8uAvz(w`|`i>Mldk-tydv|{|__ytcy9cd+f*_x59zBHa zttfrtzG;=HHiD^1g^+m=Etlv%j)9TJCw~ag#46lSQN-n5U`t&has6r-AIU@b?o{#t zG!Ty&YQcHnuP>LW6Ue6bFA||3Y{2L}#m^F%7zl#uULmq2m3hdPQBTMJ+%$EcVLmAD zIMMg&=?<32)C=g{jB}|dS*=XZUYyw-XwFfzLZA-JV47^eFdpTyvG0egS(tD2BGd}U zor~cP4$@K$lC_7{1L8VG+u2KznI<_Kkt9=y?S2#*J$ l(h;}`h)>UD~6mQUu zDyLT0P` v 6WeH0rM z*P4h4fzh0&RBr!&ti5+QT;KOEJ_wR%$y=hAcuPbVL@z_6>p=)X5WPodIHZuMDS8_s zdhgxnBf5w>7;W^?+c4#KeD3f2+|S?l-sc&Qv(H|8&pystd#&}_Yc1Yn<5wmKH9tL@;esr&NM|LgLpA{)1De mko&gh^ireY z;)QSmXFX0Z!G8Am&CKlhxrD-1quhfiayX=4FuiX%5_-XN0!+a-ZlhT*&nYsfxOkCW zSH=;2Y7Yi${)Hx5` s(4 =a)GvW3~QkdzXD7g}cd3B=}-CGJ?F2JcWl? zO^BKguE N+6+LeRHi5Mq_X#423k8mr}Iv z&V8;q!oSJq%$+)z!=C_Ok1Dl0c+gIb5+tQJL&8pIr|L>GinK`ewB6q)GSP06l#?*p z tMpV@6H`#N4KGaw2Kq zFhEXgE1G?V#kk`j4t&xrCQmY!tq2YSu~1M?r!1%R
W zfg;sccb^`W+G+>kvj!=2$@?iz34PGp>?Un-8@x}Ve0yY+e1b10p15v;d5q&xrX_|u z`?Fh-J-|!rP`wtDGUUAe(4f`VGn3Le$)T+vf~}!4$XB|*?3nwbB=#kwf4wzDEn}CR zFRqR1O+Jp|+Ln8n(+fPTweD^5-cOfIzgl?}dBa93@Vs5Pp2&L_kuUS|Y>FSVgg(To zvBtnU*iZdz#!7;>_Xo~#eB6w!gwVb-tQerUKfr>9Dby1hk$dJ)==BW`-N z5SqQeb>damI^M0vQvy1CcheiTvF#Zo`&K?_=Re@ue_j13ouLPW>y}UU9beVt!<6OI zTyu(@NuaFXkh{ xyhZB67hU@~-p z7eh(lec-0mWq&X&6*5CQFh6sSg!|(edSx!<9$cvl>h*Q+cz8lg+$kRHIPZg2InOGj zX+H#0KpILCzLFGl+druVJ-4LBzd63 |>gqILQie8#_Yl8@J1)x!$*&> w6V;lL)_%KZ0 I>TdircDxN=oW z|K-?HBl@}OyBL?c3_}@DZ1Po+Ov&h2sasaVr6Sx<7ShpQXnthf8jQ{QwR}68OFpE+ z>hA6eLjBvMI2#sqCHCcbW(|`Ofd7_!bWheJucv=&^WFg)sA%a|1y2dr98T1DIdGbOub8KA*54LO!;UwHr)Z$U;><5qWcnu2@P z^6m7%#b+An?v>yF85B0J;N{*GUKC}UW`KMhF3& htw z25Fi5w$q?t&FV{t-LvdH^@OzU_H{RiqL0^CA;B1KE*<0c-}?*@(eoAA2@Jdh#{zK@ zB1 rpqYdy%_f|KfPc_dwBFN6wE+XSHD7@;Ktx8BT^2K=Ck;;-04pIo~Xd zGMYm%{E&>IEKvRWOEL8O&X0C8q?5E`3=nwDp4s{hu(QorvkW~=Yq8unFfF$>6cHT! zo7F Q1tU}zo-y14?ahe zfB)y_HzipnA(G*HM2o>2znUET2bVKVC5b7EljT-Ht`k{L7+|{#Y?^b*FZS;wAp(Z9 z-qN#K`UC88RE3pMIGg1}{gs# =R2pTeErF6C>pyQak}Ju%nbP!( zmBW*t+Z}N~h&>^Hai*FoN~Tpr-C# pO`Y)Zt9VkVo0~8Ycro4 z@QFxx61urhRz%#^n2;?NCBsBk)>oF2Wen9R_*Zp$5t26K-_mkL)>oc4xHwv~T1zht zB)WQ=7+5Ek<2U0Mi1PEy!vD&*Y-HM6PSSh4Txy?#IOl^c~lD8PYwbjqVsXmGbVy zoz7PZdOi#9&JXtof7K|V&x2BKN_Yb+C=rfv#E&5;c Yw zy}0qlYr8}C{P %e ovkW|-oSzYCST$!`8Ct2D;tSebYxZ~o!;kVZ9jk68+ctMl7H>k2rOZ-{N9 z)qZdZs{Hh3QBRmfYcV{dwPw|t?obh|YsO!u9Wtjojw@-+m!l C*}nx!Q&u=#$#O6LEFqd>TV5@6h?X!h@)24&^V2-K8`>*mu})C*fuN{Xv15YMLv1 zoUg6)iUSqq^&croh=o7eD?eEK_Roh|^NF9$QNS~LfE&sH$tyX+qv-|GP!@)Y33J zs}AK#2r8f1R6)pmefC|EK>A(`mxx@L%*#{m6wcJwBrPRUyEWlFfGBdN%__RambHwN zanPw4zV?Y4G0M;wUQnJ@_D>koOWsN!j&Ydh4OGiy% z#N+wL8lcMJ7_ncFRD9MKbF3kdeUVet~qt1+<)Jzw4)?w~oX zZ42FtHg3I;@0!P zXw0-f-Los4_rNutT52a%{G-DKY-4@mDIh>jU_dx>V&A*qAf+KK9F_%guO)traraoE zPw9DUE&A2Ak4=U_zl1d|H(8j}ZJGg0-qPCq)KN#XxVxuI@V63wlO4) 5o3z` z;R1Ad2Iei-4?5lhw?4)3dRfz-Xq$|qshv3-$Df@RNP@;@bR{>pdlcro{cL$Xuy^(w zv0)Q phS6EAohoLCBiE&+gmq>P)?>*i8-rIWr>kduhf- zf~%}D5mL7NB|Y&_CuAR1Db51@_$^t1YMWf+#_i^hqxt+e b-QqFkV`3j)JX zqK(0jN=5K@m_%@|aiXnOVV(dPr1Q47yJ=9#{tYm^JS{hNha3-(&c4W+xN}@^k0iH; z3qH;<5VA4%ktLzjKDj6G z27Uqb&!3bHcWRL*rOnrLWn=zK>i_zi{_r(SL2>^bkN+K?2d`nV7@Wz=IZ?sFL9*)H z-R=st(~Wu7+ntZH)Xw>14aesDSqU9^BIa@S3A7qaDJRC}?Y}WL3{ROLU%y_98RT5j z@u?xRb=VNk@F90e1Ey&{W8Zg1i}$4ClQC9bkr@hJ&!LA;6GS |1Y zQ<}WNC-6L6K#A&243`p2A_`q-Ouc%dEcz858rp!o9(TyXCdk$HE9`37hFG8}ng)NF zjhOjXrmk{xWv$emuCW1kjxNFH(L-fSxdm;5{YpLLsA9YTNCqKp$V8c<|9lU98btTl zoEwQmI|k;#@XZtTX)!>@7eecoqY_g9 HC&5pF)MvHqV30{sEnDzW2Odl|D4 zO%2X(A9Lpf+M$3Xhr&bxuZP{gK_@Si0T)( 0Nb?XlMwXSs4W2Qz^oS%`aGSwssveqPzZ#_~5N$k9oLL(YH!!e2<$;JFd(ab$Zv zTPov8jISql>?Y?Ac@t@hk-VlRS{#o0H98?a-XCUaW@cmk`UlQt0+r_ani?oT>X?~@ zCML4LHI_~U57@tt^KJ~^|NM90v%EN6p_xKxo|@8YG#pz&b(7MZSM$;7m!n~M2Gxvp z!Re`Yslqj4<|Q$q^dwdN+51I77Ghf4eukRLV1P^M(Gr1^d#%@Lt%gf>p(V<@hT|tJ z_d9F{2^ zt0$y2nN^$WLd=^#`A?9&!ol_7as1IA`zE%qqtYBHVZhwy%sKg za7uATAim2tYbXh_2>*lRzB_JpM5FgQrc~U-VO#!lh41HwH` 6y+@8qM&MkFZ(U@Y94^?<;OUd2#~ z1qDm7N7wg)z((9lXW{V%&z(rs<|B!Xkp#paNQU8r?3S1#SZT+h7b Q()1KN$H^ERD4aChd#Y9GwCLx~M+dtco7p@CF1hS-Vc zeT5@C?JW8)Wio)47P6(1zqX;x4bKNyeKGHlrc=yEM|62bE-DBbD;;CAs85B*j+oq` zTgu|}q|;3Yy#1U>Sp#0O7u7PhYHngX;qT@j$N {8a+nx*_g phQ# z%7RYmVnwE@n<_V JjdFctG!(gSMo^-S{Ayx+(K(!|iJ^o0zWUc)Q_paZdxg>HIZ zSArGyAD1cLi<8O|@S{u^EO{3-vf*?K#!UhhYiJDIm%-f>m9_KP5)%U@&Z#=Vpmb7q zc9OVUb&r `v!lz__JfW&;vI zs8X7ajnuLnGe6s?ysl~EFYUv*%L2yTJH?RvN=|Xw%y#=gE|QUc%ZT|k`r+~~cCk&K zZFo}1h+$+aj*EF=5S89lL1LODDy(-4HGJ`b$}IqEJMHL!!5bec8>~+A$R>%8crIX- zDc=iNg_b=o#MvD7$ 2BI zN#qdGjku3~+Q3{6^y?|cnefOTP2)Dv6cbk(wz?9-NPRVWk)d?Qada~kMCFX5|92Ru z?xm$?DxZJo{Nx3bZYBTw2dJjOgrSE5)R#*F7>Ce}4=Np0`dtJ611VjgN|!57YO!RU z |=}OKKy+7zl%t=cfTt3w<$#dr@-I#T07CAOQ+N1aa0pO*a3% zrxT7}InQOLh|?XvVOBNYOqbk*&BaLa TY(jlb|ZSys~1oYDqQXc=Unm~oyce^sw&h3hPk2lmIfA158 zoL_Ti#s&N1m>F(Ss&E9?rEC-JJZ7i-V+~T(uv2k%c1=hTKfDx=23$Sp!rf7^7X6y| zAvCRY5!MdrJnZ>636D4)J?2M4+Qkup6IOQoKtb6ZG@51WHMO=f?$;z(M~hVHGq<1{ zXV2Yo_tUlSkPsF5%u7#$Z$I79Oy<9QH7_H$E{JK;;NgkKBLTsZ#&Ltcv#t~G3rpTp zs@@=5e@b)b_TjCM_a8iX@U(RGe5pUF|2CPxLHgUh`clV|B)QdooYHFGVA6idYM?pl zz#9up?{zY2Cm!>?Mjz76`K@y5Std$3zKn_(FOr^=82nir;aAiBjua)9Z1rHwl9=T3 z-av955-IJs@QFFLdw0fT$Q~kA*Roay`|a-$4WOYS)A7soQt>iEzyJqh0n@>dCu31E z8TFg0-%CS?g8QK|tI&Kh#UOM5eIJxqHVjlPnOEYK=-wRudLn!rGca7@NT3|$6%KR_ zDC$n=|7#u7pjd_%L}-}umTK>LuHRoc3g74(t8SaKJGXU=--(ty+|VWlbjiAm5i+h~ z!J)6u=8lb`YP3y{^EN5^q#6&}TLwz*#H%BSM*`_|@|wQQzs`g-nyBsvKT?k|2DZ3U zGEFDWXmXwy4GZ1luru)O|GNpDP%7${%PXPdC?!#j=619CAKfLvlf4M$7Q{F+l1u%z zh4q-Z#Y_61(?@?F5KzN2sF(xXtJ}7z5@R0=)d_jtO4TJ;|98sJi1wd~Y<_2u3kr(6 zC;TxTX53|68L!P{&`lvsqa>hCL|pOy4fCDuw<{~}4*#;YoT4&r-J)*(MFuT4~AyXvfTlxV_Dc<#DPlf8MLsaf* z!=)Hy^ff!OOB6(Hg7r?g3cBVtyl(}j#k#)w&dmpLj5i-+3C27zAFl#_M$B7gN>~WQ zdo#KT$%cCGv)lbi`Xk007X+E!bQB2i3M^%62 kCykm8*oX%z-IeS*d zOHf HCD{+nN&`~q>4aD|cY9$2gHKRgs~vz9bRMdNiKCMQ?lEn>A+Da@*)Zk_() zsCKJRVzy>$G)jyD1Dw5#y0hu!+~Hg0`h!){hCjlhJCZdy^Wb$? Dx)p9y<#zFEP+K7shRxNGTI_V%qL;VNq`fDfHsH?yZL8 zgVU@axZ9NJd8G}esT|`Gxz$c%SA$VuN23tq8V74h>we%b_oP(2C!wWQ>1Dm|9{QeV zl*#V0PaNsMY1qDf^XBn1B!Zcwsms0N4>~IpVS}) zMZW=sJe4xj+sJ^h0&7Dx=h9O7bS*|RF>x_cv~VI (m2u9nSc5SIJ(ayDz9M!gM2>bsnz4E!y#bw2x@l$$uVP8TYbnj;)- zL6>V^Dc`L6Zbd-F^+UeJ(7Q&o6P2$<_9F-2m!SP{^G_; r;u8sNoCz#I4HcJ->a z#++K~&P#O8xgz zi
AO=JOO_r1N3Bmseex~?u{r5h23p^9y8NyyE`+T;*F zUSZ_t7pxFb*U(trliEFHo7|F9%~k|599jIod@-0s(1eF;i1YmT@#EEW1*S9m*)#gu z<>j|OQ}Xr42U=8T582mFD#JGUQXQN>Om!TkTz}#z>6pUeJW_#qXfS<@O;1hTx`y0Z zDA4D8_FQvy0I$V}jud-WcPBe%G&{-|8v_;oh5Gu~ll{--U>7wuaV+ui?bHYLKuufK zxtAtyw5W5Dvt`wzpu5(%TGx|be?7xwb7s*` lst-MC24Bo~vaFuS^=&A6MNA);7o5(a83sH34!HE3$v=^W zh)|^bX=sLbg!{*mR5Id@%7IZK9?=9+w34N4*%D20(J%h@f*qF{&kMVVN1VaYeyhNm zSs1Q%0o~MP4Nu8NOWjB5Uu@7-6u$@7*pdhGh*;-o;(*D$3iALajToIEf*8o{Q5)#F z9GZItKtMyNO`&v1dvNOt8QGB>>3J#1ypP1Jo@0L#W6i1SNdTBJ&UN|p2SXQp&4}#3 zeNP~?@c~$Bz0_&G p_|I~m=o?d1^RD^){ruq?JfBDiWRW$Qfj_F&4Y^vp7Ap%KRVRKr2 zG{x&!86Y)iN$XE-mz}Xq?b5gfV}0{P((60z-YaP9gVM=Mp8X^~Z!UEI>F|?0ez6?a zKHbA+?CosgDrBZu#&&_eF5wKGwc~tu9rf BMskP@iln>KLJYGvN>Sxsy5@?OyI-nK5BQ z{4jA%yUKiE8&hCeCWC&A*hwF^dWvrDZW!6wc{4z t5 L(wsNK_KO)E4<+EZV^ zw@#$SwFUS1)BOy?WRWO4xo->JE~Dv65Mj;d$&*=;V$=e9i2EZ0o{Yn^k>P3q9q#ro zzPp?qZhcWh$+BCa1CGn?3)n9{DaQR%Ab8!N(p8Vgb;T$7X|9C `m3Ylw?CJx&f9UgH3jD-+w%_x;o<4W+^vBnj1^y%QRI{D8ZkZ-&1 =x71KpnAl7cskAv%iT}CN14X-YY6(##l4G zpy%iw8)%N3&CzNmDg`D(5)( ?4WpaMEJ^WWuz89jlYD+`2?VDxF}k)|902uRjf??<4%IoAwr-HHp3aQ~P_?X{Pc+ zRp$-ZhY}@{A;C2cv{8D$A9bUTM&u#A-vct!@S)-1Y#lFT;U1_Gm-;Jb* *{wn&C;S!50vMC(C2|9mKF0KL4@OO|JZjw|2`;sBA|H&9HA7>0#B;yPJJ9-J^McPk>z&^}G8@Ln(+S}NQ!Gm}1n1=*;|W{ZVmavy$=@tz!qr}6 z(t;4Hj$ENJna_0a!G=UzxkTsmy~|RlS-S`?@uB2*TivogJ2RuT<4032Qb;OKz9|=v z{9>9iU9vg=Y8Cz>@B@KWZ}Pih!biOo))<}2*{B+@Wr! WP`etF1NWF}?D^qV z_=wWjZ_lTn)j3di_)=33U$>wp%D7g64cU_Bjg^YOJ)~umq@zy#V>sQy51Oc_pSK2& ztFM&)H2jzH1&FCREQ!}JRHB$c8{N$832yb+f>0I5?sE?_i1NL=&ME 0L#{k4>IhwEsIN3c+KDqIjUAAX zP~}zvgZ8{-D`#qWLqyM$756v5`Ah2w())G21k@_p&f|R3T$kv4c!hiLIBWAW%;R1< z9oq;I)8+(ih*ni#8*fE-k5)tFDz30ORp8;4Rmt12E4ex>T$n` zudD1pM_8Qa1HXuYfcc}q-@w639#3bfuW4b&3m!iAS1Y9kZJ5a3zK~MisZI$#bBrji z?XOIFlsYuNTd$A|QjJuPsU+7nwBXI-$n5s)+X|S6rqWN+#oLd4$0AnU7}h#*hvp^n zpM@4@q=mDYMY+w_0m{)MEXr!liZHfrV#RW1L^7_Xi>(QXb2@Pn45#7P2KrvxxhFnH znAZ(2-dp&h9=rbWuBiL4M9T78Lez12bu|fPS!9@x5M7yKGY!s4X`>#<`H`MpqR(BR z@i>d7BuU@( ^x3+9{ZOF*B4NC?h^%)P5Tj^BIk3%euc{gldc9Asl!F=!+|Ae&f?l!fP z6&y6{dtY8TnleOZHjuj^( AE=Y1a#5d2H>>>cRi&DeUvB(0T~fCF6D{|%<$Un9R9jf47_k>*Bg z+L&^rpDlPNz;1r0{|hn-{vF?^zZl+npAMz|>HU9BT F z(}A(S-h^CX?%#pz+ZM;;39*|)a}|jJGBawuz`kw`{zE#mWC`hD)q}*o@7jB0{vuO> z>lIRFc)j1}l zS3IUg&el{&x)VwflUIJ-*>Hvi_62n}ReW7HIaUys5u)nApWoVJ{R5-lJz}I05EQ`! zN6hATA7y`n5jr1S+*Vzb1PzH7|E?IuC$x`)D*k11D{};K@b~g-<)jm)a~kh5>@ZWH zwDC>G;5Ej8x9vAE=D3Hq9uv<)(fv>cL{E9eC1vwnA1yxfTNo#@HOYTg$tPqe%Czde z%-02MX=IaNAw$ggG%M>X_=DYuLx2u}YuE?IOoNe4il3tnpzW(R=KfWVs$0s;`|&}Y zi3!xY>6s;@My2>aH2x 7`;M6UzKE@Z#(2}5;-lF>A{s) zz$$M#-P)qL5~XCsKDzDN*`oOgEc7k;k5-$Hdq>hit3EdB1nT8atmTq*V4akD(CD}P z=4t~WqIPB&p;Xs(?MO#h=A4j{W`l>6J5*sOKY%{NKi95pm%Y9N9IPlkhF|x&=d$(& z;=MJeO rh1^flZfYe7{drERvn zpWVMipoZvsfjAHl_X0Um7`)YRZ6jurp9E`Mu kavjFGIRm0XtqPFclqI5-z%DDs#ci DCI(7ggNU@~ zj1sAKXw#|J*?2H)R;=q^Nl>WVM{9>e=Ly7 !$ zV$)Uxeau0Hn7pvzGp~c8v9S+_Tl&eq=ZjMr*Xx)0$4)?P@biUJGWTuej{eUHlY{aY zzBk!pz_j{MZ(BzPr)%ls*!cJt`Y#^$7|1=FQ0c@+>^7PYA)c+k1Bu$dZjb!5_Yf4C z=@}5B4wPPgmz$V*{Xj_W3?{CVo?@t_<|7lXZu+$0>qkR1bLFS7V^F5L>^&lUr(gJQ zs}4w!_|@QWRln}*(u1VWA(j41(z5?xmt|750n(>dbOJvP;&N~AGiHLXw$5$wTz-W6 z%m}EWx#Hw+%gk$-KO$pkq#*s29TYiX&BhGVr+MX31=3G7$4K_V{DO;}?{{yBX=|ez z-v9g;Rp;C7EqJ8 bZ8zJHd8fQUf}kROPA_-Jn_^7Pg)lGC)}VKFgzD(b_bZ5;g) zaNSJwvF-I)+VrE{)BQ(z;v;R96jZR^-I~2sWbzFisK5z{CC`lF>7hFKYI*#Ja2mHQ z&Bs}&y*4Lb@3mkt^O+jWsbz-hy{%v}^L9QHVTcvYc!gl|@%GeUhB~`%hsbK5T=g<3 zYQ!1g*-J7_$PCo;wHO@g_p8som=pl~@&1@uckIQa?(G7E$<-oU*IztByaAigZM9VA z8u4n#$9<#s#f5O;hEPKeOXNhl^UR^o3X}CD$K4O9mHEAeJK*7=!z<9e5LtB+L~uk< z&L_+maRt8lw}q@NGX3!L3j#q1?nB+nl_d8qy7}zgc0cQ8vbKeJHZaE}NC7bu?3+L} zQAP$FyQ`GGSEvb~R+tDJSa3~u<5XI|emCC>nirEr*}AIs C&H$f1ArBLd(o!5rWBth71R(zK4tnOk!IeyXCMnz?`6VbQ zWA_a49 @Aa(ww(D0p?t?H_Qd09@3tFIk3Uwc> z2QFESojTEuu!*F!)2`f~NId?2h6nJGbI0f|x>{DVP=Q=yV858R%DQmkRU`}Tv8@J= zu Txek5oZ#W zhs+u=ZtDRktD5iBK;XaOaz*{ASF?m8Q77dUM&rVOw#k$;8{X)59TR+#ukD^rmSf6g zNRibGXY-VMC!;@n#w+nB$#0{EN;bN2j1UlAT^I*3*xtz1V;lpQN$*$Q!Zm1xdZd>Z zwbK~XkTGHaQWl_8^r}T+5RadD3wjMAmD)ujBoXgp9T%X*V4}38U-$ykdJRDxm1;ly zre?FFbg%b8#A>5Zg!Kiv2hr@b{5w;l|MY*BW3qH++jf{=I*z~t4&z6_6y68tMjq30 zYJ2BDuEbLR5P*Fcc2a?vf3xT^>ZuB+J9TnweAc7&L`Vh@eFAbITgG2}p?dT5R{(Fg zhfXCGN<%1BPn|2@20xP2C jp`CuDb~VDKe0}4ApE?VjpDD5I?e+ukAs@iP|!@ z%*UO9Fr>dv@~%JE l2K5b*x6|0;*9qv5r8MQhk5bWcZ{O3OhF0_Zz zrG1+SWekG8ge261_`Zp-C{<^OMiJ-|h;*Jm>R z%kOXf?~lyAi*NX^8|`$FEW!VM 2@dax^18n&6xNY(yD~+H{#ai_P7OaDfSrFal`YV4*EX5AG{7tQ%x0Hd0l=M z1o>lemg&bZLEv!f#1yrMLS}x?<$Gcj+-v;OzEoIYgM4FJbzcl8bBwAq4KQKflJk4u zcRo=~%&x++{+S)a#92Ry3%VZQ@b07a=v?^perXeDH|=KO(cHahy7|Uqc)VVINW>?U zmWCI_q?D6p{ngn=!W9s%#?WGcvugYaNXE$js+Bw!SXnSUFdw65%aAicPgBL?8=*c^ zRkc4Ody^YwHsx N2R6wf|(C|s-PM)>ZpFz{N=8KfJ-G_yWQgRO}CjfBCHt}TDxPfoR zwYxb0ecyXy>6$L<2OM#=M~;*#)AbR@eIhAnj#uKRd(|a_2{Y_;!#U1nSoZ<^W?$i2 z(D2k*caRtyurjgTFm%V@5Oc?M%bT0GNYRH*6K0Jbi V(1%-OhVS${=N8aq&UDYhF7`g@dZZpEFF z6G$tFvbY{098V<*F>?$M9dc%7dRW @ZRB+oZKQ`7ZvO@91IF z5@~*tCt`2X*Ci+Dh(&+H5$2$}BfcnIh;r-_EfJ-yJD{%#Jd%pL8P` Y|pxkymwZ zY<(iFnfSgZA)-y36cMdhtd9oLlQ ;$Zb*=*Iznm7faYB1$*KWQiYn#x z6wW864iQ1vGn?*t4FaeVRy*-(9-Dd48kt)w;AH^sHV=mGO{saH+`yOvd-v$}*vW*^ z#O64|I@6qf{*}B<86ND+BS%{A)euVm*|W?GnG l(?Pw*95^5MG~Bigq&I&k6C(-pq*3(bNsoF{x0WJ z4-6rA8S3ioKUQ0y$9?fl&6BlKEe^Ph^j=RorpKNmkp1whWe9VYkw?5ePx5Olh_Oya z+F!kr7<9<1Sfx3*wZ*deBAfRNOlXzD=yGivkBuXMd(hksW4gT1ZB4eXa|iHxGi*Em zi5m~vG;5}hQVh}k>*N&i`ox