From da0375028f76c5d1ecb48cc773bf883074800bd9 Mon Sep 17 00:00:00 2001 From: AzuleUtama <44248086+AzuleUtama@users.noreply.github.com> Date: Mon, 23 Sep 2019 23:25:53 +0100 Subject: [PATCH 01/57] Fixes incorrect description for Traitor's Meat Cleaver (#12397) --- code/datums/uplink_item.dm | 2 +- code/game/objects/items/weapons/kitchen.dm | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index ff5ec99cd77..a5155cceb4a 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -234,7 +234,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/jobspecific/meatcleaver name = "Meat Cleaver" - desc = "A mean looking meat cleaver that does damage comparable to an Energy Sword but with the added benefit of chopping your victim into hunks of meat after they've died and the chance to stun when thrown." + desc = "A mean looking meat cleaver that does damage comparable to an Energy Sword but with the added benefit of chopping your victim into hunks of meat after they've died." reference = "MC" item = /obj/item/kitchen/knife/butcher/meatcleaver cost = 10 diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm index 21161c2642a..f75818892ca 100644 --- a/code/game/objects/items/weapons/kitchen.dm +++ b/code/game/objects/items/weapons/kitchen.dm @@ -149,12 +149,11 @@ w_class = WEIGHT_CLASS_NORMAL /obj/item/kitchen/knife/butcher/meatcleaver - name = "Meat Cleaver" + name = "meat cleaver" icon_state = "mcleaver" item_state = "butch" - desc = "A huge thing used for chopping and chopping up meat. This includes clowns and clown-by-products." - force = 25.0 - throwforce = 15.0 + force = 25 + throwforce = 15 /obj/item/kitchen/knife/combat name = "combat knife" From 710a81bfeee7d01f3ecfaa1201114711ff72bee5 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Mon, 23 Sep 2019 18:25:54 -0400 Subject: [PATCH 02/57] Automatic changelog generation for PR #12397 [ci skip] --- html/changelogs/AutoChangeLog-pr-12397.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12397.yml diff --git a/html/changelogs/AutoChangeLog-pr-12397.yml b/html/changelogs/AutoChangeLog-pr-12397.yml new file mode 100644 index 00000000000..c6cc4a2fb22 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12397.yml @@ -0,0 +1,4 @@ +author: "AzuleUtama" +delete-after: True +changes: + - bugfix: "Fixed misleading uplink description for chef's traitor knife." From 00db74b3d042a855c2efc00fecbbab6c51672485 Mon Sep 17 00:00:00 2001 From: Ionward Date: Mon, 23 Sep 2019 20:01:12 -0700 Subject: [PATCH 03/57] Fixes missing Tajaran fat torsos (#12400) --- .../food_and_drinks/food/foods/pasta.dm | 3 ++- icons/mob/human_races/r_tajaran.dmi | Bin 2368 -> 2653 bytes icons/mob/uniform_fat.dmi | Bin 101601 -> 111433 bytes 3 files changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/food_and_drinks/food/foods/pasta.dm b/code/modules/food_and_drinks/food/foods/pasta.dm index 41de9f4f565..5ba56146560 100644 --- a/code/modules/food_and_drinks/food/foods/pasta.dm +++ b/code/modules/food_and_drinks/food/foods/pasta.dm @@ -78,8 +78,9 @@ /obj/item/reagent_containers/food/snacks/lasagna name = "Lasagna" - icon_state = "lasagna" desc = "Tajara love to eat this, for some reason." + icon = 'icons/obj/food/pasta.dmi' + icon_state = "lasagna" filling_color = "#E18712" list_reagents = list("nutriment" = 10, "msg" = 3, "vitamin" = 4, "tomatojuice" = 10) tastes = list("pasta" = 1, "cheese" = 1, "tomato" = 1, "meat" = 1) diff --git a/icons/mob/human_races/r_tajaran.dmi b/icons/mob/human_races/r_tajaran.dmi index 3f45032951d5781ce87d753dc932293a65f0fa37..d15b5fc9544eabcbf877ffcd7cfb9276d9bea0e3 100644 GIT binary patch delta 2320 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%0AJj3zGpIv*X$AsT40AlAz^x$v)jg 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

S03E3hZS$f<(d) zmhe!x+@XBZ3VFWYBFpX zCV8Rrg#l>?9xfFCx8?C&!U$q(zN^GDG?j~;^|u|%HC$(ujhh`3zwAW zc|zsg{kV{r8-tWBLHae-vt@tnDsbO=d?1?w&(}Mjf!7v17D$*#?;b} zkVf-w!&hg4=Oi;_ORo|Om&cnyP}FuN8SUe8w2 zQAm4l*!hizu+VzhKrV#1)22FeZ>Glscxr(!{mHiVdfQ(WD|sj>k~IqPVYaWweLGVq zf#S%zf~6?#$^wj%a5ZN;_V#Vto(&s8`lsjyPySLmmL?`*W}YKYzsGnA4)DDA{?p(BI}Z~ z(+7)gtwHzzi34lTSxTL((vvNf1*Y|R%G4Ce z_QDJnn)(b?w1bacQFJjsbtd6fXw|M3`Kd~iojk*Bv$Y-zJ2JQ7W##zR#@QXaAXf>v zpz1I8*HyYuq_B_XYeTT>yOP#~_q2qmJM+Z$BEo*#;^seN`aRKrX+15^iB^0jR-mdBhYRj*HpiOoRv`>|&F?9&Gw^2IO@kgGKS5^FG(^glcIl@XxN^IqXp`h`zpO=;3ayUhmqePIv^|X#(vsqy- zF<&@c^s62w%y4v~Rm79<;G)sv1611w^?yQj7!5c9yX%?UO-i#c+Ve{jC-m?q;B5jU5YaS1*tjv*}_aXb-`)4Tm`C$B3G$pY(Npx;%B}kr0 zCK%rQfC;mrq5>!tw)^-0A0>Q+p~Fdjy-v|7vb}AptDE|OQBIa!PL2u48QynvP*K%P z&jz<6=Dz<*JB$Pc{jlX(KEK#>r*io_HMB~jGv#O0AyG^Mycw)bIA|jD63s^kl8sL8 zGm-Qe7pZF(Y^XmH(!gXTuvGw>@e?n3qY0ugJ2DF`twD4wG(<-PJk0nBarnd%F5&&{ zOUVmffQKO+^Wy$Mg^8S4CsRf`IOopjyNh0CU4&2XO4;bl^Ou|LJT26+ph~vki9hT< zTTdNsV)FsH-sADZC#pHswecOO;13(4$csenBZ;xNM!r-MK z$xC4mp#RNPpb_LHuB^5@DbF3^qkVey^wd8q`@0Xi;2_M!6h(<%_Jc|s>}PI)EbfHt z(Umz$R7!3q>(t5;#mh3Q^N~MhrcNe6lc5Y|05atVb`p0-6c=RW=vm%QIg|fd>$Ym3 zt6X2<>V8r+66ExnWRi$N!NTWvFfP5A8PQWr^!&Ni$9X$;8+cD>bzwC*#v+#g#Q6F( zSMS|NsY0#L&oPOL{ty}%LqW8^W(&oycitBnuN!sA*rpZxaVPWCTpjD`kge-qLyO5w@ zRD=&Liv@_fV>^|fm#N?*dR52i`*>@8fic{JxtbmiW8q{~R{c7g*n``S*{MIAUsR}H zvwk&^m;dI&dH9l9i&=|>8XLXeGyggudva3i;YTgE=EQKA$lVR3GrI<8-*YqU;pv&~ z@UAMaxjFi&n%WbR2ZD^$vH5VZ>?6_$rjK$VN(_PZhpgqmsWs{hYL6+ie?mgwlO2Bq z#L;Sbnz@?nxx3WkQfK=~YIF9sT|uXa?`I6gsFp^H=Hqi#3Fcs>dJ&oPqinxSz0TeH zVxYgnwW+j&N#LbJ$=1_}B(lp-*675cjY-FQ@An7kzp#Bh8RB8YO4RXgjuq!1+-MTeqsgu>x|?2FDkFk;^#By} zcbm@c>aY|^>_E&`W>X0JfNQBcxHsGu{oQ{1LfcN3+zP+I?9MPht`%^hTOZmdBE+#v z>mH5iuBiw>TGEiZE=*Scj!b^8+X6J2dH_^q%Mww_%gfh%&k1TN$!6Wpi=^i_G&Iy! zQ&R&D&Ae@ee%KL?;1g<~842lUWef|-)36W5sd9P2*7`o#nFBWN5~#Z~$sFXq?RTW8 z#NBa^4R9sjUU}VEEtkZk3l{u&{7QSYbD%b(Mv36T$`QjgK;Fo-RdAmZ_cD3Ss;!x(N{?u zxANWNbxZHtqt~csjTRq|FBFaBFj;WDafNYDj#?~C_j~&fFX3dvZJZ5kGk%i{UNM8&c{r=<4eB^6pIOW{dgV3!rDxKz6$Nt!?2O6HanG$HlF= z8k0wz*EYPoysPbj%Pn^W@lpnK9Q z>F;&E{7Kvh^IRIS8lRZrrz&>u-!oIk&I2De?|Dq~<_hS1P%jmEu-KFtVO|LITjC-r z*Q*I_oE55aea%8}g3UwynS>9Y2p#IqLGGk@RuHq{w(=?{JRjy`mkY-pRG8|xI~~?0 zlsuoP9|DqVsk?yYgkD}YO|Pts)mp1W_gYdJ3rD@QOfjcS*=|m8T71_{-CO&RiumCj zquJTk=#u|YyQerRMUbnT7e7CdJ)_cEfzo0z#abV0xY5Z7GOCbIOcIS5t>8A)pLHro zW*wHS+)%fB^-dB;??o#o_+E(tpg7mk+eu#ywtO!@YZayHtH<@xr{uDmQ@`dG2{{-H zw4wROn)9f1CK}8#>&-In&kA5-+9{k&5K#`i+AKRdUqnY$FU)nEmzkM_PeN@PwC5cgvjVL-rm{Ln7ZogKRzeor;c*VyQ| zxVS%oSIf3RH`6)Uib&Feii+4jR2v;-~?Q3n)8aqLjcoxp#M%+*$=oM}NA>@o}-2H3z zwrwcmE2V--s{XQKK(pU<;YbBL+aZFY;H~MrxYeACr-2%KmjT09NGl@DbVl6i8oeao zs+o^~_&_A|$sLukIqRCHO}!JrPjvO#-}fZfygy6E93Y^pF-WPT*1Njw*v>`nr6`^a zs8lVj=G>04!6nD_)*+BuN- zez^|Db>@Jt&*-!f>EH)bL@4wSY2fCcZV`>n5=Hktjh+4kU1HapeKzq`Gn$5X%mX27 zf9#t}tbC@`!7@P_${y?-Oksy9n|rSD^{=df`%#W=F(KuB4EUy9`1zSS2;`Fxk1^*v240uTO0i`gpW(r)SKzFlJMCsKV3! zEvnaI(xPSuQ&vWhdh?t6nEB>Vaw5=)u7R5Z==fLXvHJ!v{GYb7{OM(hh(7lk8$;06 zusSq|Qt*QrR^zEaEz+&>Wbh`#F+@E#(~_Tm+eNqaZ+W>DPU4Jpp=f9Z43oY!#%h{i$= zjTm}@qkhY$l%les)||-Wr56scbk8G$@ka2Est1OEk1+5#e)&L509^p&sBEM1eFLDD< zWhiGk0Jcu<4WV?PF6x$t>cfo^?h7?LNtUS3x@+&XLiY|)QC)Mbsd~e2+J4B~rJmga z-A0h|$j&_nWW`11p|lu06qJMb&9-pVi3-w%cq&0IeiAWD+?Lk?anuAMt%w=W9%bB* z@&58)@wu_faB3BiEPK@Nb-Qq%?4ys&PmTj6bTc0HyB`~;e>@4yVZ^saYG0V!W%OZD z7$w{Qo}P2iI%!Ut0n$>z?v+rkJ^J|bb$_=E9Ej@&V~T#ylR(08LfkMAlLE&r+Ym~* zKk@N|4m_u~5-ca0kBzm6F4|Wn*f-P*bXPo+kQisfmsi0}ERQo~mys~ZsllChBpP%b&z6lpie~E|To0_#9 zYfspVK&Zur7C${@#d5%maHoDpykJA-8^eh65+_vV>+pvWvxjI-T%m=uIls+vmioEh z$B@|om>b|eb|O|Jm3Z`he>QtYe}Gi71|V@Ws_fUm^a}AWKbFJgh|qq<75j4M z{^e;sJIb?sp-0yVL`sI z*H|74SU=`O_Q*$c`Fiy=PM_uSK1^BWOi;G_+L8SVbkk`NQBb*^MbcDqe1SvfJ8U%! z{VzJ;vjlZ(8Sooi!hI#$vKTq>S!sbuHXy#6w{BJsw>CtK@}^DeEtK1H5|i(_c6 z95$~c4JXolH0>yH-}*$vNR63s=qDn}UMDp}K-6{mu6t-RbccjdF{y1tZvN%7vqE;{ zbb+@fc}K--n+->b&|oW~p-LXg)+uo|uBe7DPaa|B#>=fl5Ua3A9t^;SKlJgJ^bqFl zBw%u){Vu3xeadT)FjJxO24ZCtEa&R=J^F7N-WX!@GSh7SA+JR^g=w$~yU#9#!5@a1 zdNao*7FkfI=c7k*mi03DYGYq_uRWXD>}fCf4ZZ@|@x)i*Yimq#7nk?^UxP+)VawjSS6QJ zSq5TSwE5Rsv29p!WlyvHEZ>fMc1i!3R;R2K}0#us!*zVL=H0xSZK{ASrwkCvf zUknCuzh#mS>dj;Nbg}Q|l`D2vYKXs(U}kH6ET@8zo{xe4#bN9LSHT0`SL>lUVIj1; zpCEzi`i4_;b=wJAQ1Ee+r?@0_^a+!<&ic^%C<{b)KEYn}$+|XmAL65iVp4!=kP*P8l#EG{nngP&X z-`sJ}%*q)gO_mYt+&5tz_QO7DJmkrMqcOkA8(}LJk%So$4;{-R^DI1R#7H@IFf~ok z&zsThD!$Yw%FheGSxo|Gy20vqf{WrLlW5xX4%GxZ*^5UP?~Uqx|0c6OPNNn(Z&%Zy z^S=H*VFEistkK~i#iI1;qHwIKfT!!B0*hEGDWUXi?=MJq>Hhd^ZL1U5VH?UO1IeU@46NpUR+Us>i*qkQs!P`w2O5Hwkt%pbp4^uiPn1c_9p zu(zB-*1yX?#j8J$O=7T%&VT+LGVvlmL+FxJ22|CS=RQjn8u7D>P*9O;hh~-}jD@u#=@uc1;O399+GdA!ko4}34&?b8<92g{H zD^aMPMBJm_>nA|zn)X@E+y%r98hDi+7#LXJ(D3@;?S|VarU&hJw>(pgv$u5M-KoLn zxklWP+AXr^X>Ts^Y>u@RTJI}*jzq`0{IaH@J~M8ml%QY+soEJ2<11w3kx)- zd_#|i;Wk8IjAIP>=`q~2py3uZ{YkqQ1iBlA-o@^=a8KHuhhJz&T5@|K8}52d?>>r( ziHYqBsZH-Wx4pk+K*7LiY}AHAZ((n@>TkIQK5ppng75}`YzB}Iiqq}}aX$GB+~P}Y z-SxM;7hs%jrBC~P3;uWJXE%!9?B7JxvzY&@M^&plyj)EHTU%%t7R0yw>QEefGrCsf|=prQISFq#zjIfS~w2?zu1UjuJl$4pd@aC z=|A5`A>vDjFzDJ0wBucy_O%DtBr!8F)^9$8jCy5Vv9Dx*_e^l+W!j6uFRtgs-Xm)} z28xsBo7MbzZu%$)x@>E0RYt&jDT#;wGPv^a>h^jp3(r9QDK-b7qy3}1mjv@KB!W(% zD=xj*9#2@q1HFyMvp_r0p+A4nljQpnq^b8>kGgSsaj8&%1tAQV#i%tE`NgZz=;wpC zBbH43uy@$NAsdIacAxPH@CB4A?C0LRN6y;X+H*B3yl3CorgD1Cl0x9|5aTfNLh3E~ zUh(xX_rJd)%}g*Sf}l?txPKx)>m%7*xE|4eY2r`Ma??y``UbOoQ(b$n*J&mQgzRm2 zVodkY5p#FX56Y{!fZoQ|vPI9a@di7hDS5)x$r?wp^;=gXVk#7sF_rc+Kn-Fv3@FIc zj5ccX+yM++t53(!wZCs9MCf9ex#}Cj*w|Q^4UggyLaGYz<^l;)&d$ziHM+l*bQVum z+s4dlzQqh~^YHOaudF!G<6|Tb(O_d^)1)X2p9UYc3M7PX3jirMX3kR457CXF#Xjux_9on|+iQFqOFhH%onHoLId;2!F$eqTdXU z3dPaU@$oEDESsC)KPT$L|1upL)mn;)iO%mW6i95QQ3VE`5fiRg&h3c&BuSjpu$eZc z3Hz#S`GQK(N*X!-%J5B1(=Qk!S#@P4o7>m{FAqO|O;K62G<7hVbfJd3(coo34@Z$Y z!`WV8;{0mZbL!!6p(?|bH(t5`apLkkfD+OO^oAyUiOOTNy=0wR(S~7Q1BBzNz_3=Z zS^vw@h6diaely_jtBuEZ7ds<|q9xT1AJSP3((N1^Xp-b77Z-Jv=~4=Q{0Nqpj=1_z z1ymEhd9&G1YF1>5K|Kb`T;vmTms?&d{eWt(&pxcI(7&jdO4z` zsi!!w&Ofk!pV(y-1KMBX_nRdJKySttpYvFAJA%8}ZZ`Jzg$)g90|T-_(=uO!cYVT4 zb_rBfl)~T+pE@fa~0G`+3m6)>4blMKy)%xV6HYPJ|!&9iC)JTK*)zP$F zdVH%dA8`~vDx;lx#NH&uW(ijrDbIoJ2wF>AOIeFMFJMBD9rpDrt+QmRKYA=bUpJLE zw+YbW-+YOL#h~*KQ<@dejN6pqueNg4oJ*L-r;6Mu`R_{h1G?8w{`zw>Gv9YV%$1H` zmhXPpbr*uw9aa5n* zA!`o2Mz~w|O*nl#YrE>)Ot#F64CuH2z~-t7;kdI=jZLVdVkkY`{ri4Uhoq7Q02~EiQzQ|NK=Nh9Z9+t90qCroEEf5K(tq-BZ*OnC!Cr?bzqAzS$v^(bW7TR? zLK`Q|3W>a!Py$yVB_$=^Ve;vA9n6CGr3RXJzG$B414Qw7$@rZtR$D!qDy;^7AUcwa!pP3&nuJvwNR!fzA`H2J?D7&Eq8AeQ|4Qtj8AosXSeOj#M@!L^X_ z{jiR{o!Bkt_|cfTGPd&Ow@zaypThi(JK8@UH*Stn%0>p{6?jwVPaQ!eQ5o&qakJRbrg8g6`H*2`pzBVr4rVl0;n=m>!+aVUIuO!w{ctbCcE@a1zVDl9~% z3S%!0chn318p7}rLn<^Tt(`(LK4 zQQO}bK01*^bRIA60RHk?zqrBhGYgFWIg{>0!yGaY#79ar=zoSxx#!qWVMP&eHB|-# z4cXR!oWx%N)uL20;6*btGk8oJii)m0!CDM#VcSI1Jm?y<@w z4)o*&T1jiv==Qm0|7kq_yON^(R2(X%K`5ihNFP%mkG=_r1^D^-UB^57o5PzruUSt4 z5gj9UGB!^*HwDn9+8Jml4TLkMmX8h zxP2}UagmdIAaDShuSW&ol1_g{&vkqbS-+54xg>_N_=@mtmyeQx1mtoJ$L*LrE^bI*V>vMO1 z$DEfcz*6n7TptZg?A~mdX10(=j9r7`+d*_H>WT(#PEH9guiKcT4;O#le+Dw8@PT-; z{lmlZleG@A;#7v$u}PMC1GT>y$Q}zA?687>X(InhUcsAg`AJwvXnE}-z3B?{bZBgx zj1GLw)zwwC$DuZW-U@(}YARQVw7UggA;WM99K9E}Sc`D5hG5XOsKGOivq-OJ1#VgE zb7=)A8n}=yP)f|7rhe2Tw^6TJSmnTa5=a;cmo#0v`R;R6GuRHG2NOMQtC7U*Z@_U$ zI&dgM%!)ulK(SVfF3ZJ<7dY!#Yr`oT;m?z?Fq|9c^!yqJ8#^2TQw8PaN{fvZwPXPm zysmE{i6S?;j=&NitEkufH(4oN1a?B;C-PbIkLUi?{@0>6-%Jv4|8TLEa^s z$%!m$Fqtj5AnIaw=!=ep4kt>$ubnBc)Yfz(r|P0YG!`kYNe6ST=*5q`yP&%(1YLJ7el?pm6eruhhCt78&U`^nXU;B1Ur3)k=0#=7S#G|n6`~{xz$2?KwU&nQYGf-}X>9=;B zv5XC@vJLuUDvmE)-?r)7gSD8_KqtF_3BW;W^L}b^dzA`p z10<9TO$`kdeHJJ1*gtS!y|M88@`VdfzzkU$7CZo{D-v_*j?anZbHBXz zencwjA2zEqj5+~0RB!uqXe#CEco~gDxs7J5YZO7Dk+x9qjvo_&TL2b77{=jQtVjb+8plMcG#O5)0BSj5@>_RoRKmr_%k$E6&r00$d4ew9}qfKNN2 z?a!GejnEoLNONT@F7?RKsNTL#`5dVvO~SSy)RY%8ev*86?Rx^}a(Ns14xN;lwY0QU z;m|+Cw<9;YP2B#N50aOgTcX9pI`YpSP(}NelT)l;!Pgi0k?D^#$5$hGFmBJ7Xd$pj zgBxKWK$eUQ5FE%LCnpCs4nhsW%n`OW78b&nuG%lZ#)A_@A8de@KkV@b*RA`<$7y1Z zn>cdp;KvKvcyRntB7)gg3D&6Xx$6xU*63JgHf+@@vK(~9b*jFQbom)hFQ+!$)Uod< z^wfsAG=}RID6|@(<*ua~FEMe?V(bsg(+R@H!O?VaFeBm?CgVYS_yVB{B#zwe}rjv!4{E~g#0s;X*gm{cg-+}v*g;;~((TP$Tb2*+K)<-{-Fx_q)25rt`E8Sc!klF*WE{ zxQ>d#f8$sqFm zT>0m@>y1#HT<`003lnot{19&G?%DBuKi(bA*9+?e~CW=Hz%3r($O@ll#vv!vO#}UtzH1IYis+ z)OK=m^2)rz=ip2;A%+_7mljq@s0KWp)dNdeRrPfkE*JAhN8YM{WBY}s$HWp82>^O) zF%kK%69dtj67BK|c?1hEPH(?)kfx^Qhx0xHWo2aq0Y%0)5vC$pR#|z+fQ?%Mx?R9l ztIm{`9UYA^NFvps?>K9>17nX@Ebh4l!vp54j1wIpdS_lUaf5H68ODKv8HQh?AxoKt zAfPyEbaeE$E(-9a0BZtVk2b;FuAyanf=I`(8=z=5&d%0WRs#(zv6-0`jWj^a3Vyx< zCvJdW`{n=@F?DXcs>=|_H2@Q&DtOnSYq!tOkc83ABGqocP$|>}P&)~9s=C&e;>kaq zG){WrAF8_iPFykGlAW7uPs5F+u2_2MI8D0Ka|07J1WzICeDH}ZL}6Y*1@(%L3<8!F z_0Al6!*fKqBpZNNd-y>gY?xbSfAJ2`4~(QuC8e(fAOZu48-YhMjJ6$lErhnB#MVNy zx3n0#O}Ltw`9?J%j)PD1^Q&Koa|grR&eb+Mz*CMkb|boBFYz_9eo16mf&bkItO! zHw{&*o`B2wma66)R4p9NeJl%0ou1Ywj_15)fus`k+}_;O+Apy2IWC7;>Zvy9d#L7q z7`nRRF(qk?kBh^48l89?EjUyM@N8D*Hvr8b#q^u$G43G8A11oIG; zWWwof565U9{hVDI0MLJat^x$)61Klu{<3c%1y)dLjlR1(fpkk&=SN<&dIqW1hl%`P zRg)UKFEB#GH|7GOz9H8c&Y%6srn8#dKjk$@LrWp~8`75O!?B}5M$)i6FUo3&GkBFi z(nJB%R>7DtZS@nslk)?=bBW>Ffxc%lEh%|LYQXyT-W2g2AQ9NI^@*ctJ+N(IUKGRnf>g zEbw?MXR4*cBzssiFh(L(rey|*M**4knW?GGx5A#IJ{M=E1sv{c_v2oTCAbzuEw^ia z9cDF)#=tIL{4rV!A-^GEf)3&H^)H<=&Aad+)R+nILAq# zYm7C1<`|H^EWNlnSsejj1pfg1C{<>|5>T8yu;t8gno$c91}2C1uhn|MdLdRrptD@gXg6`&~GYn^HeKK8^=qG=L2%7Y?uQGp!dqmTJsj0H~_C zqhr-)Gn_d4YT2!_c`JrC5!}WMY45ael%Nx@AL8Qh81<3qTG?<$Fdx2sJO%Z1mbgvr znyHd$TY>%0VvWs4vOL))_}Yt}#GKKN0NKTj#^(twm!qOC$Ug4Hm(l3`Ge!K_#M@h7 ziCnMjVs@6Wx3`xS&-l%p9V--RL-|eH1f@uf*Q0l#>;}LmcC=^7c>uTqKGj*%c_L*FL)=OYVhw8Vz_Pe$%*DjyauaIRz z_p^aT$M z#WZ?)dcnX)Z>2stz{f<)AAN3?te*!I*oy)002C+hfw!vQ!uSiTYJfj$`0TIwonkve zUO7S<<2c<0i~+6B`w?SRfXf1u0w}kxOL!|tEh{I73EX@PvBeNOY&I{G>F6KOhN8kEybPT0_hafCmE1N47$Nxz-qS$(S2x^XkVMQ}7*cAW4#s&y)yh86v#5 z){IA$uU#&ardWK{jT3k_$aXoWO!~+PFe@tAie$Ls&GnQ&wfL_<;LBV`5oL8^r3mASOx;cr5;kvuK z^DKX=&@P;snwstmfNJx=PAVOgI&UwGORm*x6k?|*E-6(W5`T>T{>SX~$R0tjTDyBJ zR`d6=rmc3&KKvNyD?yG z{|A`j`j-*b_j(U)EnPxNGoU>w%GUh0O`yK)H6p?p5LoEN?8O~)jVkzAv)%OZC8RNW zn`ER`-|o`v79{!thvEuAEw3MQa0_;Vy+lFx8KC`~^5*ur9&=H^I}hPNZD_#w`R$l< zpqtX*x^k31^c?Cl=;u^Kg+$sLBpARE#HIYU%w=zB@C}7nOHmnk1$F>2u02sCfFI5~rp%x!PjdU+}&O?0e&e zm<~j=p0B!LmWvU@FaLAt%dmC*&+poqhCw@j|LgkA)dGCke_eW(U;fv}|01yf#{Ya- zrwyU%s{YqC&Xj^#o&Dd}Cpuyi!T-L>mH%J90P=pl?|*6mY8F}%M=bLe4@LZr1Q7;G z2Qey5Af)`ZpPt7;j|>eBt=;V@(8cA9b`=MJnB4#JB4hhcdEZ0D zXpl@S3M2>BZVk^=o7Ij~gkU4FZl6InS!$KvasPuQ**)hK5iC5tj+etfzAPpz{)kab zh|uV$$&}{36-}>QOm4khd;)Sa_*X|t{jM$m(9@gnc>=__{{3n)1!lJey?t_J`d;ER zm0xj+E0slMh%410K66UCkdt!JVhzMYc>h?23~2bhCH*y*#!j$ zbPdC#ll%f-m#t3Q@$0bo2K;ngd0A$N&o*P4g* zmGt{=v2DrNpx|J{s-+w5i4WYnw{4!sThA|pO56=t>NY$!dTv}iFmM~%kz9PAc0rFz z-Ggs}5z1Ou*!MaFN(U2puhwr^c=}n(?=@@JKNL_>r>-+T0+LIzvH$S|+-oHC>@74& z!C{Q}olCd$f1=NDGqb$9g~FMTWCZL{n~2;?pVkHEmWi=Yr{a%8NU-XUOwSSNwax%x z;Ka-zxfcR6*|+D(?eM$hLrMHNoR^ttYGoCnUlHL5!G?|j%R*}K091P!t=ap@*-7cO zw^A{_xYS>XEqJ9-8vyPb_`s%QO*JuXvZ%xxM&B$LTQ+k8Da404XTkdn+8f`U@9Do@+j}g?v z$(sz?bmvfIKxQRIw2n&rjqS$BpKF8;ZGn%mSNwvr)7=RAiTIKW5GCSg>0z0~dM@vj z)b!H(nDt(=j(I<)zJU2rFVlJ~!NRg0>iTMF0u&X0Mr+7*14ovq^9w!+dznRkw$;;)w$saZ2PAlRS;soum6SdB zc#V^blGHNfnDJ7Gn3$N+;h|#>wFoERQzMe632Vn0AJoM+-AzvZC?@C#>evz+NG7pg zUZ+xa9tyK!^k5@$8T(7qeKUvP#mD9sH@d;qz}0B5iQR*;4A!p?p;AV2eUep8F*<7C zp2L++iUX_EKgxKS=m?lEoB2evk2I@!kf;oehVe8gO45Cyy^t1(k?W? z$Uy+5oT%vlqRPONCQ^tjPai@2&t0$frUbXu=zI+v0nF?8WSp;pnE(a?TEy;;IrN<+ zK@3kzh^;n1(EVI4vDYA;{>dRMW*9pLNGxVW=t*IV48XAjQp`}9+TyUjcZ@XL?}bjwU#F@sznZ~M?%~J2X%2RLF z*9a}}@*|KeUF-by??~ojkm@n-Ox@{UU$44U|ImLP;9By07ZUd+kEmA)@fBZq zse%QV#&b3T7$P~w9ZCV0ARc4_0PWZT9K(}%B|8|1)4I-JDPQOnf!u14XS%wAnye=% zA|fN7?MQG$0JUrnqt=(%Bv3^AYa^8~-*UCq^RVr9sU4%K1bZbM17iji_W?K}Gfx@^ z_#~RUU#|CNs!)!svB`P8v&gMe{tH}Z2@bT0vhO}`x)&kVjSHv2FU^HH6jwEbZSbDn zz$)CBU&*li2*}X+xGOwO{fdUy(G&?YUYa@@NZyh1uyN)~5f{H3kkbh4zkx>tz=OQ} zXEFmev!Ov_BY`wCs<=FsW=Q`6aV54px_J2?2~QFQc7GMiq|Azp5mS!cs6jseU%5%mXM-)&0xbNYuH_z@cEVJIfmbY0?v8dYf9 z!<7H2rLn{SyJAE$097O&K0u-IgGi&NiSgglid|};IMx%0!i8@@~-nMxFN$!8a?(*(d?^+bahg) zVomvFnGfv=%((tpo*{2CetBw0ka30!3?xun7)j-u@P+Mjmel2J&COh7=$|7vsmQ0-T~|jU^;vtY*cKq8(YT5Qm}HS5dqwYrk^~r9J0Iq%zO1r$ zn96vy>)rG>Is*2zU4o@7rE6h8kxg5j*MP&~#WCJDhz}d7?H}wvflGe4+X#(6X8nh{ z9-cb^G9K{;gnNOpxW8flbC&`Id%|$Auzns^fdiwYXT!z0U~G@xdJhyJ;P{GE#cNZQ zr9L+NskuziTE;&_YGNmyC**4lPkG%klLPJ!uI!G|gzj2H3KJNx(JdK}M~OJ(r(XstkSfd+7NMCR<~Oee)7q}^%xao}xUcCzm+;OS|J z4am)H)2h#4PXB{K(Y$7OalDF!p2T%6e?TCJrLVoJfS+_rB(-_9h^7WWP3jlX-Wb zvfg`kR*hrGfTvBv$hw#-IxJp8G}A#A&8RUr<+1(|k4sDaQ}Pmr2_4OtOLvhX#rD2= z9L)<|L|F_H+A=LNMA?Q31sU(Z%6_}Q5rqYPlRJ+g;^Ud)V|H&}_vFBPrc&6eBXj%j z0&n=*ACoPYC@I7g*fX+sDq`z%o^3`9^vEFG2>wt*`DW3A(zFoO+?8F^^)#E`ORu_+ zL((PzH_vHMaRM&sZnV&LERh?8KNO%tY3OxNrhju=XXe)RQL%p)mz3Stu3!EgV0)^7XFgfy`Tzsay!mHz6bo30J7~=8Uo8M@{h!U=$V4E9 zkNF^I_-8K1d?I0{Nk!_dWL)?(=Z_G1dRlmrVxmf-%bMHVl|BpAta_xm5|N4cB_Fco zzcmFuudsW1|4odEG|d4#z4)1>Bl^aa*8H>-==!6V&K#&|F?~tRVZx4BAcQ$_Lvg&? zn71^~xOrkDWTrk`!n2cC;a7lf63DDSZ}7wBMlxY5TYq37wi1#0^Na8}a-S8DfPif~ zcTOP3@6i_T8Q+8Kz*u*{9;L$tqr>?Jc@B4fhg@t6!V(Y;32la@@1(_5>?MVwztR0& z2~k4CbK3U7n)S$R-MUlI6`NQQEPaP_>kUyAo#k=#@wGI#{Bp>h@%aU*EFtJF6S8!9 zlc$@cFS4@jDC`4oFXNHRUVvG{|9VzF@Gtyc@jL<5tsX7?x&t*2)~Sj9y)G5AVrJeg z?c9Z91+$gjKyTZh=mURup1QlZxEK_F@m+2#n=g~6mK+~^bmQ7}X0O5CIb!zGHUTL> zI1GUP z?PleTFE0gTgjC*qnHY37e_B;CM8&X1*`z_weHAvA7$%;PIrX^NJyD_SpB?T{r^Zi2 zU3y#^oRRt35(H%I?BQh8qlw>-Cz?cV-_qQGj`|k-fyC4V#HQv?PaylF9t{grm1ouI z$32{V4i<9~0x*QlxOXdyTPB=*?2}q5Z}9PwUnW^WSton}&JI{3x)S8;l9&z{UPEMz zolAvhLQp#@O;;QAQiiEH&Mt$~kZIZSZHDVH7p+lA@dyuFaM+uazD;Y@^!sJxxN1`g z%~%*y0gwq^YoY|_d9~l>Si>%~vfs{hVb&Y^XU_!AN4y!c24Be`FptAnh5}DOU)rl- z<<4S(@JZpdi%WISaZ9jR1AN=(ywrmE1}Mk^l2+#4-iyXtTJzZ^)hnwT2Bx5v#?382 z*{rcEn?*h}Jf^~cRdn1E^n>qr$P<_F(s-Fn_KyoLhg1&0O65j}|B z>HTE>_WeAwg7(@l35_*nU#7TQJ__3;`1Q~!q2(*eZD#l#h(xy9`i%Yc03i)%|~BrT@Rv-e;;S=7i;NaH*?aFQ|DXz+W*B^{&2fFQoA6JxOGax!`>vsP` z!Nr1=V%mvWI}SlXYjC#>u~X3eCH;p3n}gAdxo%L$uRLhy6KF?7m=m?0^A$?ysh%Yi z+F?ykhwu>^>H{`LGXoX~1-L2b>9zCLBJOL>MtO>a*+p(DGwQ!1RnTeFr*}8EqNge! zpl|nZx6ZE4XL;h3xx7~+*`uDaKKo?8;0>&p4WEDMNbOKDsUIAjBx_DK_Tp6l>XuMw zaZ`OgIsem*D~`d1{b>L#>7=9yF^xWYHO+MTB5EwoWA~GKHOb>ydiwIZ*UT72>c+wv z>arq*Ctf}F;yX+eVuAbMwjjP&IGz7O{9iS>2Tls_#DA>EqE*tY#iBJZx8j+y8GYfo z>R}2sUV~r4z!6WB8<%A3r#Tl)ZV!PU@Gi?C><;S_iD|*3K3AbJ$?@f-L}Kj zv_kXUj>T!^=&Q9{Lhf{#yc5r7Ix!74Go4TSAQl+g9|jl6E9GB~?_ zP)8w*a{`|ejF8nI_o>RBSM4>voE9p!u_Yq-p>MOkS_*CDQ>!u2{BDK&G00B$x zqfh3~D0R^|CUt=W&InxGL%Ma~iRp`A+X*_HPdf_`zokR>GZT&&uB564Nm3P(NSi_i zlj?XzB`nkp9m>16dr{qMIF&zvvEMbtk-Inq#@?^$V6&TkKpo9kDY%~Y2O=wNctN;P z_3(5J10hS`^~Sb({hLR@8fqxi=^=&Y?D0X^c(;)whMMq=&S=oYA5G4My*7ho_ysKQ z7T$0KM=)Ny5C!gDTY}aI2CUp?)rg$S-c3JVD1X!d?2rSXD;e`52Bg=<{*G!Jrh#JTUEwXq#m}v$s=MVF)dAQIRAfu2>9{#q{1b*p)V!T8 z84(1%UPA!^AI;#;h3{a$q{~Jw4pm%ULhyPl~ECl?Lcfj{5(2uSba z+Pc3-o_u6L*BG#oB)>>Hh2e!7h&BG^TXDY(yET9Z;=Js_x1oAem$DJZ2zFD& zNh87y|K3aK6Sv>JgA+AIoI@ubg{w5sn?C6(p|2}xPM;@|P(6%V^9pkar`>qt1&&SS zivL8+!+&{R`jgmpr_t&8+WeEBZqJ51nGy-LYDoa40~KQowk}Dh|AL>ljE+4w-sw-! zXxsJhy0{sGd^BN1jSCHS7@EP$)*KJro-<>dwZ5^cN8^eP#5XNHZO6QaT}g|c)Xfp` z^2y@(MPW{+2xGzU>rZGSS^DsY-bKD{y62km8$4=i3RnL0eFxss{9Qo8;#=Vo^bK7K` z{Qaqp;7FX6m5Z{w3_G}3DS|NW+TVbiUj~z5(sXB4NB*>GV}W90;(Y=iLw=eosb~lh z7KOh@Mcv;R_OMjy>h=RAE&SQBe2=yjx|UJtk7N24zwZ;sdEpgB_J_D>yk!O&-0wo) zz9rWKug{uqvE<+)H2jeS*1NviM_l=MNDBemj#S@n#_RluH&e4M1g+0rezY&PcO_ST zYeP=OximGWaOO&d5y9ls!4m%O-)TU4TjNS+5#P!cJ@08R*j-Tn<;~IF#i`#x>TLQX zFZLqWK`U8ge(>k1rCUfEats(i8&T7k7vn8r)~Rqi8x@+mbUeo zL$~#x(gxqZBm72Sm7tS*A70KQy&)@3^P>{WL%Aj4U!Ld#ZWZZ~!G-l%ywa`T=?U~h zl#nb6%nCXecNkeM9mdMj_*GtGP;y(ntEWfOY}2H!lO+gx>IWQcxUBtO_OetSI7PO1 z_r!CE*~k$%%8(valT`M|t*fq@u=?R@5-c?bQ&S3=WFLh0x9!BhXPY5SVdrZ7X;-AU zrJ-N*9h9UpI&#HGABkSMuPxz2p^&O;r}Z70ae545P+ySj`xK1*E4&P<5(AP~{)eY; zSd6Agq2R~gUXW9x7auu9$*n?029rxsztN5?U7mQzyn2M?V8I4P^vyu)fghY8*yy9) z+0m@VhD^ZUzxtiaMEYx6?p6D|?AxtXCFnPR9VE(tI!-vu7ZBbA+ zO=2}W39m2w&;ldn^88bDNS{h+bK-(G)%@~&#-QIY=+*V_aW5zPaMXpQGdap6@HTMG z72;{Jig2hLtgf1!(MQ0ym+&Mt(Z|a*_{@D8?GniMC~~hd=g1ZM=$r`u%JHg!k7;t~ zN-e)ZvM^;7K}elWvLH#)JlH^<>wV{Y#@jTj3^SpcD%N@flZnPxaL9xTK_gLpqeVXE zYrRIow1r#)X%{r+J&Q5kFw>}DJw#RhRW`dq$ZR`&BG^m2%w5iS*=srcKGfSh!qNwJ^SwE=jzN9=US^YX)ahk(^9bW=QK zfRu-y-s#9v>;z^xzLX(ZCNE=K;x zQ$_!(_h#sHvg4L7a*x`{`&LaA8IB53b~FZlKX zIhBRX(F~rJBkW_crGep!yZ^m0?3J`sfR$W$PBzM0Mngs|d|X;fIg-ws!u4&(&2{$i z&g7*)m`JYm$2_aXNqF-%)8JJDd^+*yBP^%9KekGM7Sx82cvwQh5_4F;& z9M;CMX!eJZS^i za+>%I`*2Q6WgHyPHa~{1&g&qU$!e7kd~-U{vLPWbU#_MYLy}u|dO`U?gXC>=)>>F9 zq))c<{>-_q<0d{0qng=xdv%SG`^6I;IU>`~KHkZxl}HUXA+*9_k=icjz^4h471(&% z5}dNM9TIqH97IckGi!VPDIWRAeHqf2Z_`5P$gsSVtNP;YkaOUrDVmoob1m2heCXKj zD2x}ebp93hcwtIe+fE|Ys-2n#Z$KrXb!AOc+Vt*^b6_+(R;2^yD8L8~Tp=nnJ-=QF zDEuqOx7>>5dH=5@7HRm35OK&0ba_IwP}ngGg@?SUu3T2&Bcx4G?+pkad82(hrH5|q z@Wvd2T%d=hfj=l-VZn@n#T*F`O~TW);TM$XksG-nGJxLCPi|%BQuyRB3Vum>kWi;B^WthiWJ1_6D?lJ`*+XBjDX5`DG$6JVwGwHy;yrkI zp!lL;QeDSYJtLxZb_iL;s6T99T%Ddy@&(?&r*H2RLp7!v1o2har+paWTMg0Y1e2eI*k=%jb++#WtVQy}Kc|~s zA6lheCtwhoyVD@j%OfY)V}>FJhr2qSVM=De$JEw(ka0S?-O>e#>fysW-c4Sz;#hPy za$4BRgjxmf2n;2dnhlfn`w%J&-H*&OhMPLi$+1@MZJp0z*7XB%PmEt2qYjjFt_G09 zyp1%=vV!7i8I~oeTUjzfh&FWD63&K?8G}zFxzjhZ!NP_RU~LwbQNxSP^nG7HM@Z=B&|fF!+3)i9 z(-J}G@yQYLq=XSPcO?7+CK)UTHW7M;2+IM0m3Ulm>!Q=l)NFiyThJG&OWVM&UlQn!0i_NKRY8gS#%9&eqtyaO@P8DuBK4B+q$ll z$G0V?b-o)UF2~6#$km0+MRoaQq?B?3^$L>($*)DSx~R%JYN)EaRk%Bcu1#c<%-$bP zj^ts*CWN%6ZckyMrYL*q6f9ZXgS8Rq&?>|S5oKG(FeR9#Xhc+n!?s5na;rT8xQ=y0 zTn9@&0?Ws&SCDyG%bptOq%qipbDn!aR;l z3OAGt8P)U~V-yi2azwsQd-q~V@_%Xpu(n@o9lbMhz~7s}Lvf6(;0N0-YI_?2JdA!GX# z8Ca6mMH>pI=u`$dXhZgDVi-D|rW*e!Ez>>i;;(KP5A?o6-MbXn`~lu&hBd}Ihp%Y6 z`P|9{@ycNID5kg%sN_nG+0}L21-*Q!lL9>mX)GH> zdg~=Y$e79)pGbUO3#A*p;(2;oe=RP6Do*=-97X5i&4fV!#Ji{=I?bDuZXn(E!%muk ziMjCC%0{A6d+Zv812#2wB%2RR`oXsWi`NH4nPNRyn$pVnKRA^0$Cnqr(j2FR3_GAW zYBJa6RHs?=Zd&wPO7mDZkCkj4+D!ZM*x3}s{4>qn#%}+zl+GRj14SSxm4K4pF>t0! z_fLoIlXptsj~_cPX^i<<&`T(w^M<(`;f<38Etk{peUW^r9Y2Ryy+l0&RZ@hp-%gRZ40WaVk+0kxbFgP;L+)sB+Z(z5xS7_3M|PDPEmH{TE47~-leo|zMSTP786ienGqAb zz{IF5f~oPdqH)&isItyL>#;@felyeX&3i6|^C2F&DQRJL`+ob;4!zib4dlfRqdE%$d_={P1PAVbXEz z4|pC`*TYmj0d>s?{x&_DSv+5k4Yx?sN(eXdxFmf+<;X1IU|!I*vvAXlaI0i%3>B(v znxm~hquIOZ#@U?4*%{lKOF<-6a~WyhFEo42%D)8yN#>2ezzDzykCk)a;YuoWEBo%@*H(b;Q$UL)6@t6s|quE4Oinlh~ZvVYvz4L&o*c5UYz~X$^lD>H5AzJbW!k z68HZ})8wY?>&v^)2AsPK3DNC?Jo?X5s$oFM*z*p~dki0IN4T=oJWkCVa6W)K39X7Y zf$7CE$ezBSV&n(%BWPiPTQucVm3t+{{2;5{F zegebvN!^~*y0VMwa2HhUcY<)#6pZ#SILm6uX?!pu3tgVB%e{Of zsnM@agjU2*1zGv0Lw8_;LChGU<m`A0X3Cl6rZ4A)Pe`pUS`|dR>c1z*x#2OQ}Oi5 zBTot18_$Gc@M`s5h=4BM9Ay#fVBIdJ=UuP0KM^eU+%-<3YmAhH9Ps%HDZu+}$yKve zU+gQ#w_?-&LM)aD-|>UNxEFP7o zdQxGEk~(VL&%iJFPVSe)43eL`uvbn4{%Sf)*lthE6aJVETb|{$BBh!Pa{s$;{*cD8 z*wbH|jM$xS!#L9Pcy7#bSJq!Ou=F$ zHqTF=rugZ!QLKx?a3#>h2R;FX>)*hwJl91wuAdGK>asBNq7`3Tgb4P4eTJd?r6c}u zT+m(b`=k4R!`i{eflEOP3tslG-5={_H#kbsN-x|qe@H!UW+YbcF6dZ+Hu?rT42&J}zUw%g+PM>tr&e~hZW2Gz?>n=3*%@zwhBxkP0;i$Il@H$K&k9L#2w~>)S z?QSnS1)P3ZO-JtTg7S$m)Y*Q_st6hWfOtBu*2xQTT_42PD(L}C$aX-fb^r2W<~?uc zBR^fP4TlUSIlU&+JB|J5=oHA5u6Xvc4pV03cahIlkGSvEdeU=Z9T2KJxXq-x zO%#SDZNyq8J*H#_U!Uuh_==kuM$1ErhNTBh-#~Eju&4@`{w65SP5b_=j!M{KS)|D_ zrjr@s(hEuC8*V@y3W$y#Hs8d}@$?w_CpR_AI+@N;u6wtfY{G!#itm6T^z;(fQSZ+c zvqU{%C5tWtmAYhlqFQ-&`<-| zNaG>+(qOGZ>>46(I&7d+>5Kt%5Lhv?;rt_i<Dr<-otj^ET}Ye^Ww)oaq>m9i=}3s+ny8h!cc9wCClcmd)kUSd+k8Rw3rdb zNTe#-ke7v%i-8sFjn%hzqa~{&FSidVMo@>mi%DC+L33;$7AF-K?F$KdNj3m*m}R9ug~XRT)<#&Sjb~JZTg6=COBLbs!?c z=#+@#=m?I5A8xUnQ6gKruBq7-uL;%T7}xF%|24X3+Ig`9vhXInX$S374wM-=-+Zpy znV*Hlv8%9-3G9^w6)GSlz~D>5w*oE04>0hAW2N8vn3E@c8x>9PR}>o{DQhB&!rV}B zj$~)>Gsdie-JoH)ps~?pmWfrPoK>-$sNwo1<+Y47GeKG`?t57zsw^mnUrx@*_-Ll! z?K&lQU8aL)UDJ}0eD3WbZ&hZF2>1G~+c@{`efFuFV45kSlZRdy`h#dEw1RT#T==pa zeQGviJFo3d)?tCh`7kug*YlKQXw^4*xDO z2x5Ldv3joPKztFA!mz|vNu%*O+`ph(;)b#L%RS8o6IUgRIrA3_2d2>}+d_ZJ_84=8cC&}y z9e{trNA%$Ib(@Y;cM}7f*pSl?HQlbkk(8)f-WRr_>mUU6rMCt^XQZ&ZA)80*whe6O zj>|qLFEW8U`4&8(Gnzb5HKp=myZL6kF)Qf9Lu2!$R4RqcJc6zUkwG5NP=1f zo*#}Fe4@jqcCbQc&3NHXgCg;=k9);uyNw=8hj#mAZtwd{Yo9NVxKICwxVMg~s(br> zK?Fq*Q92})Zjh7|M5S9mx{>aN4N}tG0@4zKbhAN9K-h%jrn|dg?|mk}=XuUM#u@MV z^PG1K^~Qa}a;>@MyyjK&`!PU?A5t0%_|&x>iTemD8d1B?pDQx(81Rw(dXFV5lIFaH zI?|;5{>*!4%{2-&v}tmLi$kr^$a&LJgd-!KXO5{pC9*MXJc=7b6qj_5gr8ssi zzS2q~Afjyd5aNb5e^?IBu}r2W(Bnwjh}ZKIO{PVhd3#jdm*PLY^$1{Yug-I{xtvz? z=sc?rwEalMr;Q(RY$G@p>=SZIaB&EH1zAa0GchrA244*6oFZTV5w5a$VIptk@S{v> z?Moc(9OQ|T7^YO=Pq?0+kdV}2%5WJl6D!`f6xcOJZy-qpZq ze%>1*9^J#eWbwLX$=*IxwE#Iz&hhW~NrwiF+6!M8hDcZ^{xi`^7#myL4^%Fa(*%(% zk1QCuq*YqJL@<^*SMi$q*hCK^>eQUWQ3oTJIYy~gY=t(R>zosl9t!IfkeitXK0^)j zxu&Ef8WErHP^B{unAu75-lR>~{;m4ARgXcBPV$!_QoB*8riLT&D+kI~80q)WiEclw zX)`bQAkWSk5yLJmY}ZK*FJrPD2#(V$W4iWR%^Y_YK7T}6@ES7ShbZy-SyF!V;!+M$ zB>833#RgTJ9$uG#NkyEz{EK2B7k9b;k^gr)z6%yQ!MmRCW15Zcf8dH9=;hx{#o;$v z(|8!zn>JW%q+}sO?>gDyWo7B+mUWV-Z4RTmcd^_z&;j>-Zg)(u{WRzy4-H z{@Wk>{(t_$#{GZn%WWqTaBnRRU-h3yjTJ~pk=}a)l!iAjdePww=Y18Y9PVT!39s~^ z5;Q-kRoRGj_IdtBJh2rfRmxu>Z6GDQ)Zf*R^IC>C?O7iMZaLC?crD>8Pb zv>q5UN3qcAEs$QK%0?8{xJKy(h>l*XSNFSVCMLa%oVL|sJBKM&o>Y!pg4=p8b zeb(j;uXZGefxETbf8cTuzagx$82-A_64!OjLWufLEbkc^+R8p<{{02d6cAgOm11d%f z$q&pH244c4u-?UY@P_%WXSj-Djl@71qiqSI-!=)@&U85+2?iMcn!?A+vs$~~w9Au*=^5glC0UuUM57MkG4l^6}JMU9KrC6cOq)e>ke|R^rkxmKWl9^j%U%SZVgu z?{sR}B~bUrtzC;D{Qk`?X>#CNgP=#lBc}Af0f87l{4o0{MD~>KQ?#C}n5;4zsr~MX z4I$BRK26?P-h54A-%>10_-N_kh7lLd|MMr(cVTl+y0QA!zWQ#L;&3Rr^e%J>zt(hl zfbk|>=hNn{u8NJVEjY}Jp)o$JPBeM)OFkjq$dD8(L?t(t^FBMg@Mmq3J!A51X=RF@+dxKD8Ly$_0r3po7lMmI&@3!8nAy&>y8 zIOIZWKx4pU2qy;Y4xfwWg*9Xb%57vha2Tq4ovj2Uh*I9^-t(7dI3LvNebF0%q3b%X zG3N&bhroW>Hn$we(T8`x*m6k^2naY1o@9%fDtkOt7Z-K(JcTciA+N-&lW$dKjV>0q z3fC4i$j+Xk+TOEO<(4NI!YMAg-EYS}#?q;32iDc06+03T7Tch$9XsokW@m^UgW8FU zquz@BTykXfiZMf^W(Kt?9@R5`d68NEq=PvZYU^#A-~H=5)rpxF#51pHlJb1etf*{% zia3sm=l0tDw7%t7Ywot>5OSfPS65ZNHg%+%iqCo0?A zt-19R4>8h8{=6(0{gDTkZR{UV5Sw%b!U1VE3_o^W--!ftOr4`rHHC&;5E^2aQ>{nr zI{I(vs=~9f>_jH>v{=Am0rSAP_^a*oX46o#@B!U^rhym&#+W<#uJvd3ZHBRdL3UmVd7r6j z<3T6&qn@^-SoI4nq7~O^vlQ2CAbC}$Qy=}9fd*)2=}~*PbWd8A7+&(}fnHx&p{T6i)8BT!@m0u`QMJfmVsN zIcZ>AeUa{SsubmnW1bQWkK9#@^L5{l*%2EjzjUB!RGW}u6@E5?C!6c=cdM!ltT_Q(2uBKz-;Q&3Mhd#n*qP?l z-8-&mS$=f))7JLA2N#Sbs8_gws+C%P{E;6T*%bA}AA=i&kVbE=j$q{@!f=9u_ zK4Sj&{ms%>2Og{BEB{G=rCgvOh)Kved)qLyB3lqR)JnNFD{@BHNC<0egd=r?R&$=a}G?DO! zE{=fr{&#K(S=I0LwH!IW>&vYa{11_kLnq2Id=ZirucmM#f5(Y(ME_uZV{Yv_{QGwBocxwBWRy z%`;T=!WV13c3Qi?YDBn?tQ{3P&v?{HJr`{%)^@a$(6DxX0}ou?W~00 ztba*yHxN{tci9PT%A;;^R5bJ2+7P2W(5o+RuB@zl_$${L6I>v9;oyBdeQ8r>F4K>a zkPWY?x?mNavi_t7dO4nWIs)AL5s=%q3-|Z-kc)5q4uv}v#~r=k2>fg;BiA1-DCgy;L9lR{VA%uKTO2=upBc!&*mn2YY0YupSU?JD=XKJ#$PmpTt=J3lW(A~sQL1F6uGQ_jBJdxpotPbH)~ zIc%%;q(E0#<#)snEBtD~5D0CDb;GRiLbWIp=`$0(W2q+F9qEcH6uq*~r}x~|6DI;c zK8O)9*VgZESrhh-FyBek+!6p-5VwJoCEteX4H|a_olD7R26+{1;G<}S+RRvAIu;eE zua(_TC+fRQvM-Ozw!dsNT8dEv?SryieHp2S92+sZX(!4Q)yjtwT%_OC*;I#J9|il= z3U^i6=r}*`1%ICCUIbNsl0?mZei*7^iaB}m%&xI=lD^ny&t{tcPO_Wm%(#-UO8%A6 zwA=mu9-|zeI}fMAXN~$_`rjbBzDu8U4jG;TaeR2pogSE8@4H zBUZD>7C8*{xh{Q++BCze%NwDH``CgUHy0$VVkMzNn@axq4z-0r)!9i^Wz#KomE@Iq z9rIGIdp~JTOhZk`ZI=|B$d4@OVc=P8)WxGLY8d7s>ih==O4`7{;Hc$fsB_~)CTl|* zsOQa3O{IBt__fWk@2X ztu3}HKV4?{mFijleSiEvO%a4uv__0`U&nGB2sb}Tn67-o8x$_d@^5{X@&ecG_Cxp6&d+z4?h zO&@wBmPqaBg5#jU9Hd06?Q~YYA7WbGc`+9k;t9O&@CKuBqiL$n zmPk(eOTgk$f_)nkhw0;TCY>5Tg%QJ{^rfa&nMb^wJP5HWzZ?Cg287*=`&D?s1RcIGE+c-ih6usz6Kj{t!lBUc5;Dsaxk5YH0HJNMr z=TOORhX95Eh8?CL<&n4+{05q48qO99hbP)Yzh6XzWwLN5vu*QJ5p_zR)drF{Nx0Lj zqKWmrJSctt%$(h#KmH?&#shdVI=wF8 z9?>%M9N(Mp;w^TncKj`tyy`f-%|G-=#<59;N506ouO9pnD(yroeK;|tm<>7Hn(GWR zU{uYV`!seET;NKbN$9PZD0cgv1mMVt0?_bkw^$0l*NOIu9*C55-m)>c4M8dvGU z=AKud^O4v`ewlI$RVzz6j8p}3MKv{^wABy#pQifutLuBb1#Gv=|2Cb7OqNCq0shp0 z<8wB+xi0zparMz+-bSBjpEikNt*#n*oMDm4&NC5_`j)r9OAS!h`eGcfUd65F#p)Ew?Q(Egto-YgsSXLHToH{&UUW4}M1 z?YW@CFwoK&_zQgN2dNEcqpo_5s0ZSQt`)kUWvW(NSLrohSKQ1z&og-+qf2^o2xY5L zL-U`4%vQWZonAy4T>4POuNuMklUd6b8$EQ9K!~uEO#CZf7gC_^`@8ydgq5|m2|x&C zeNMmh5yS1I$rw~LRR_*$hJZaors69g7X}oQ`%L43+J@tiCh+L*^jw&$4U6o)Ifc?p zp|1;~$*^kj>6#IIG-*)uQ0BH)#2YoinWlE|dr}jMUOYR;B$HIY$x=}9x1~(}UaAM3 z9>sFA(VR5SqXnfbM>Za# zGLG9(+nw#5?FB(EBXuZxTd!yWb?} z@lH!7vHOH8C~H_M6Oylrgs=XE`!mmYHQ(&6cU*qpemecHV<}|u4*~sa*w&7O)f2jh z9+Z*~+?iIlivJ*IE5QLq!>$eM7sb~EqB#ujV8_$vPpj=1c2mUj+?{Vew2Z60u&c!A zMH`FzVC4MvQ|i^d_A>{{2hwp7rGt^~tdjVT1SZ3~twJ zMXy-)LPuG>vV`|Erep;1iYvL_y?>`Y()eY&eO|RvJ=6B989b>rwj`vpdt*$iu__}u z*_^U>t+>b!$6x8>jbU?;6~@kY?zaJBwBcxJa1j$=aKpOcXG}+;kmK$ z3}jSPh01?mtaj{MF65m|DtmsetyPuEgk;+B+T+dPg@xue@Ioj={7RCFb3^3^8(}Mc z5OQsd8nOEmVqM_`@$$aqBBi6m8(UaV;?G!{sx*m=j*jm$1)4Vv<<`@6KO2)G z#0_WIrkE)TPnSe-`O3>pp|e#_Prl)2h?zX#hlTb>WbOY zmlz(j4rhHKr7aJGh*&H(SXM@tl{lyT5wD*!!Xij}JGxCM1y=pVrX7+jzRJ?BhO4O4 zJ*2=1f9xQbS@fWhX9D-sDMU`Z&mpNdFPKf2WiF4>+~ZB<-ft%JU)a#nz@jmljYC#_ zrXRTv2(h8dNz_%LN|i@_ihn`_smUH=69r3-n6&9RxdqDWt2i{1lU-QbXv1e9Vt6s| z=^?~5QnBY<#~=T+WlDpW_BQ&jj0IN^=*(nRqvV#u>hgWY0V!yVNB^ei^61|*;!Om| zV}aOmY3V6A8vURBYg`w&`JdBMleIHl-xp*&o;+c|m2g%gDBq|A2l7|@Ngq$1wWs>} zQj$Gi(`NzuDY?- z&SUY2`BVu2cw*`SpRlv&YS{I8uWNr=vW#9jXWOmQr%#_GtLRkNi26)lnfCV5)^ZWV zexTDL3QIIevG5Jig^iiXyqLvbzl(`me`dxT#SWTEhL^?msSjPP;0RyfAO^~yro(e% zQuYTdk~y*7gX5E_@oXpJs1xxSEh~AJRh&c?DD$La!*#lKWdA6om_#x?c2UhCzXMN1 zFClDu-{L4Yg+zdB8Sd&|ygI~Yv_ewjG z*93<$kT_AU#_H!K(JxT}W0{Y?iyH2m#`v=Z-|{qJT{=iT;t1ae$n)QeSi}mzUv)m= zY~SXu!JmFiABHSd}fbd?#c_FcH@TsM5~t{aR{yOn@cv zk&r!85d_^=KIky#z^t7Bq2>kST@&| zod*~1+2D#ESrK%7T7_gKL+v++6sX8Qc=IFJ*`GBh!sFmShldWH%2myWIN;UF6pJ94 z?$LqmDr+ZLzs4+L9Z_5%BD=@>TSh_6`EYA5orgIXw7c`%f&}5+akSip^7b! z2kv6rV?u)uaMM6Zu@^{QVh2m2%>d0ce9G+Y+;?y}F`Ezu_NR zHZnG9Lfl`yGKso)gzF3JjG|XRyiR}foy$TThU=W-l0J%Yn@0zm;);I%6r?UpI6+Cy z7sK%Qch$2;%blTAaW)xU&TbbSCZjmpAt#lPhEjp+xQrE6&W7*arly2?lf~p{y{@-e zI||?KmoT;tZrHCcM{pJv7n2R}*2**F6#y+h3OR+pQxW3lQ;Xj|hNcvh1YmDB>7RZU zqtjNU>>VkI$e#IlWp%h)YoR&#z{G^v*3=`_B6|+jz9=!wL}m!{Grvp&V2}#v{#+~M zbPm?bY8^oGCZo+f3ifOW|kNGm1JyU#>@jj)*JQ@1+o+~4;_H<6 zkll)d-7w@F8~_;y3)dOO9Vv^|*~n_szHdLL=4je{(d6x=Oeihvb^6uo^3cf7c>!fr zDcq)Czu#LxLmYATu{R*8Iq~M`%I8CTK2!LzJ7w>W=$*f&JU>eMSq-jafvf=*p|p{W zjXYq=jsmnpvAWd@=WWmV#GQb_DZy?pv03l4mj@9GSIZYK<@8N8XcCp_Qp%Fjxpc#K zbNbdIC%?LKsV4djkL>{@xncb#6?{I$hJd5DBYyZk9O9J}&j#M0@ z^ZO3&4qdJ5i~BQQ@JCBZ_ueb#zkRPp6Z9g1Z7QjN%k-Ra@J~Xg*A-RT&zz=UafvKm zhNL&Brxct^ZcMbXGV~DyDqUG@F%i<6n41laC!k#6(DHO*U@fMh zJVluhQ*Tmgybn$M7J1=$x%7Thzwuco*9)M{k$Q7Je%6)>awRg!=r6K%06Oe3Vs}G) zCGI_SL1S^4E=O;BrODHG?>mYHU&93nBvHrPF>~kiLSXr{5@qlc@oH%3!f@1+KXud% zh_X%UI`dgily&g3yINW*dtPr@0~CA&Evs6u69 zRuYW5<~w01XU_Cp$DO1T@hy4j#NHK=BV70S%YE!ljV*Fa*izizY7rs7ugD4%wFh1$ zg_zF5CAAo3(XSX`dvA-{(xXeMBu~@tT?s-dNNNbtJ(kLPef`PHgGe!A*f4C*9qGBo zunNv+{?Wsx^7Q%2m@PXBMTsfX8H;;p>aC#W8}&sJ&Ng?y`Wt=O@?T2|oqzlogN5+% zvktBgEDz|K%a1heRcxGF1gC1N-fDe{3dfAr)HgHr!4D@lm8BfOY$9TAN52WSZOf%@ z6v7*BIN#mxmoLrT@gguuN246zu+a1&2hz06dwaHo5%fSqQP64C@>lGK_NC51LA=Te zF~N$Jr-)7VHR=0f%v$y36usz^tnL+4ZjCwIxPR9A1-k7Xb_QSsl2U!ZzZsgfQ)E3= z8q9zq8ZW^WYTPQ=tlekB_Nko@=BqmXxhfMr#QHji2y8+kOOD{)UJjxp@H$2w|3aho zEYaTHDRyI@9Ej)XdwbuA2s23o1IJ|n!!%`{*cteA&1V9!?4Etdl@GoGy&FtvyZL_i zGqq|DEBCdl#GQ!NEd~1*_z!`f-37L+sb+WkagWU7-Lh_Q25WX z`%6n|B0eR(-W=ZF%OCjhjAUkqCs0vma3>+EWXLTH$B@v0 z^v4+C^nXZlc&6FUJG&zu<0DoLx?~ClD&@MvuXy{9h`!E2{~QG)*TzvK0+I5ToaAd~ zm!+LP8eb7~6OE}yDd{q$Q|?O5OJTSl4gRg^$KDGtyb42hKX!a{RfYaXW60}WH`+fo zp_)`Ipi4M*2D&@eR@CbWOUyVnsEykHtC!_7_|N}t_`rGkzdk4ZKlY_-IrZ0f zc}Hppaj?S-K?PwDV6FbE4TU(GFrwSM)+p*|^P>h4ye^Io8+O8A|N3E3HejxuDVbM2 z6`ea%T$i8Z6nupp+Ib{F<1l*DRGu)frmS&RgM9uFAqf#ZgITthJdP?UnFDnOA|T&V z0IKPmf_Qbdc{{J0%1z+>S3Y8vaDE`!Nh#=Hs1o@{)#7`W{k8P~Z(0EtIxH0T`&|ke zb6{Y5ymSRvNyb(KHsZcDC*aI;$UdKHa5SMb><%X?nzfrO*FytnEotV^Vb0TR#cQR{ z?JSJf`-O!JplGDk>}Kn@H&c5jYzrzN3<+SPj8tcl=Fgx{ljji=8@jyo80J*~m69n? zlrt1153$N~9@o%xy+QbuVEy4$02yh3?s0hy&~OrSk+2gPh=OOsQV0b=m`aWD;&v|H zS_UezA^&!5AdJb3~HksEcRfl9aZ+(xNpMKs1Y*9mR#l&~yOfYY11OYC5Alq_D*FX7zZ>|1 z6Yyr-_GY>RpNKUurL_ZiO(ZCdo(5ec^wEi5^(lEAc08B{YJ7Lqg2+fVSzz6+PQ|mq z6HqCO?37i11CW?3pJN$-wKQZSPDp-%ygu7m0TYG*vT@>><+)DgqE~SvmR-0+cJCWA zf3_tW739_t;PyZ<<%DAlNPw?Y+jtbR_X4#>;(rfu5R&5G+OCy^9zrWCV zQBfiMEDT8Jhb;3=>Pl&9l7RjZW-v{FdVInMx(^HqASGBeZNr_ZI0nK|O-;>s9?QnF$^FnLzME1lrv;pAfd3Ve9zHxfEAQ^^&WA&y-R#C*;W=ncobO$7S*aD- z*48#tPk;s|ronuAn)aJ^%9NS978k#} z0oC4S@Q;#2bd!_3@*DSAJGoLBr~=3r(0TTo#K7k$9DuBPof~!M&ac9WSeN-8!)z3h z1aJ_z(ccYF5C9r+?O)t%=oZREDSaWZ_`8#kC6$m>y7m<;r(nHiH;|&b8&}j;Ii%l= zsbo4Eum+5Q1~y150xGap6`M(VVN#zdmqG$qji6-fNExbH{5D7V*YTAIX!;1xMZ?Dn zji~VGW^J+{7k;Hd2B>)M06g2;+S{7W@a;+GTo4g8BYe=WpJ41CYV3(I%r zf%thVz>f@o6>tvbmT!_Rad2{SGWH3`=-&;Z%;eeVC9oz831oU;>44S3aU(*B*DGK* ztA%i`)10rRL(@kdrvTv0w*e3r^9$9q>QpHM{p8B$j#T4y zW(7u!9c|K;y^{+}DPSi30kFZC6l-N=1-NQp^)~7b^>3V{Z+IquP6u_FOP{vsZLDaD z?*N>3eSHnOG2E%dvXzcSVBkV0;MJ6Yw*cx9phTzj6MfW0uSlKcGg^2qVds*=Ay~b8 zS=R3ig@AG8ply%6CKn=?tKNlp)t!MN)x*fniHaOMi;n>^a`% zja)u=pMCQp4rGw;(ec|%NiY$Pq61yrt37*2=>fc+)8%lnqYHqtNCKSt8}zkF?-sgd z*tv09uEh<})r%e7&brOzIX!)o8h^Of_T8B|G$=hoTH$#*EzG7P+&wc!5A`J-`w<>S6>5@0Vr{J zpq_sX1phlYAy)&#V@l$K;I7XAflv8$rlMs!ahzEr2ZJHtyDlvm0ZJL*0e=CjdIvy# zzJaAca0GHZr56_$pWB22%E2u6|wA^ZK^DICh7$m`Ky68+6q!237{KQE#; zDFo7L;ElbpSZMQI7rmGzK+Ct}-R?22^x{0Fyzc~f4UMwX553STwd9-5CUlbCQ~Rnv zApVI{<)u-^6t1M9F~F-pCZVCBprJu6!IG5jSolw#E}?HbH6HbNB~X3^lW>a z&5)_fhCEv>DQDsb?Cag$&3s+NXBeKVtatF63m0s>z!poZ#L|Vmd>`$w`sXR=6a#z+ z+$T>!X$@pP391S7CNtg7O9AF2iB;39@bmJ?6&G%x4ZrY`>HoHlVJH-xCp2`#?G?S^ z&`qTIml>x{_nHwj8G$V*U$r>QiBCXaY-Xm!-PN@c@b`es{(q(~FOO3T$qy>cWetFv z6MVYBg{zlr27HUtTIS?k8%`vngzVjNh)V+f@nZ?HFH@dA zur@~QlDVg#QRS0ueV1;v;lNL5KQN(No15*fbK7q* zN~V*5h38dR`4jgN7#r{p+(n`R68@o7UO()j4#D@z6pb;qE=*3|^{oK$dUl}L_`Fy> zTnTbL<{G9=p|fc~g}4*RuzU^H$zSX8#-3K7Z%n71JjYtmqN?BQ_VeH9=v@&DASfus ze6*Yf#077zcPcJG8P*5*czlS{BJnxQ)4%vu698ffDJXSbo^=Ig2ZKqD8^_7iG#`lC zA&$UXepf>B>B=VyfWFwKd=zr)Zt`XjJUR>lXxKEW-YQN1fH}TJ3Z2Q~AbOu(E2)7| zS=yN(FDUF5(*!lAt8`C;E-teUTt--PsW2;B9fV=V$ zGr0N4lnvWy?*bt`1SsbBNR#Lh-Xo==G6zeTQrOLA-qAYERIFs{KP(5JwF?Z~%Z$Ne zU|qRtVmT&@@vl=fA%c|az+`?00EbpUQ2Kk1_=>6y*BUB@%rEY#`ZRVi)~gJ-6wyS0#09#gku9g zAuS&wi$NUG?UgrTd6zu~L`))IG3t0a=B$k?dKsSYKBL8M6|F!Gb{*(-0!zx17Rk@c zo3CMRmb2qET(>7w5okvG?hu%D=5p<7EYN+LR=8EcCoxVI6CeS$$~&hO)Gy1;AJkZ_ zfQSU`i?bsX_5h)VztmOw1^eY;a(xT^=^cg7hJRqb)%%XCm#@FRLTL7|6@@sMWR-gr z1iS-aG_{g7F3=a%y0CH}GN&Yug11#!0ni9wP1?^U4eSAV2MrV#fI>Kc4KXC-08bIT z@a^Iv25`o4U3%}xjoICO-TZ30Pmk-V|Iv{n*i|;vlJVDi95{}Ym;mTI!y4-?Sb|F4 zh*un4pRTIi%tvHWF5G7wAKXoK7!aF8AP_Tm_MX%42;wx`#}DNtO#h+%eP z8!$oMLd?+oIu0&Ow3Anw%2jS48X5rhvvwzJ3>dVadS|@=rc2Eo-4Ja_n)EAVh5#>g zMW@atAfc#|;_vLkZ!X6VUR*3d#FrdACR~ludHyo`t-=?O{9v!bi4tA7q&dYwz`){h zd-JhcB2nQ(>l|qb zkT4PqUTN(@Gj4nIS88O$H|MWjAjzmviLCRz#+5_ek&r?a+pp17qWwGi7fsr}>j2xu z2lih;3Knuje7$_p_7z%lv|-wwoUsvz4*ILVtO4hxXKafX_~)xmjbR)~Ru{6BTEM<> zG>kkwlJRX#?;!D>VI(}##1JWbO&A4~T5)X9lBwFoV zkEE0gxBW;y4vpDquDLd?KVl`@nS&ekc2VnA7cxJ|bpD#Cb9;G{2oG)j#ToJs?p*Sq z!57@})tdzQj2|U4&A8p4c);rc9;ovfG*$~Y!Ar z5}}F*E)RBmT||A&?6RBi9HW4L)`0iQ!EG!O4}jg`@d$=FbBc&C=4J(I@31Yi`Yc&M^~GF=r#Y?{_{$Tirh37vpj&+2a>! zq#Xqxk1cp^PU1ufY203IRxqkPN9`5ty{x~s-}~lsn}cNVX&e%dAc9Q%=k^`_tA}3i zB*H;IRVY|Byb7fQ(W&cQ8ULN&Q0kI|4nG0EArs8?rC`I;SRvA{?-m(%3&v>nQKo+R z5uS9GA-SjuT|MCssv6t#M&rLVm&za5u5z=x($>TMqu$fmljcPIgQ;zMr|+F<+dD(@ z6+RQhjRI}Mb}IsE!SV0mxExA1wcmr&9U-o_0uon+*dq4@)ojF6(5e4dMq&ObAoNDU zj=O|yg+N-P_ItuF;Ijta`K=l^=aJVH*Jm1;2V$rDalxCR#Zf6yCg_Z2zpW@18_6rT zaQoTW>l=KXvdAuPO(-u5g0 z`2YiYCBAO;+bU+{yl$_DgaRtalf8htX}NG!1ZNe^gka)wPf>|jHXz-01R~InsBe3H z2SLB@6xcy8vCu(~4CBK6HL?sl(7iP3Y&m*@ZI*f_Abn{y>S)=g!-F6tCZzXSBzuF`)coGFGs8MZKyIz{B zmuvi5yhrbizeZ#~uSxbDg1HgtLxj+adZ!Gv}?Js-pP6Yqume!yWTv<=BRE?+ka%YQQrQuC2w)LQKNO-R#f+5#fMv039;lL z*hYE=sT*)(ySTC_URFv&*J<@~ZDCmZ_?Sbj+;BWxkVs80>>V1F=jv0of%GJTpJ4{9 zKF1mdF7nzTAO?6PC@462S!?#6Ck5Fi7sOa9XJ5DTqQ|-kkD8g}dIC0lzHW}mUFe?f zu&Uqu2`TO`Xq@7nul|?Z&G#`N>@%_?FA>JkYNCQ!; z7q5YMmH0eW39;beIUT78xix6IDaeFm-`r?N_3G>|EU5NmAN${hoC9|e=d1gn#jKz2 z83J2bbU79Ix9(V}`KK+s8jk_^8$?0Km4^tqGAPdkj(^%;%{^3M|ChhPCPS50=N3P{ zExpD!owyF<3>e%PZ%IKDloPcc(oSWm<~GP)-0zvOwYorWXNl&VPGc;0zj7s2{0H7 zkybUvI=T0Zt*fsaHCSzTTS$enCZe8if!{>a)b>0=24l~nANkEHW7Jdz0xq zUWyDyhH=ztZ*q#EDIrQk_;&@xXKwT2rZ*q_%1jtM)|{T#;(M;<$SR;zh7=nYb7&=V zpCdftoO029e-xk%>5#eElFmGdfPDMpJ6=Ayy)%RAa6~}*-#;4fdsH0-ZMAJa8e6#f zT)Q(OR1P_bNIkw(O08f~n~0;fMUMQj@k0&xBDJ?Ki)3Xc3JprP>Zf@;;rIPlu4!)E%lB25s~vFsXwZ*+t<=Zu{^Caa)&9Yk!NY$r3yKJWZ4_ok$=sClErJs) zA(`cD({=_uUl!+wuU}5vxUEMKhxPPKk89iw{F}{+mz?(z)Bq*sNjADBhfLdNA`x(ZWsv+D^-PHF;BIH~AaXpH z5Ko#IVfcsAl-j*Hy^to+X&T#8YCa>GVNucF`{Eqn#bVbz&;gLTJC|XeP|XVDH=cY| z*M)5L+X%>!!D_=1Y9m1W!n^(THpKj}h5D_?<+*8sy-N5`M&rm&|E!`BU92J~8d5L~|*(+Y|nU0L-Nn}_r z*nSTM48?H~lCPH}sAbgU8AR$h1RNEIZi&zHDo3DVsE|L78CBS&bJW>s%SJm$tePJ= z-JC~Ix6yh^ZN~TB__v0|R~m4^P;%oF(wL~Z5sOjLkz@Ejbr5{&k<2EyC+SA$&^hMci|^$mL(8Qvq9K_^`aQ&fCTXKG zoE+wbVENv;&GmDrDdQRB;;9o#xRL#q-HoHv{br$~sL2;qJJbzQ^Aj)+&Y~p*c=Cm< z^P;)yh%>olcd`)K`@~*gPMVAyuE_W!2djQ!^OdbSdew{ zaTY7UnJMUOs(j`d`c#27*Xliq39mP}b&z@T_a4&u;uY+Ij6`JwCFl6V7mvxKmZU@^ zh?#efKsS@w_nbO=ar>`=Piyl(??&jS3W;w}yccjSmmBdD(pA~$`I|yR`{nH-Se4J5 zm-mv}an$}!1A{veB&pc_rdRuM`=k;icYPkpldOf>(Di?+K=;h22{o1^sTXm&fqaLt zr!;U@Iux`pH}@Qasqw}4{WL@Nf#vUM~ zIHa|%+=D#G-sWhPjypg#?OH^Qw2GH~M$_85)y0`amAH#D73BQq)#zPE%;Su5{sGkX z#^ZigYgIpB5lG3%Xu*?kaSac*roJ^el{PpPF1}k|)Lb|WDC9Lni47T*i_D&a@Epda zh{s#1LtVDNcH4FBsd+uB9?5Vz*o3Q~rS3pIpuNkV`>%AbFAFe|&6b)tqULdipL{Xz zFkP{4`B`{?EAB|0Y{vbJl)H@^5!Gbhp{4*mJ{PzD?jw4M%*cWIz;#;1MICY)Q&G=n zt)e zLAS4slT$p%%E!qTZ0>WMpPTcLH8nSb2q~y@DMTTnZ4>;Wj=H8cxH#JM=Q9*44-|Vv z*9-AItEf<{QH4(EJmMp7Dml_zg0fIzQ*vXKq3_iFjG>TaF88}Gn|1}yWTI#CI5;{O zZ`Jm1y42dbWsNe7l|tS(9G*Kq&@sPD2MRh%!&qQ!Og;; zwLR74R89wjJP z;3cvfRk;lrLHkJW(N)Sub!NaT{8jyx{t%#TexQ3s8ZtsSm)9-M)`kblmmL1d8eITY zJ7v6sx~p^!xJe#yBH!Fbp!&`5QOnfP>?jvLgy z&jFobSJ96LDZ+aT76JX5GR_|l08YBQZm-FA@`ESYI?!wbH`jZVok2ow)sLAEV)^jw=DZ%7BI$ zk-BcVkD~4++Fe@BD9k-2o<=XRs<(WAk2P0k_vdN(Kn93Qcc3<}wi)+Yu#B8Ig= zF_g_F~qKx0J(V>x6kPb!Z?q(1a6e$VmE)hn$ zVFpA&LPAQ30YpHgyBR{d87Yx&=^kQc-W#9)dC&9VoM)Z$;T+b|H4ey{`|ZyRL(9UPneo1|W3P9!fBhD!GGt3cZ%> z0*&5c^W*#MWWSOMOGr$JK-hrClY0-0Vy5af+Z<+=wk;qa;I&C<@%b}X2L|Be5rdTq zzCN{7PlneY@d?mf7msCTD>J;F)Gj~{O_n}q`*$yB3WlM|Ufeuc*LR7KCm{iM9)D{V zF4X@KTZY#)Ad42{^SyPshUfwsbhp@Zqg#Bggt$!3e82T?s}D#pF|T`)Hr!93BiG;Z58Db>KW7XCr-KO3XvaHntzU4@kqh z48EEV>z?AE0MVJ*F(gWM3!yH<>y+d?beQqrIaZQbz$rQp2R2OZHq}=RC+ji{RI`+SNd!^!RhC>8E zTlS{?)^rR8(`fh@SnXul43_}oliK&Y7ch*wYKk6Nf)gDie+7q#ND{01N>@Er9-#mwZ?;M`Qrh{`8EDV$>Ji z9|nc66hPTMtsF+0-m;PmoHRH4B^lUI2=9%V6M>=A3>9>f+vwWF5{Qj@%}H z+`IWLg>y~5r`5}K&ZE%!Pi0?pPO7ozFPN#)RcpNO0~ZdzMmCbbi1)vp{s8#8Eob&H zr*~_YSk;iZK8V2?v3dc6ogAncY;BZK5Qdc@I`B}@(`UwLAHoiyWWV#%**x>8cV)wF z&2_MzCfHI<`=@|5bv`hSFJOtH0w{b3eBS~`5q%rLk=SU)j;c`BK-7v?v3yLem8IrH z?anEdD-^O}DcHL0h8TjLx0dNB6TK5UQlaD%Ae7Q;(0*@{w|g#V?!I_5h3Dn^+aU!C z_lIgzS&*|swap&jtfu->`$lE*#?UsShZDU>t72^?zC_{Y4I=s^5&`5oQ z&AiBr1lm73L@a65f-@(tDiVn7?4MBP5+=e%d4?G`T+^d;-fGdtGtJ~`DcHap^QC7uMIgw0tUL- zWC3t24(uuw{t2SW5F370fV|9f!Ty9fqS-XxDd((K+7BGa$9c(qbV>`}{k4A#-4)z6 zUJ78f(_PVfwp*QC^2;>&BK32=lZ%Z1{=LtOPK$n4Y4O@BoX-?D4$xd$Oj>z*89p;~ zuYcf45S5$oB1V8Fc@rnR>cx&V#~me8jG4mgJD~3XaP@)b>2#`54^le zN5C)HbF55|@s$tpai^No^wCUviE7fjOVCuhF!-Is%HqP-EeJ<%exe<(U-34k5Ip< zOHYUW=dK1*8AK#2yDQy!SwG-yKEireDbwqdS#n@Tb{R) z`xJ41VelR6h0&j)xJ8XlThOHzg4O>(%Xud1=@m<+X zDAO^!0NV*nt3+cj?WgEcewhAP=(}0(2Ctm2xPWNo+nf*fhP{`k##gN_6s24D2hNre)zV09=zSk3_CXjv3040FF~cy5yR^F?$T>FZD(VGKP_mFA&j&9j zbImcKi>kNSKWO{?t{gd%4f5+lPejF{U!Do~F1jI<()dLz$aCru$NpS;?Uy0qHqsO5 z%kMBpK_Q?SnmAub>g7Uv31Pip^$3jN&_;WTq2Ml7ex>=-$od3!yP&jeE6F?f(z9CK zX)Cl|@3JTG%D4II{7_}GumJuy6L2lU`kc);V!!Vk_5$zx9v7x1d2iI?-e$gShk70@z7#8DrwwFo-ZmEX5r)E0dmQ+rayb z6Mgc>QWeKUtV}WQG>JDni+Po@vvm|Ci)*bQw32q#=)vPi<7Q3cKObo)c}ewfNW?wf z(Xc_MLfakp(SBWx^;RIhqU#A>=mbj+f!rg1hD!Ug=c!JgRnbxbRP(_4>gcbU*QhyI zTWXvi#A!GYgU#G6Yx?Q@jm~A`mK^Cw=4r-$;JQq6iQl5aiu{kuk!zAO&YK12?!7Q^ z++m{-w6WUcXbGU?2G<7N=UYpSS?k+#Iww#d=bmq$IY>5@x;KER<_37KktcfdWy)WU+B)nuIf^AOuRusEhEHgkYCC`9iF4_Td&g$x_QI&Ua(s+juSBLTW z6P1ycJNkVI_qOb)Cby#O!!hdYpAFPWrGAJdYup)!d@%BVX%a8eF7Vl?zjL?7N~TLM z9`F%9LN`D8E9~Vq!l@{eN zYfha;Qd7QU^0H)XR<}&8Opti_pv4Lnc=X`zTa7)a-)q+jE{AO<$NA#Fu#Z)!CwLRn zt?1oa_T+lv8 zB#(Ed*t;J#h!jTiYjp8@$gX+|<5}I!S~w364innNtTqeJADP~^7ya_`xxW4D*RK!X zTZH|5`VPm!!S0#DBWT=^4tG`Cy(33fe#MdSat8KU3zpB6rBx>svm}QDrT*~lKRry zUtP;n2L|v@qd9P3klKXx~n)U@%!}6IjtY|99=lGR@ zQ9{vpV=O(!>bHLY?X!d~l>P#LevCWj6$qvG=#2;-SR-p;H5Ot7LFt)yJLC2j5Jow- zcXwxnpeVH7ei;qiL4NoQV}RN*V4T5ZzJbY>Smu#Iod3mSz`&&Exhl`{WM5^M_o9-!4ES?;nv*0T0n zX?RIv2&=|L1u7_BuRT(6aV!Qc6x56j@#N+`>>674QsGhFZHDL2r`Q z3iuX*LEsQpewKyYQE}|AMCEj9d0ZgY2@Kw9<%qi_JGe9+=2u4pKFl8%g8POZO-|Nw?izX4vSV$YZ5&PhD3VD<6pv-)Iol^Zjo`NgME34FED@H#* z>P)ryl?!fisoJWB`ZJi!V+68W;-O9b2WjW7^i@M;Wh^=L; zk*`1PpYZ4R1S5{QKfLHYv!M{TxeAgdfOylR-AiddT#-NlhnPUAiY(tOCR;^vW2w<% z`WPeuejqrFmjZy}`!iJq<7x??HlEG|f*#(v)r#JA1#shEqh{O&{pH^=b*-lYl5hS@ zm)C-uf?F{_)(!VHtj3`jaal*9MHJ@|6J~b7>9I5@Wo3CDNsDJZ(KHvNZ z#X)-VR{wZ`1puv^mr`BnUp;1v^1Tc6Y{Khu*J?Ec`?dd>XX73Yleq4s{B<)dMm8vQ zoB~Sl5uQN~h5lhyX36)VG@{}^;9s@qfejqf{`a7=y+F(_Mn|{>nGq=jyTdB&+E#{L zcp9v7JW%e1_OG_bZdYS)?O&M!F_fGM7B}#0hauwvNvXePU1Wnw8)IW;WR!K-KmT(} z>o;`e^2%~Xlv!My6UivVGWj9ybqpuab|p9B6Hk|yYJyf+;-S@V9O6fEp)E4F1DEtBzu?<=oF_ie-bOcD<4IAd-X2Z?@N zH@)rc>)Qh`jC+#}EsVVx5X(543m2~^5CE?d#E98+QXlHSx`5lq!O@Cl3y*gL zM!D{R`olYBiOu;O=Xj8xFtOTBiQuVvK2p9C7z~XtRA{`I#i|e~CT;%0+*E~-mt_;c zE#W&0+@#E{n_r{p>Awe=N3%6MoNxq5v<*=Hq1Q|6HbxT>vKTJ;nP^RUk*V|urAm9uR4w6os4LF(@hRomH;_<;$5(w zdd*)1-1tUFLP}ohau#c-RpZ|x2-`eT**$>m-kN&(YybKAmmv}hQkHV?^cBGUfZ9*A zqlb1*fBdvL{!#N+b^5F2x8G+72dqS-&o8W29gzJ45gM@IEwDRJPB{D|5~hW~EPCn> zvPL{7+YYkxiGX~IKKzmJD=HH2+hl}eBXdr)zYXZc?FJ9p;l0BEvZ_E~=-m(fX?_>S}VXv5h(6ls- z*322r4J6ZCuJY0!oI`U%SCm^pGi2}oh{K(a5zq;-oq7r`^B|-%?+4(24$RE^db$L$ zllj?+I$8Wh@0U3t)`0il54-gYO?4^fj5eQ>zQ=7agHyteQl`8Vf4r}TDjula z0ZrF>{z0Ajm!K@gLo(wrPz|0ghJt3%-fRjX4y(CB8Dct>r#YYtnr~|NydTD_DaG|j zVe@>akL9)ek2lgAZ6;UuV>Pw3tc)jJD3hGhRx4#h8~D=&(Jp$Yv65KOY^pgM6Wcza zz`N}RyDFLdf=?PQ*JcBJOJ|Ejw)mI#$_cC27X7VaJvXf~wpOKc(-Fu^(GS?z3-CM- z1ogZE5)stembG`S{=Bwb8*!XW-^SpW6}{o_R~nta?FT0c(T!4STkP>glY$I`gB+jt zyEk6}MUl2z77gU8Hs*3bU;(?=h+d~}<4A3>9lr8~Ua|eAef$%4d@V%Z#-586^TF^C z5#8e19JBVnrzT6(lHM+d(}4~lI1^vBjfYZrAme?aAAMtL#q6$i7PPLdha2|)7(@Wm zXgkmsNYsw6jn{*Rd>6zh`s_$1Vjt}O+l@DKxq6^=w0wPRmCdT@u$`Wpp84G(uW$+u ztC3zj(|U3Qo=U?ZmG8HZ%3OuLqYVDI>+92Xp(v63MH-x0zgF zixZ3PXSGvRrx^=Y3o!W)wzKY2-ecnANby56x(D|Cm(S+Y#Rl{E5W&1x`^*g7W zpu{M`VB1q56WYf&BW6_S<$E5EgUW1SnbF59TkON^S+|$`> zN{0MM1(IMY+1a-eN~5?;8Q($`apd2`2T+W&+9^B@v?g(zMF_IZSN^1`bh#b|ps$Ro zwXsJjTca$XT%ouqzk0@L&dZPq;;u{u+zR$-MOs=n7rodDW zNWAzqXUMv#+;A5|rAXF~trUqEB8V_ET?$y3RLz|?z|X8`WRvP}g}4jWbA@d`vIc8l ziN4)gY?Oy)sU4kQCxU_x7eugX)L`sJSr=jM_NK*T7{pj3Chl-NTIdK4zAVZQ6ohyk zH}K~hw;ea%9`Vj3Q4k)3x2|#Lq4vP@?bE1-u(Pc)!3GU5df3or!~8&%d6p1RQ`Fnj z3TskNRlHE|^tL2dQRe~SstS`>nQ~Gp9w@2Y2S#^aFW_JbuPX<+5_uaWKLQ9>FJGSE zb>X>JsXQ%&dU#~C-bEkd5?2ep`+%K9l`*#EXIlM>X;xKp)ao_^slSu* z)8mr0;Rq3&MaMTS+zV#2lMhQGm5kS0D#PwnFX=5bze7GCLfoEh^U=>lS)AhlqyA ztY}#L!T#Zn7tu_#5}s~(eVS$vw>viw2=)j@%EQi!vZ7kH&*y>3Sgrix_l%OvAi(M% z&??|EMGdF*a6;%ffd!`L`vrQLS@u(~ezVTaJVMiSBnpfl0_- zcB>L^1K#AT#GP!2tGsr{J+zVeZ?!O3*6yBxh}KE=RM;EJBqkxB&J#y#Oj|j|3^0qV+Xt8Rc zSkVAA*XJi6p$cPC0j6K2+?~H(9T-xFrnU;htaK6^jt8W=CreF7qOY=;Y9N6DHa4PJ zT8>9Z;48vHM!FH&N!aQ)2Xl_vkbBcAc$WWMkR$zB;()_4NP9P!z6WvH5MK~KvNBCu zx~M44Ryr4NEA$wGiD%U@9>x{fEhX{^J<-kMh_R5dn!xpQAu7`4;FR@NZu^&7@hx}p?^ zhg0BpU_iU*a36o(!|keV>up9V$F7oYbfT`6^LIk8;CVZADm`7}VnY`aQcBm8i7S`h zMIKV3qL|8&`L>#tt1PrY`dlCiUNDb5py0;HZNqArM_?7%7WG|oUaN`oGewkVnJxFn zg3q26?s;md`?}6b{|?54`&pi>#RXn)`PTQT`O>6unuS~A;|zMq?#jmMxiJ?kHkLZi z);iG>`h*dgaZ5Jt`<>tQ654(;b&8twgyL1jPmx@hDP|2gu*@=gGCK}>XNpXD_k`U1 z#oW^;8=F`&hMSEx61ih4vrvUMih+jfEgihU~<)P%D%Ragf>i(!|VL z)W+shK=%wlPB4Rf1K(JZ)tdBXb{XhzjO`rUM#*es_GDVNRtTb3X0W(F9ZxE$S8Rd9 zHyN5j@R^=1Ixg;`_3ZFfub!LCQF8t6kBqoKUAhfWD2QaA-_-L;!NsG%2u&&-` z5aly*;b|1|_YvK{GD_L8HO^;yTMXwY3oGpE`>S~iw2U~$;56f9`A(g(zF^X(_x`%^ z+o`6opeE%aqzY%pK z80EIXBPVT((prCxr_A*R@;3O61or(>h2D+1t#%zs5? zb>%x9czQ>IzT-5$ZKL;EYu|ipMo~;`^xh^e1kxE!4FFwH1A(lywuYb5dZu%;qRoX- zCsq&1yaHJXq6)nE>6+>Io4MMFLt1gGb=;|-?eG5JYk*1hL`a`Y9e`k2$29waovrP1 zKEa|s%V!9SlV%q#fKXV^8cy_i5H-~{-o}8lpH=xCMlgWKm)Yg>Kw98q1uIRO|q0{o3;OA$0oEZi1%ahIH$kr+V%2bPB;(L~%o63PnFM8;@v&R+d&Etol6bCnR^Te;awEok#pAa_ZBCdZ*5 z47iyasOM~#mFfp_K1As~02xoYvtu?&SF*)FCQ3q2T-il%?%f(jn{z|6X#a8Ed6~c~hG^ zzu8pVY1E33ya&9XBagi2t^H;;wqXs#8It{yd2~M&uf&M9L`j5@MH$)!X? zwjGY0FA3iL9D6*5NVDDd^{Ut;8)HLvtUBjmctrA-Df2aJqNx>Y|KALb906Qx7Og$+ zYXCOGozmuYL>YG38!I3wUak1|pH$pSwliVuFuXH0&YpHuTwrh7r-H7hRval_6}vL1 zRhR9=s9yM*=!~E0u#D=b_e$xuDxbi#pl+ep&;aW`rs#$1NIz;C$lxT4n`nS>?^{2L z7Bbp!oos4GSx&>cK>11Cb|$tm&ct?c*-mLo0cq>9CXbv*@_1sXx+>agNmc3IpNJ}( zcHg514N1~7NfN(l^LYE&=TQ0u>6Qj#m7$32S_SmZ`>+T(YACbPR+mLy_FF2dJwetC z7jk`2N_rP)wcbdGt|yEJtD@&8!AdE&g-BX@VHC~&hZJAj&Fi3=SbgNH_~@w(@qzq@ zfYA+AV!tlYJab`%aevBO=$0`>9Iuv1VYV=}G{1nd(!f_|s&T7K!eEm_apOnP*@0Gn z7aLb0Wtc$oNNjF5Off63Xi8w%=XQsEm8eA9Tp7dP#gU{93|SA(0O0_|Xk7wsEQO2^ zF+BVz>V9Qk_3KJ)?z7hV(r71Iz@6WlC2;)*nEPzA-aAGNDGu@Z0p!MY-$V&;Lk$Dd z{z@mW`?Jnygg^C_N_L1V`+2yBNQ#Vn)=mAOs)bDqr67>}dFtwu@z;%UQT@^H&%jew zpxfAzbIU`N+xQvF_Wn$;%1$M+farm_vuEMz?U;~!K26H4w3nma@2&YdO4Zs9%TE-Q zi&%_q6XFue%v!lAG;dn@Cmbk@kWrL1EegGM5x@ICBbm`HPtpwL>cdyv$Q9FKg5o&lBmg+qYi7puB6?7@or?pZ5f}F=fJwr6!h`&!O~} zr~K2v7rLzeNDeD;AN-SS>GeNI(A^2|yLF@_dCm!ovI@`32yxhrST&l2cU1+b^N|#d z^WTA!>Km-*G^$`hAgaKUg`Alj^1jlIreE(BJbcM7g!eU*7#+VI%`4W@0$xgSg{TS$ zQ=Yy)&s`$7=&js{WdkWvQEJI`@t?p7X6Y&127Aobijd_>*Z=W;5Moh)abeI!B56o! zEa`x>TIfkjz~Bc_-@jqwcTkYZ0x9lU&eB?ob1_@pauKY@&87b!gpS znwU~FbKwg11qgr(S?=jEekJbMZ=J`ue1rl+cdS?Npy)9sx(8rTs$=L8#l{feE@K%D$BQCws z2VXL1@8@=U-Rt;d+IJG>hOBYk_dmh!40sXN84&Uylq!T1RGiA{ zg{%^ue}|5n{YTb_V0kpLD^|0TlnN*+HpG^*1SI;C=wtIKh(0)AA-L%^JbK&j+|nX8 zYc6nPXMw{ufSqF`q4J!bP4i%!ROq0y3HFog&4q&sq|JbBp#cM1xX|{T-v;i17ic23 z%e%1CE`+O*>Az_M`P}Rm7-lERI*-Rpn=~So{LU7`L%q?M<~$~UQ?a8IhgFTC@&aV| z#nZa>g!uM^d*4)qZ!+%{pRFrjK9v7*%XV;A)hr3%zpagq)=dS%Ra>)r z(|BLYF~SQH#A=?_Dm`?*!w~r7Nu{<^xn*b2qi71mx5I4}oQx?6M@gGJaZ&$|E*1#` zMXyS;m;6m0UPMLFz+c{``2GR?sr%qLFC!E3v&Qx-%`~FtH`BEmgZKqK)WBADM&P{; z(m--022APy9!>lb0`JE^QC7@GvW;$uc?m0PY!R-61F3saiu+L(t8=EM=ct#$kL`dh zSo{5ZqR0ng8^*}$5BW~F?=5HfRPjfz{<8A|T$lKpFk2$xKpUmgS9q6WtG}A{q?ZvC z{S+PlHVmHow;h}|)GKybh0NtGN4T?ekp6v=E-F###}21GYSd$?7Ji{yTTkRjoK=CD z!G4umiA5hFMe=9>46iO@i{fu%`_G^F;nq|ngtxrk6BDZ7;}Xs#fMRVA&5n|mG&nyx znY?1cxIJT9S|fTB!=t%UjKK?wEpn3=C~%ey&#|S)QNAChBm9_~=BuwUv8}D4`}v@$ zFhr03yhAPD49>#DT+5#bFM(Bm^YH42$#79vvP8!@k(Kffhvsf|g_i#w^pkkcp6FY# zvuu~spqK86eU|kx0!+`uI%OBx0b5c=Sh@r#vU^x zRNq+Yt_$O&8?CWn5GSWO@m8syBG5cMNDQ{_@vfM%^wfwbyGc9=4<>zENqZ{#^7RhQ z1f}FC3cWCepYvY&V5}9@ji6c7PG$~%fjVtThHbbM9{ktImy*jyHR8gdht$DxY zSaBA+g9M?7EV8$jZ0`pn$dE`Lc+g+tknlj*-!VGu^Ya^qBFEXNrpT20EnhmJT|jaH z#7s%L?>epJ<-Ig}m{G7ahgSL!alkRj5vU`+4sgd+>=Y&@Bv;N61QhX&z_yljbNBP{ zK)P`zwpXUng=C9i2Dav~2}ZJIxlW9YFR%B1?WY*_Kd8D86KFweoO{BU2WDj(^GBFN zCSrWth5gQwCjUkQ{Ht?|W(gb;&8dSxHM0?wskD!1>(4>=v{{a$6^|napdi0;L-zIzTA^$F(&S7{t4oMLdE8$Bi z|AyD8kB6KV4Q zdTo3Af8+1}S6q9>27^q1fbT};dDung+X%e+!>;iEf}9^OMOh94k?}u!{74^w_WvLA z`5ijI-G2K5;K=vNIsW@}Bm^W5aO`pFzQsbQP0h!ZImAd!9hmX?LkhgbfMNHQ*$uyQ zA>xjTIQ(+i8!*~kfoP!L^Zaz*sV{WVcEO*M(Cxw$$~1CZZce8%btq2>%A*Ml=?-+g zct*B33~nmsSd*SdcV2rh22kWX9d$B65o`Asf6uag#4)=_ks9{Lo+}==7&X29fZET1 zJ)*LZ`wyk``SOplohVI>*p)`X(k~l5a#+vjOkl(kY{XQk!#%@4i!X0f{NpSFtCFwx z40;ebkgm%L_G>=OK-RDBB%-$98zK<7y+*;beCssMQeAxS%y{d^$-4C6!{^Ww>i>rK zT3%nd;#Kb`1?}#}b*tB?br);|wdNyI%P=e8I(`6)9KLiV@DO_XXp_0e4s?YAgXw04 z>!arPgj2RfWktG=AE!&V^*2K!OLt7eb)!u8ufg9E zSN_zjv^*C?_Ou>r?0h;N$+n`yi`#BIY<99u<4hrKEG>ul`uOM3fO0};3Am>Po7e)r z=TLb7^eG+%6jAl^XrGbI9ni=z@YoXQ7NtX_KRaP=g_vHHxbtP;1_9M8bK;v^V1XAX z#VBt`uj5W*v2&I^!*aWJ@SyvWBz77|zy`sm%)G{C0w#}<_Pwr)PM-9ug3XSrO)?;cO^J+)IwdMOs2`Xo- zaK>9lnI?@5x4$#OGQ6_uD<=BoCb0J}TsiKv;pcerJCRL;p@#uw<5$=VZCCw|cO9)u zFZ)ZUYpaHr`{-_Py4>@7Bf=4xLJau4XUh(lHW~gJEv|sHZX74$o_dE)5?Kq&U+b!cI`<7uuGW z{#|G1S&Eml0uUI%qgR3w02|Q@AZDdi0j^97AucoQd@!F4!rZ0gpSME$)-`5N1Fht>)6qip z)kK{8{s~{)s0`Jg)FGD0ujd`1^j8a5bf$zv_rJM;%r5kLak62@9w54FAuc@wvaw;h zyhYoWJC(H%09qFLz@1FM9=q*;u9Pli0%Lcoat(v+4T~q|+gIjppe!v<2Q{wze((Tp z!dPUXG!@IH8ao4W~Hs;Gyxac&iwqm3Sc1YaJu+=JQIxjxLb`HWE-lqxB&3kG+kZyb6}`z zE=Fx-`-cSuy$;8qM?mkByrldjz)(&KaK#v{g&Z~LcgiLv=6W&UxXiLNELMB}IUN;S z)ey@RFe+V<7F)`l#skilGmWx%C!iibQ_1f#+wGoFzu{kO)=*h0YIn@Ju2C<{BJ>Xx z!oi-SH^$2@N1(!ykJ+J0cd*_%lUKLF;<5zs0$ZoOqUTDRh*-R;``K@nNCsm9c`4cQ zE~|cXtT__{!V?q>IB_ci0|O~bELiO4{$l)h_j~>BIQ(9iD9Qy~+gLBd()S?&SA4|E zp2p%K=*|tWHFiD_i*$2!)&5fp@eC5L_+qme6%)tFuJjEyq4dtiwj8+ps_N>vpj)Pb zOmBRMuiCi;EwLvUbVhlQvFpP-KySUL+QRf(W8y=-4h4bdd;XuZ7Or!`F)J-+XKJ>H z^Rv3_Bpca8Uxz>|7rGwzN>F1dH8DO=g|5OwD2#OCF!!32ZX>!q%=rhFlc=>bGTE&~ zIJwj|t}{nA+|8u`tyNA>W$}!ClJ4drxKfr%Ckp-)-)gvW8KGzq!}VDPrR#H0a?%*o zkS`*tXb#}ifDk8_0XR=Du)x#SfDhmU5rF|Oe?n#@)w&bYdBRJ3d;LUlA5Wf~4>`eZ zzOw-B>*~DIfxoor&<^qe$``Y+g9xm*-$}3A^|jQSf}$cmz-5N$nu<_ZG0loI1~R;H zjAw3c9*Hr))6mrVIUUP4@~s-^uV4nqHxDqc8k3(n~S%ylH?THJ%Kd%MHR5EI_x_z84cH;Ya zb{c)wPw}B}?^I=*pgVF4f8^OQv)fqUVygjPxAH|;GO$Kl`m}F5%vyrq;l#vn0pWes z?tU6ZvAZCDr3`%jXUTUD1%D^}NLt<4jcgi)!UxJ?KrGc4DI(~HmS;jj=-uW-;shS41R_Fi=?0p4fbesC8J!7>p%m=~9M(^A6C${}IAg1Gr; zoV2Qpr-A?4sIwN5r28UIpSevSKaSOE497vt+EzCS8ub^!|#G^T&LC{;uOzy z@ukc25&NK%7p2%g1Bc_4%vHN(_n3wFWhtjwq%0i~7bUJt@C(4tPm(11nn+qP?Sqzf zf#2nq4MMQ{fK*(=EKAFIO4iSLU^Rk(5^^7H@fUX;pZ4SCq=KQA%d%BoC2koMU*7eh z`d9?(g}r&A*rmOjxzv0%^d$6Ze`Swp!LaV^@Gqj7dH;I%`89aOpc{122m%&GZsD(o zLOZbVtf2KD`5KYBCWN1T?^+c?z3k-sasz#it45&NTfdhPEtrMC0qq@M%ozu;h+;5r zcU>bfi`t5w6K{9R2JtwFGi}Enp>B%*i;m~>V)Yvd5jbDbe1>BPk7QUpAB_2Usfb2p zDz~vT6+_32%PyuM>Is+7j0UV5ao90VQUjIrSsG6$SrlVD{<7h}*#yjy)tE-(VzmX) zKSo#Pz%;J*C!JXf8(0S5TyGzw!8`t|C=L$NzegfGieMKVMcBk*fV~^AxR&}XFHH($ z0VFxtOqh@HVgwlBdeGhym;Bcd0^7c2`SzYyN}6K_;^vG$j4WKz|{+ITA`T}26KwJd^X-^&29(0W-G+=h375$P|h!O@* z@LijBSh_As9UQD8W<=DcYd@B5f6njo1bj*|)xR=3_Z7502GRndjZC>#IzBtTIH7U< zY=aiXs^;x*Ia^Y4L06vxZnc~7k@F22v3QIqJu?KPxL&cgdlvDTKV5@5&F5B0jg{Ml zK?GuI-1H9Xtx1~T&1lS6ju3H~#J|`s{zlmAmcfprK_#oES;v0ozhq-+5%~YfLnI#n m-@17-XXxpFL}jnUuyhpx^YA;Wom?Q`>)8{n$EC_vZ~qrLMeo%B literal 85977 zcmcG#by!s2*Ec+bfPjP`9Rdo{NOy+;(xt%A-GYF`&>)C_bf=_r=g>$?3qyCO3^DbL z-}v44_1y3C#vkuod#-(EpV?=vz0RJs*5@P6c=I9YdWqu{^CcZZ1-1_Lb2Og>Nz6qZ1~lgQ zVs57|TYIdA*(gO-^adWi-X!V&sR~som39l>!}%Dt(XtE~_Ri7^jH5p0qe*)nv_q<< z`6#$L-y^$uiM>GyurL}+5>q?jlg{@MhyIb%D&Z> zo&Z{O6d$EDQ9R(cyq76P0|LlhMhuo9P0{CuR{byTknVRPL*R&30_jS7fj0m^AmF8< zoR0V6Q3pXL`D~I*z@1PmLpVlIP#(4Hy?fYwe8I$tawL9_4>nk8X$;ApJ_kF_v|H$H zhEUZl^f{U%Ia!s-=KGolVrYPJj${@_AyIv}!OHb^*0$EEUe~{2po!zM?DX`5>;N4v z;_21X-Dzzh-C56*>y_4Bzr&?>vlLAbHS{kY{gOR5ReAK!VIaoeL;v&u64Sp={M!St zss0}Lw+CSS@f+wDhA>^azL2kNZH%qz15I6_`01BAnsVeZ50#j=kSBCvLeBQ4WuXhURH9LY)152WJj%>Q_UcC%H=yMgSnU1oOMkv^eoCLhw{uUsyEktmON5 zReXT*GjeMT*|8>n6TCzQchG5yk3`Q-Tjxod=zC=aPhFwe7+MvJff?*K(%Y8lqHg)4 z(6eP1E{5W25@|%wEj}*Y8vpMrsBTsJ?}P^`pBdH1R_{I!`oktJcweVo&f|c|D6(YP zvc2;O{qCRibmH}-Nc*Mib|Dd4ok-t%_k$fl`%_N^E1fg9mghdiwP?8j8C!~4Y}?m- z$0wXGC9l#zoT&({3~#qQ21IsdvAG35qw7B`fV-hqeAQFf#&CLpjB^D~yH&4)Kj z%{68{q-2E&wC_Y3!TI^j&Xkys8KSiXDU#k8;04;d=`XHP$}0s_6@)B#$)qO;7+p_uNSRCO%IiMf z_EQQ8u6id8cHDMm4r`vk8@j7X?Vh(7O}`+2eX*0rI3D0i?Twh$_fLOv%^0w}*?H1d zgd^7oTE9p6^M++W`_Y6yndrrjw3&qkrR8N~eiDLCj|Hog$rhQ_qubtM7s2HK_S;zO zbKUV{nICMK%XC0wK^1P1dJe-jZC+!eu+3%oBe!b>UIP+z;N(*Z6k2T`dcPF4gEQW& znk^~D=XD~P=4rwR7eh2#oWG2IN6z<^QAO<6^tgOtB!jJH{;Zo%2qpz8@kN4XC5V72SnV%{2hJtxk zOk$CLx9UMaG50%G0T&h3R9TAXS%(_Z*_qGrY0XGk*~Lf9Kdoxs?sEcRG+8k1%iy(n zAfjUzemTK5E_snDa?hl33{%&=QNk!Q{^(KAucOCC_DB{vzohpt;*0x~BG*P2(Tvb6 z?~PApnv7;EtarJadj(&jgn%`zgNTt`ds4ku#7z*yRuC5M-qdSeAiko9q7%GIQ!Lg*x$bc z!_D!^YW2oi;Zk2_d&v5QbAPPMZ^7~O*~gu{{kRi$G};2n*8ZW@c;$oaU-XGUXPI%P zAU-<$2s(L^unLND1#JAX$}%FOfZh}uZ`+>;7cU#5aCfwUI@z*39@-$bs>?|-O{`LK zPzKzeG6HIrhhTlEN^ePJebA18$BO^zx#T(T>Zk?VC@iR73p>phMOqzz%!}B<`FQIx^quKY;|0;|GxV?l7IY4Navuw_1 zkr_9enwc6cH%h;X*p{@^hKw=Ub$o^^X4)ssn-Pf&$lsUfh#Eb#_ z^N&ZnMcls3BLiuaV3cZsLa1F4$(TXL)vjTeSG|c{nkw{TU*?$Uj0{92)(WI6rK|jk;eLjaCloD|tzN`L`?Xp90PV;)7kKob{~#~F`@m5bz5Li2eN(l}V`;8A zK6TMu31=LeAn%TeQ=9GrqKMEi0gt|X&6cf~t&1&hsm1>6EnM}R-O&)d4<>FVJUKc2 z^dTY4HgHS?2Dti^9NJ-?@%llgHD2KR2`LpKA9m*Hkw#7qx>~}~)ttbD>-!i78^`)4 zx9sAllskBVS{Ldj38;4d7x5(_G{(sM+{9U;9;;ib_LBNug8ZKHND>#z_nw@t z0PT{G-Ca;mz9-A}CWhmms564#H69no5sL}bt_)C0d%nOk{g2hBJ6%H~TG?2#Fq<3< zGB3}D_YQVbg?GsP>EhRe`i6#&HcS~vQD=U{*;Lscoy=#Pn2$#{LSol_UP?-`(XmMs z+Nbj|U24%EbAPm!f)6T}JohSiPJA2pZ*Fx?}=XVRI^Gg#U21SXVT}S1^5|ekc2__AEg~~$ZEb|qAo2Agh3A$zhJ*4M<9&EW zRR^E)`vp6*w@f^t>#ww_N9{R++RUK4&6_kgrEPb2FEfvsX4B4%SURUIaF?9+ zlfSemMBbyolDrPis&?&?RNPrRtpS)$_K2eLqxl(eHg8pXy4}MgPR|TITysC2k%aQ^ zMvXi^h4+8R4jh5_yi+BmfrFLO$evEF=J-I%Ki|>@<(ye&NP>%t*~*9{h93X$LeRk# zmqiz(FSo_bVe<9qQ$v`;B%Jf5B|w=Rh<(jn3$n$iT`f|p*x;G~@@B!>h?3PR7aeN1 zmsiET4|H>gK0Q3R{*s!c|eZ@0Z???@%8Mxakh!qb8 zxyHK5oHUX%|F9G%Hy`*pvQF;zT1e4g^rJG&2FTkUn_@kRAs`-WcqJ)_MUn8H!+Tsw zmVSd|eBvP?^u3-Ejt>KKH0R(s%Nm!Yw}cIl{0HIBF7{1~^Q=*}kmySWdza#n&JcGb z87}perq{Nef?aHuyCA!$`9)>su6+!xJ{t;jSOFgKm(+QoON|qPc691EA3nUo7|xt^ ze-@-+y*6VyBKNT;lx2$(Qh*cH=+&pw?P#qFN)aqrtkll08gy(SdE4x2<_L3uaQA#T0x`mX4o*%L zN+ucWiWGXTjd=9rbrAaaqN08`O@_ntx^WuVSuc2j=Z(;n>z2&JMNlMO8*1TIz(#zJ zo5Vyg1i3_8FLh@DEfl`i^O9rDu@WHHdedv2=DH0?pP?8tDnQijmNi0NxS;Yd zRYjMoMfZcSq(9_RFq~-g-y?osgJr$Tc^dTyBiGtj2ct`!^&BPPb)xzvGRdo;C&&hW zwL9eZ;$hWvyb8k*DvEZoT6gI_?ktn&2YA`z4gS##kreBRZ0?97MN@Z=4KA_$~Gq#%MH zwC*8pVN)qC&}Ue(ib7t0fhrtRjQc@3=gEPT<>Qh9KjsV9CfMI`raWC_l=QnzX+~&A zRWpN~nKRZC-9NsqN;HbLd*?Fpf~o{E+=6JhGFQg=3@(?6UAU6e3B13qvFUN~ny4HI zLR@uyrWWvFAdQZD#b9TuGBN&!{y-~&erGf*fgGThG1l!>!6of&`=w5XivqoJyfw;* zi$c$JSK1pp`G6&3QKJmk_M{CXIZvuDN<^#F6B!b*$y|mUIU3|BiPpB(FoeRzi7|G_ zL2Q$ggBxm>C2dRrourG?N$#;^?`j(w?msl@$h^P)a$G)cSoVjNVco}u1SQP(TTJXs zghrW&xP-43lkL1(<3+#Ob{NmMoOyHff4TEG+h1JzE-3n6YP-72*W>--3E(B4cra|W z0*TzHYPZz)U%qb>*xW%mn!`9}EjQ~BRQD&5-)PPq%^i;5g(G`YPlKI^>>X4eR}3q6G-db&JW&k9jr2wA(xPrB z+oT*L>S*Y^w-t{JM%j;G7R-3HfM2jllK?qxTub&l>6<~^`uDr5rB_$;mq<6)2157~ zhLDKmP!hKb#Up=)*o3C}&(sPP72M<3E55NS5QK@j$&|$DR~RmFnt7WJd>IH^*U47p zU6c`QbpDL5oU4mjah!#@wtwR} z?&_!482Q+NXdn4DikJdGPf!14E?IA}!-iNwDZsH^yibNXYdcF6+>#ac^Os>AO=w9e zkt=pwYajEjUg>-FXXHgd#DRXj%CF5^HoxLguVXZ|0#g#}dle1qEOvMA+a3qf0uY}r z+7y3ovn_3D#NF|AO{+`41l^8|%!> z^~nTz2;7e2JzYhe5Aw)mvvpWyI??UJZ(l0A(f6^@dl}{QI`4AXCS8<~rXkETeRep+ zbhw2f{X#aryIEe`F6gi-bkfGyKzH(wZP>2?Mtf`T93>Vad)z5a`oBlWXRc}l4l(f| z+3AB83u5g}RYnY{vbCQmzI1o@(Q({88pZqT4Q(P@G!a* zFiwEdDGdV2+s!@+T)3We%n!{Ki8#+(8Fz4+8jjFekOHuVio2o!7+C$@p0 zxYNN^_N%aNTtTw~oq)0MXaQM!oN8Tczr~jKreBPMj#8q)%|u*dt2ZgBnS&z!A7$ej zM;roCr^Hjq+}Fd5MLS}VRj92K`+(==F#UJj1!1642&fR3277H|7UO{CSu;R8M20uR zrB$2>uownNm1<+6`ScVUfD1|sx<4d)b`U~LgcrE%8w$vMvDXm>B#mTrIqcx|6mq)?-?5ROM0ABKD;_-1fKs4!uqr}fuWA~=HNkOtT}9dm*C;e zS11^!6r1^LtWk{p$4ItmPiG|Jqe<^T}^YbAS?j{!FF>%VXO9xm&jap2ll_zg_!RsV6%{6GI8j=bx$RsU-iTlV9@o;{A4-7p z>pqoi*f3|+?-ifjEIkwb&}1N~v^zU?toH5d5J)ktJ<4{ZjWBEnEwO9dYxydAqT?{4 z#p|)aI7TiaXd|RQ#pf8c$f!}Uhw7&QN@lW!;u1VaGi*gK!7i0B5t|^+9|ra5cjNIi z(c{64oZ$BM6>(V^6}H$w$@RQ$7=w7OzUL@6(G88!K~mr6>&zH|5^<%RelBXG?{u&l z92zl-KcMUHe~2E@=%l(voV-QBuC~gLWUq*DVk!k*=^HO zZx_9uCr`1qDdky;hGgTv1~D7s440yp-eQ?|V~~B>Z^&k*A4T6-5y=1+UyaJkh~3s7 z&gDt4`Y{(!a|03J`njm8y>9(&g}C_3;8p(a$W@=GSvbr5ycmSzPv#ZVO*cLJy3;eR zvNGCu!WMOO&`-$Z-rN8_xLiXKK#=`ss9|`Ko?CzxzedNaxuGh2;tIS;{Kwm=?X?<< zpTCj_1StI^9QOOxMM64Y^qF-$78?mw<*ofAv=A+HJf+g);y84_6Zj`z-qqs`%ft$X zGTt5oU*sYtkzpk^La;u=thu?l5>~9IVR7mHuj0{bgxdXRc~2ds)2~kfq<+$=%#Zqv zZ6Lfq6Q3%~OFrecJ#ME=@nqH~$`Gw`{NSVGSf~oD7e$$$?eispgvy<{?V_gk=BG^n zKdJ1kW%sKv^NR^@JT2ovy1=}vd`5f0_n%FqVkgC-JtNZ8GLkJ|l=;ikVwR1Xe??);d zHPH7H%9Uj+WVsY(x9NChjkhGiLR}kTM#+DKiLz;=BQ+y4_)NDNK}-lxo>KJJnsbf} z?+u@do8Ok+_z03r&J=#zP_mqf9ShuZA03-4HPXDi${a=&Afk6s1c^GfTP?4qi_{WOb$D8=HToP8glzJe ziRMH)MVDYfE7x=FNS{ToZQHhI@Z**b(un@Rwz?j%k$Al-5|hA2aKUMc3#1nnYl3oV zf;1RD#)*!z#lZ~yjrmLkc5vMxw&)e(frR?;;5h-5cS8~|hU<>q=o4-JOnFmc_}C;z zz~;+qA7%~zwswKu>E_?Nqu&U7I?3g4e@)DOczy#J+l&0;dz`xhCs}&DOYuo5$XnXg zIdfLcX7KaOA-ohII63K`ZvgD>g(`n0SM^BB@WD0%F#QIoM(q~PM^0*`KnoepwD)n~r9i!v4%ML3y;b=I0s9>(XC zm2tErveo|WlL=pxDw;kI&b9ZQEz=E$L>uBnu3k8zNH=flN#4XQLWVjvGK0^+--lUa zvRlkpl={EQJR1ILMwau+IVIvGWzfl!egO}u)QXept54aY{%+ae^I>etZk433E2<3? zU2G84oCsGbBz{&0gIgvZU)i@c!v?3mjqI7%_-Xis`tuURHsAbaXD(!|LC29&p1?mO|9&v= zBE20kporqscx(-O3t@DCRxElyP}}8)-}q+B-&@zZWW3)~o(Ta)6TFp%dYr7PlOIru zm^f{j_-eipKJFE}Eh=JVucz`_^>5ODWZb^>JtZCE@aSkO3=Iu1cK)#FlH=b43m*hz z+F2a^s<8-+d=}jbCXv%{$id>peJABD!KiHu`?eS1qv6l;W zE&YdruIevx?W(ivW-c>q4946*IlJ|G_K(j?fyF<_%?TgxXSUzG2=d%c(*Jnce))#8 zic@~13XiviynCV)&dbJzx4x~bm@)Est!ow7_MzfK!gWQ{$}1cbHGoGc^+N%yuhKUh zud7b@^z;5pWRAQay^i^F_WN-!ts#soPbn0x(atO3&pA0W>;z1?%6K|{Yn|?l zWfL|$E~NOb&4JK{i%=qypDdY>+-uy?W}b8&Kf&TOE@hGQsT-nJmi;n zY!{x{9_0j{YpmX%qPJhH6kO z(CmC}pDF>;x|{}IH>Xq$rPfI$73_)u(OFaG?bqHIy0b(x6&YMvq03w%b&fO6q&%Jk z=F!5gHQl4T>tjgqDw|W(@e~8DX+P#^YYXZsUi|{ z!s8spXYqS4zPwpTbSe^C_LTRV;V{hdG%vL@h4)PM2~tx{@d!~<6@LvfvpG(`-sk=C zvi5`})@gJGN$r68v`Ci5D3(|hML2#Z+BcO)2dRoA>F>-#r8Sxrl=~cNGc*+xk-{$z zL9dFTr}VA7lepv{P~oTfeCP3a=^IujP)Ut39!9k)DX@R5iqiP%!2`kLjR)b#>!=iy zNZ8xA_^boAk0H9r#}kqBF>Dd@wD!^c=I5pwcfjZ|>*xsiyxiA&U{k*G%WtEB>EWNr0GbaoKlKBf0N-@;x(%)#uK zriEveyK6W${Q_!io%J6eiT<272FNef4vY`ruV;~V8hI~!;vU9wj*9!t2VuEq<4$;* z&lg*oeq_Ot%l4qA(nSo3YlIJEM)4;aQbF2V6oU)~toA0q6Qt~1vpL>4MXlAacRx-Y zK=mc@({%@nJ?T6y!9Xq5F}^%MUpIZn4$DcC(@4ACM0mTN38A^V^e2FN_^jEW)){ac z!S~RR4+ON(pQw+r;tao8^*5$R+Ien5{0JyIGG4$%` zWv+|g)bjb$SOE#VBD~I0eo#?fBHZvr#oLB5tHZg9rBX#y(ZZ)r(UQ&5)QUdl(?oXd zAB3dgP(}d3ODih(?^+WLG#J8qQmnvY-;?kd{;np1n7pB`C--F22|t^?JM*GR$y6Q# z`~KR@=Ck^BQ3K#7VVM$s&?xjHd~EGwi8ej`s>a-BTom0|QFxr(nb6kgU>ZHPHuh@p zHCRN5sOlGd-tX+g)^K^HlTUSdFD(-Gd|Y>RC}y4Y9(eLV(jm{?$B8i1aaD=Fqy&EwTPN#=gH18H!W z&qf2mUE6iw0aX2I55A}KcxT_UTkmf%z$TIzOQYH(5-y#uST3C*iV4Lw#zpx3m6|(j z^c$bJDAd+Ktg6^3y2`L+1>S?BN|3QIZwmj`5{k%k$Eht5?kjW0XP4u$TUka6E(R^& ze=I34$nH;u8Zfo*jaqT~F_IjM<#MYqKu06uTZgzTrJXr8i%*xq=h5 zeJhRfe8vJt9v^O~PoD8`5PCbu>JK>=*1D7(YhCIey@seu-#&pXC}2_F%0Yo2_n$f$ z8WjYgDFZP1p1P%%H$|2H&{}nP$ygz3@WEn8os3p!D;1`e_~2~|%3 z5wHmYC07%6R=!?AeNi1fr*1^Cr{%S4zCuoN6x#zA19;4Ah>7Knqw9^O@=QqJ?#(L1JuinyLPzP{bLwWDr_-n#fN~T2|6H)r? zeZh)Jub{;$S(k+%e2rBU_p6;E;E&)h5-x1lQKJkKbBW#kylAmlXcK zjUqj%bqzz+_)MT3DRy&D1{r8O0*Z&_bJC18GtBZo+jb2Q%|y5age|3{I<)=nZRXYy<6)Wq4%e-0*D9{!W20IyUV-%0-Z(C~n%lS|Z1<2pRFXg_k@+WPMo& z63=g*k1+^QdC(6JiMg>3mtD#j{_?uoa$_?(fj_{^CC5m_>kCJylff^EI`{8ZRD1$A2S>ykMac@laLh&Cdm#3nPc?*mu|BHg5ghd0P&C~1`9@`c&kR$b$ zOLg7kA8js^WsuHOtvV(SMB|j%g>F)D8`gU_{>0j!297>T7 zeCZBQXW@6#LS-bR;}Z=pL}kWdoTr7a@Bz$MW7Tr_xbQ8|0d+ocsKAlq1m}%Im`2TU ziUg?l&Xqpxrh7Y?oUFV;r{w!!AOZxdWn11lkiWM=+O^7aj6&A@&{MK3taf4i27kSX zd`fD17szjP#;#1l;Tag>-$Z`}lzxE>&z-wvc>blNBg=NFxla!Mh27+IpQ)@u4IA-E z+YChhi_smCa-&jodFytm*}Yn*|0)+jOopL1-i-?gBz@#($_NO&AUFLR?ET*qDgFOI zya~H&XlrklmX*=eE}vd&tE&?)976{tmrU1)k^eN%&E>?~z_HZly>%cIk_mzp6!<;x zd~=Yp5EGrI?yheazD$^6X!3`B@G$}cfpWtb|IQ>vZV!T{o7HNnDRv2;W#78sl>85^$p+S=N3G??&i#(&yK3aT=#t(~3t zZKf2+SNKttT=|V+42S7@Pni4mtUmAx?`Pj9GTO^hI3cGA7^I=FHI4UQ+7lzwE@U=i z1cGx=gS-B{=jxnY*gmlX)gmDmtg(i*mY-hx?X~P?U+U=T3GW!*`k9nlHvyYG4w6G? znCF!NpflXR8|q>c1Zjo@zq4_^+U@~C?n5HqJbv5h?{hZS`Hr)W!c=lWO-Eih$wh~1 z{$RFz|67X5g<`?vcaGeS4r4WmvPKJ>N9ydzdErn_%58%GZXr~1>$_mcm(?BgLZj7q z@ATR`nQxA>UG%NFxvpo1QC7y z@bIu>C+2?{!Kw$9p6zguQ?Tn7ws!io%HkJc>Kp&XA2)6znU8097aSYE3d%Y;afiw0 znZ;uLM;Q8^pt9Dy{L(>c+o)*;nX9i(R2W4;(Ks?e8l2Kn)Qj#knbECnZMSMIEs4ve zI?BRO+@zq@sf=xUz)gtEKP}}xs%jDZ796vM4bMMgWbV50r-rW(UMX4AlzclKN|xL# zEzTakvB4L#`l%;h2{n$Dyuh2CpSN+K{coEz6g6fnqE8Ww+6PH=AREt{9%u&kcH9TP z!?0({rzSW3DRwgp&)2$LW^O3~`mWkH0hUExMN`>c%XEyxGkD@`Z>-!1{CMOi>Z}>~HhO zB)JC%_AeLrJsyHC?j7|?|JwrCk5*MhMm!r)+jhVYvk`~AlLm>7bA2o^2X{iJ#+%y5 ztIAEJv&5hPU*WLQ@^S}qMlH_5UxEI=BK~c>VF+K}6E**?&qot>Y=8U6+>-yD;QIIT zf4H)LxwHRpW&d(#|AQ<0mqQB#aK7ULuE2+*d0W-x|1K}ZrV3RjRs1^X<3r2)ntS;7 zHVNuF^6IUT*dIOkhOrHv*U34mJfg-N{649a6nbX*QbMhFa{kfHQoCJnMcB}l{-oxuM*p zF+J&FK>LwLl6bXFCgYi6+5tN4@Qaab^LyrKCo-x~DLLwf$437n#>GzNudTDKvuHKY@Vh|Uu)&R%6t<9n(0r!N;d)&``W%vHZ<+FG zdq#(lZI>&v7jJZND~+QcVjhom9(IdW$Otkz;njI;4l6xC zCThQlAKA?Tt!S4#CPc2uEZz`vc6|;_!Rw;4+*HOekm7mAWSv;Lh7#L+zAP>UUkcuZ zl5$t7`RkXG3zsSB}e#-LKve^kxWDCzMIrbkyx&v#i&oos@RQ z3*Y;_s(D>5zeRD!J2>mI@=!Q*`6)_%AnQ zJ~GlLH*Xa?`mUf2aF@KCMI(=&t?`{!&$_&2=A-o@m-)M7IM=gAo#|`Dn!kOBR`*(O zB63100*snn^Nf71X7!~+`dmuTce-Wj`$0Emj!`UGGcbDABT#`ivdP{Oc=qjjCemq~A9P z`d6^z>Bqmxl)UaH-knFvbO4q1fiKaxchu|PMIVoZG(jJvr+6;8_C%*}b+V32sf}@JXTZ{bN(of!?pz9?KT=MaYOqUM!?AQ|FyIdF;~z zCe{=VkZz)V*xt;hKI;v!1rWqtat!wD)&qujyZn6qI+@F@Ly`BE5KW6mu9Y8q7(yr+ zKc2MgN+u;G#YANIXWhJTLp)7+v+RyGk?tQ8369HH;kSr?fl%Anoc^R6KdB#$?e&M-9!&oqx8Gl;GAvT@-pHT?$~>GeiyaYNw(jg@md=AeIKUIBRl$j=c2BDNo zy=VY`ys}6CtC=D>XdHzbQQNl`WH{bKeiG(NqfC>Q%ZbM~R12z$oI0$` zO4OOwuJ=G^ydp>_S6_+}UR;Tu>z-NS{bA+M(v8T7tVV8){`nra4Pu+l6Ynwvnx&pGU{VU?iFmU}dul?_D40 zIpa5tIOX}y#M8Un@MmYLIQ>HSm@i>1?X7YXD18r=W$AQsi_U{PS!+IJ4p27l0P~S` zt8m%23|-|xdszVOON^DWh0J_J!Um@mU<+DRQu3p^^3&qt;*6LI^)E(gK%M_&{66A( zbs`c}dR#1e>e@JM0wQJLo*>yC2T?H{h&)S~envw681JL@Ohg?C2Fai8dD&Dv5)kj4 z?=Oy#Pib~{oMzoExWE|BKPfC$m>h(a$gHH(*F)COn=mmBnrm_&99~m17I`4S`0OG5 z0T<|HhJ)^;*>C#e4+Y|p{T9?s7lDYd!KXqR)*G)GvB|kAWBU)?t6fH8cROmV0PpkEhF#X|vhyZ(m!q`;7{ z^szE2{YFDRnoML95s97vLkPMeG)Zu4Up6JB{fjCg%B(y3k^c0s+~tbSWS(_vty6>T z6YAHs-ZWa<;9^62fz^M4sVokp&VC z$JHQKR#w_E`Opg5?z*UV^y=mLWB%lje+G7tPLMy0SgoB1IB)ALF}W1KH{My}x<8~5 zx=$(D?8a^c-6#DwY)Z))%{cv z);hK`=yZTu5zlQUF9ZORnz^GAq+U)-l}MrL+-~Z#!Q@#*iU)k+2#dKnyk}PioxhkE z=&T%@;rjJ11OhVHT0#y$ujYZy(6&E#;5Z`MA93qwxX7r36Y$zUnL5{fH>XnicTiWH z3q~%t0tc+W`T;tGbKDSK#LwpTED1J{cDH zu=H^2T7RFz=*lFD3|=j)y{n?L`LTHZRTFMDo$!NR%q@mj?XrnEE80pW$zX9xRou5?#XjB?|8!$8pv@89VmlHsqXU*|uEH z;{p)$&1ODh_|m;I5duk00%(6AlYUE!&nHB{`d($2_E?wHJaPHe)0K^L(JTMz4tXh? zBIeHm8dx$M9Zrw4i>th+KJn^{(iJ^&`5q@T<)^au@-W&^=QAsT;ETvIxHf_=UeE72 zDz;HZp#@I&g_U4ulS_{|Lx>L5O&Kx_Y{-cLXx&bqTmAqNkAEmtmnwt1M7iLv?x89- z*BsJjJ2;4Li=$^&r?hKHTA_>=WUAsn{9B>m0)EJwoW+2hD^wqu`i~aCf@p{qWMcCC zTYZibw0P;Zm}5kR(O>a!zDk|_V5X}V&F$?S6_Y1BqV|h(k`HgKWx5#QBSD~H!c>k_ z9VS+d=S#$HYy@y5G%EK*vIURCq!w@8>KRoT$Zr32RQq?*M|^Cf>etl%UfW-iu8!d5 zHB{S|?*h57XBd+xpq$n`V!oz~#oK*f*+hb0B(09ibUwpBy-(J>K;cGUcrnCye zQ@}C%0vj&j2osdyIl?!aO$sC>3h7^{&DgIq<3{iBW(H?LGB zVU~-qvgWl?@!O0MDQRfX#aS7%`^~?D z1dWL+8%NT>nugx;yr^+w6_tqf=b1UYKaD|CNHh#SFf%DNwO&J~BaFxJ2*h*eiomJJ zn$O?_-g=oWzs2(6d&IwpMGtz}LQm70dd+HPS}T2EH?D#dPcvp&@9DqO&DdNySyGCS ze&GP>Jv*S+A7q896JBz$&9W*uSaqO|Zga5vTYloS7$N4dI7>`h`tV;5#suJAu+LYcD8 zH0xxPNL~)c2x4$FUPtyr;OvDj=wJ4{FN}1gm0+c5$ri5x8oRvt>GV+kCpB(4GYu?00@Qz`2J#h5%j4{oLGF&B?3K#!L zSN*uUXQ02ozmC4XzAM|0Mj!N}Z>qPN=NBWqzERtef3uYha1cL&Z93`^wnz+w+#ymp zbQWcCPSv1WuM7YEQ(dh_Ce!Wz~ zcTV)|R!UL+w5Vf*sMI$jYZfNNBJbKMr^3$V?=v}x>8vN+NBKDwJ)BnBap?Oy_&_ zHt%DNV2dz}Ov}r92g3$etZ3~0U@MNTQKnN za%!BHTP@{AD??R}UaK^_Tghdj^9`As6kb$bx7Ra#>d-2wjYaR?;P)E>cCSQdpR+N7 zk_dayHPwsW(#)z4I$r^je);w7m~yOtGrzvywvC)Nk>XB`#e1!b5=sK%*ZksNME%K| z1U$4O!y-*W)1C%|JAkfeo+-kL$$(mc9QitfU|}F~;R^NcVE(>l85ATCVM&aON{IIN z{W75KshIMXL?Fu)|H6a?66V_Thkgcj!XE^?yhU2$no$7RxPFl=zOK;nQ+!6l|6!*Q z-{hj^Hi}Q^urR7>mqKz^Uw;JMOMov*$Sfkv5{#PdX_9A2R-bM`AySuPGrc-J5SMekCCdfqYQ zvi+?7jIxK++5iK|d=Ky!?~KYnM~Omfdetiu-}se6e#?jMhNPLvNP*ZpJ>U+>BxCnc zhm}wB-l>fTAU-?0?HzVSw($_?MIIG*Up2YXky4%ttyPsN?-K_?`-nFhOPR zZ}7KY(M-boKYcsD0%`B6NhhqP0FLFAE z6XjQDn(3e3yf&J+!C8rIL10*+9OMlT7T7=+V|rY6CR%xtO-}lMx@tl?j)G5hcTo9w z6N4wB!j0b?qJ`##z4!Lm_U!Gy9*#P&_;VJ{VO;(Vvs;T|n-E`x=Rewg{bkc|z;=+~ zix|tvFbL3K!QK`{ zG}k*XUGA?x?bnZj+Ay`&39KT4_9$&a*zKNnfy7Vqu74p9IugX8uGSBWrIgv(OeizK zDeaHge!BPGn%JM|&g+sE-6Losa?l;`zLAMV%7olMwI6U;xxewAV^RY2auD>&TnN^^dL=Wr$#Kq^^$)P7-ETR+gaKh9bvP zbgI$~Mn6M@$#9{|`0|0K=TrbsPlQtM=iyGlGyw_|uCA}ls%kibq+|H5IEwg1wp=z0 zM&W%VndeA5kDqtM-3eh-sEIVby2Fd{0ZMJWxOiNOTy(OT?l)1;h)Q1M?wnEaPqlVl z?!uy8twacelk>R{>a5WJ#n@YiMftT|!*oau4FXas9fHy@G$;s&(%m5;-3$#9(jZ+T zA|TyJ3P?yxcXu-k3^Ug^`n&JveZKp6-r%2WAI!jY&Ypekz0Y;7wf5w_DpcXW=-NnR zz?(27_6?JGmp^A`J|XSG$Y1JC>lg7%k~v zCNXJm0mPCGRx7+Bn}t+mzLwK+nLn`q9@0LZ`W5jzlCr&=aB15-OJSB)Tzks7$WdzJ zz=Zfa@enu<%2y9?L?9dlOv`P*bKF~hD$)QNOJhz&n9u&5=3k8fec$M=w}yc34&$bH z>rHDDtjea_OIDIHI}^!HIkj6+Q%tob?SjC{Z;iYuTmYhO<;lm%k;cgL^f^8TKpr~e zV0#cGdQ$X!K-Bb(G?m{LHco#3ElhUKK|sb8@9D-td@aPSXr8(*^B15vPhpDA8TQc( z&eaniy+4;*3)|khwzrp%yg;+Of#% zBH=%s^xsbok{GpP4Ny^QnIRUnuLVn(d_6&Bbv$s!+PY0!odA5tAwbglW`2r!M*1Ey z8)3k`qxk-yFD38u#KmYGBBNtF4kr43EV#Y#xlg^KclNeSD8*6U7tFj9J4O@WdZcOQ zYZ|i`y!Z^?$2r-Q+#<8EZA=u4k>N2e&NVbBWY^Fap z>P}g0o!7KFxIHt+~l?pFXuk7TLPk+j`WQgzOKtd`b zSH3v7Ez-5jJUuIlt_nDN(0@$69YHSZu**+(vD3MrJ$KU7xbwVB58OR`1z6pOk?z0Y zqqjPvTx>0pMX0rRnILjGyM2sUe-JG|UeA2C^MzYmb>YC+BJ_NkUKvnxx5vVE7Kj%b zS6(-lI;lCBzcYsw7xTSpImlZ8YW<`RCZj7~Z9`P+oku@|Bnna?J70>5dQNF#dNsea zE`LIx5~r!2U>(S)$Sf=&aFl4}PbCj8kt$nxEX8 z{fe+yZW0r!h7^L#N~Y)nbgY+TZ)}WXo7@_*yaJ6 zVg# z=R_Sl+Zz|!hBHgANZ<-GgHXPSt3Oj`LxA`{jwfge*#Fkl{O9$5S)BZfJ@9{(>-@hf zfHpZgt%pCZ&2>OJ3`wvsEE^Z-Ugd0I)eU$4La;K7{L0Gs{r&yHbr$YNf0#zBy=Qh^YW(!aC2USDbxe28-n$HXC)DM} z3TNKgEY&ok4noZ%Rl3}T#}%6Sr$7gCB2)2{Z{%6$qFez;(&wT#uD1#4-5hvT8rooT zxuhh~d+$dvO8y%ljpEC4R3qOb{sW~vf}QXz&7F0{${9`z?A(S@uxr({?nG+>|cEVJ)FxeeO>Yx zK&`UHDEj-%#xeMUrsLGT}7fUw|zpei&1@Gh2hF+=!%bT>-^rC0q;<= zD!0^#h>H|9D}Gn))z$U)0%iH=4^_LDLTfH8=TzKkq-&HI1ySkoWfWVw0k;BY-#=2Y z+(ad~?l@E29m?7YNVF3-Z;F|o`5;Qbsf0gJ+x3b7Crsi7-&5$Q$=N^%)?ecO`d{Kc zA7GunLry?7Hk)ZbPGaGHs=;P-H3{}PZiTu}I)3dw@F&%236=M2{WNArS;&Tp*wxXn z!}wd}-BxJsZt(R_M5>l(`upCQJ(aY3;3OC@bCMuT^D^pNm99Qd3Pq?<-q)I610B|r4!PIwN_Nf(MoNM}0+AS-zb*6G z6>tWJFyaI?^5C0WHBy-;x551ZOY7xBKi1z~4X6}%8VEY{euWe6*sQh^{hZTPuq@(MeOY$|{Rm@2M1b*Py+}fq|M(P&E10 zmKN@<&W?{qmDnWWU)Q-nca+QF$6D+2@v+=_Hrub9?SQ*2FLsK! zz8^rKf-P+BhKnV%HzDt)Yz&XAQr9cE!>4Ozps>qIkg(eup=2nWni~=`mxAluM)>iS<~IO3KU(u>p(l>7=j{>)|&?ZcE3B* z^nZ_>UYeX_MmR$tRw;}j8KMEVpDvsNW-a<8G;$ByZx@N&zvPKvZfOZ=*rr7mXkDw32W8ab1qup4wfce%fwR&WP-JJ z#4k=Py+T9d>fC97kgHRG0u9N6AM|Fur;0EfWc2#8>e?s)j@8H6`T6_Qc_HtsHBTAM zj`)}{oR!^Sx+3(%oai%;>1A!#f4p~9`$(&Hz3w)nQBj+u5Of`TBd9#k2@C%jW%pN~ zpqw7;!nq!lQ~&mcqhw5BC1BzLY+|zTu@q68KE#X~iJ%w)X7@XPH5aLlU)CxQhTytk z%FHZK7urJEgfCX42g~HtJg!!5Ui!y(lULwJ3u`-O)I~_Ph9N1YkODglY2h7ZM*rl7 z-iA*{82I^x7c(*629k~Hyw_yq0C=%U2Oaobrvd+y2q?9%PAaj_D3?=+MIrbF@V5HL zC%{9*p8dgxO~=qkhM9^5>3Yid<rT3V7^K1+e^7oqW$%u_R=* za*s3tij5Jh%uZ1gkAp0>he*yZERcKA2pNR0QczuSu~|fUM8e*j-WJG3+D?3W?lZTy zE26ALEFKd-oxH8a`UrD!h&Dr)r74;B&rnyK4z`6*v8yT24{{U6^f;`ZkUW}^ll6Z$ z{T@3(Y|e<`mLHUDFa9n~Ijw8Y{VN9ko!e;OPct^D%Et$Z4L}AhR;mx!HA;uvp9r2e z>l}?n!*Rz4kGEmn=#O8~F)~7_S~l_J?wsHHr9%e8T7=dxjX@ZW3QS|QC&??2$LCpm zc~<`@6XX=VTf_%WPIi9ZTMO+O|I+&vX0ZpE!@b1yJ#U;04B|X`-)wBdsPM@$-*;=w zLUuEO7gON{&Wq__)S%Vp9)E1U#3i3RgfbVpqyE`MD2aI-DfliBB0qmxJ4?QkQW#(F z%`a?i`-e)_=~BKKrKZUKJ9Ftd5t2 z(lGcPR>$3lEyaxJ@r3$$nLyqo2S2|T^py6aysthfBWi{zm;FNTwwXvfs$h=(DSY+u zXxYfKMD+)ISmE61?UFwlP%Nxw=E-5x<_qC&aGMkq^ONNRfqjU7_M8mA!YPk8!1V}1 zrKtls?@rr6woGz;3-x7guqLRkSK=-PC=Y%x{swAHzEm)rNZO6d3dn^OAaFa?g-mL< ztVXMAZQ{3H;r#}pvzQ}SRwO;ITN%fuPar~kz|dTY+voxlwwhm1VJ0C(xH&$0%45vb zFEJlK6O-w2*-QB1KLekN$HNEld(z^u^Mh%U8_1N4#pYNJm~rDZ3Hg5`F^j`(xB@g}X=SCO3& zL!A%B^KZlQL61@51fA#b;124$i|nER0F*Qf>eMmM3}%hNACaGksknx@2}zU*I(KzYba%;!~a zWxl@elRGmNvB!I(p~@tUlxDo5xBq3}{|Iic8_j+5gBkpshT`}qzGr}DBZTwxp`V9{=0I#UOkisd&;aEH9znr;P2qFfB}b zC~G>BnyQOq<>1K-l5ux*#gpTPQEXFX-dS`?ZYR6NmINFO@7F;ZkD9Cam4l4kr%Urr z>l?g|_YU{mGR-;`7r>PFu4=5F!6{5i*c%_owau-O6EG-NAm&B0Rk&GZum&}E{J{jV) zBU41R{iO`jpvhLd#|O#a-u81gzWl3TD@L>VE??2g{UU&1JUJYooqv#xNOJpe=ctz&Y+^%Nvbh=f z_a3%Z4D_pEUBidix+t>r2J~n_5;b)waxP}P2mqgUVrGjDsBn~2OM@E(@Ab=I+PYxS#m2KEMqRyl(WZ_-;3D(JaIKipDBM2kc-0!qKE&Y*nv^eA*U z&T^YPPA4ImC1|)FQl872-ccvt?;wz3Hs__Wk5;sX>utvEn4>-I2cwXAMRiMOR0)_a z)#B)@;3gnZqC|a1SP3Bxl$2z+>^k<^ojY-I7zTXrRxD{#Tt!lwr8$l|+7Sx38##G) zPmB0cqC2Xbckp4|fia5yga?rDfOPW?8Prqx*NdeXt%EOSCClSBlj!~M=LAW$R)2(i zvA}pcO1e=Dx#wyNs9O$u=j!%1hz}rs4+nl$evOk3a$c4=YSquZ{ap3EukJd?F8pUg z06pwim>SxyAb-kNLhC4$ct1-jz*hxTlMy?%{0zI#@yFeyIIPFoO@W)LvNtJPT!X{; zONwcwk$!5Ugc^-=ZIpx{5?aHIW&<-CK`Diqs&}0yXTs}V1 z2Y1CC5g%Hm`GL8Cz(r1z6U7Ij0|)vKmBy%R9ErdF)i0ppUw}{{X?>Q6T}wPHmVhv! z6rZNYvE3J)h8!V&B&MY7m-7IeV_~d47qkFBYtf(v=dN|J<*-_)sXHOdz zu!i^52&G#Wg1P%0dfhbQ_XUzQ^Bithtg5Nq5n-B;&F_V{!;mu5ZEV`FeSOQT}w30xvP9I zN$|AxEK@XhFHk2x)N5ay1YrgEC)l zR}W4K&eN~Z8!uvUu~;oB@pTNV02EIPUfFj3!jcAc-@!kklzXIoDq2x^J3C^2znVX_ z#dBr^ykh(4HntOq?hT-5@b4iBnYB`=!czr^vjKr(c6^nZUOtav+ZApvtJgmaAM|~A zRM~nnlk1*bMnLJUga&Cf2Ny=iQb3Q2QXtP!GAWkW^sk^8djFYvTZH3}la2Gp_p&db z9G|)M=zBR~9)jrSC;ri25SVA`HmK589EdvwQO>7L8b+sbV~>wa+|&H7EmQ5xSB*$I z=ktK4zlgHSarV$6y23@g(M$C1f5T6aa4>jMm_c=E)^Q2FV!w)4-MQG-97tecswpsaZ5dAo3-=xFRJ zO_ksZm%6#gf0+re3;de_{h!zWJ0tqvh1~zV{+|lFwN?9pmHn@_P>2u3VX>_VZgZv4 ztS&K8<39*WGK_6P?szm6*BR}|~A1Y~PaW+Ch3`^xKbX~P#tR<*kn zGk82je+jmD7h3%!$zu2!n8YaU6il7h9Blroun9KHi2`=YyRT=t^zt9xjm|Vs^`WHB z5EM!8SZ2TQq?KR=m~A+O?2sHo8iiL*IMP5|C`f7-lXwR@svA`L0Z97I#X&~bvSR)` zD!-P|cZz&>R_S<@PoP-f&075>xys(Us60vgONW&qjM#b|6A|V7kOOV{kw>Y32sx&04j?o~Hi0C*yP^ zWDD0dXzvMdDfU&O5~J^PD56|%=znh$B%&T1URWv2)vXYq{;Wo z)Z8sDP!W)!ARJT#Gq!I5GwhE-yY9H}p`OnRCOPHRrb)8=Bk<;YyBUo+QG# z%3Qw@Qkj(S>AjHYUAwzwIL9f%AE%^JDGN_BuTn|*b)SW=QfF?U-f|0PKmK9ZM_LwD zx;v4{zS#iw>P^no8pHZMg8^v=Ptf%IPUldUHpz0}?^F|ZWf1Q(Ad#v4kFVV9rQvL? zDe38NFt9RM(Z4QJF;z}Nk zU++d9FCs`{;m-D~~_goBqh_V`~22UlqC%zkqEi{M5lVxN5ehjaKx(+JwhEPjEZ@8O^tKEQ zueKV9$U414xfdKE&1_t$#TieA#avxLh8_hsG8%%L4;SQSp>G`-MV*-Ns9*S}By~hT z>p1U?YXJKxd@mkbFI${9A$Z^^aRbBF^q-SmTH^V>#_!yS^^b+Y6EDpRh{TZ##Lj0q z+o$Hbw@f$z0J-4wm06nFek3I1przTjqh!g?Go-m`tUi1wg{Wl{Stc*e9;DYph5M=~%HA44{5 zl43$v`?R)g3ZMQPGIG94#FS~$ST9Ps)4DT_s|LQW>0KaBY@H!~U-N67mT*6-43KuB&u0U!5^1$?7Qhz0`t~G0hpDfWipMT4 zL`4s_Kp*=4SRX9nb3zd{0_KC7R1s~HX-@B+0iI?30qFh5EghBX&T^upLtz(pA z3rthF3P7swTIj-n((;#<9@`bHngaYtQSkXiXnhu|ti-j64*q3fz>yCRpbg&}S=&jffq@hfoT zlJ*K*Z3IOpC49-~`-0RT*8w78+A59lW%ur?@U3eACQp|2Aq0R&r?2Ds^I(%(6jdXL zuyu9d=wIvDwtaH~C{XTK`>AsA_=$2YgcKaK?0TRqExbD2Ld|z~Y7Dt%g;d{3iPtO^i+dfiEh=R^i+Nd*f#y8 zevoC)`BvhD3V|mxd$YCgQwUZ0Z2VG~)LZ_JX+2yjX0r8Y8qxz}=KF@^j&nDR5A0u) z5=Cc$JL=YKs>!P#$&=uQ+Va-}%)Nj}JgEQZ*Ww>95sEny(Zh$KCy^OfU_pfhfs_6r zm6v~9A^v4l(czXV>?&{BC1qnVQ#VH`hj2b<=LJ&iJRIxWvH3J4D^C6Pp^nBEjX&c? zw|5{z1&AX>nVrQ8A?4u72l*&-E`Y!ZBB!Pa_Tv&p#Fy+Tu_(lGDf$FdKca`9&}J^;X9oIooSIIxLg_W)=~ellzU{ zIzQ!Z=59UoXKK3f@AFkUqvdy_D+d8bMz!Iy^Q`jeZKu6rXG&d%?^0w_ElT`+zBv5i zJ03Fl1GAjo0S2?)1FV(4*1x0zxoz57N*jboHyJ)ak-M{ zp3ThwP#kVWTc6iI=)x2KWiXM0jT*uP%K*xW_#%^pCF@(;*R3tw);6QHj+w^WmcQsw z6z?A7Pv}=2)%@X)b=0nN1J5zemf+`9W<}o-L|l^XwzEe zCt*i(vG%UNz56dX!{GgS)`xte_6)`q0I0ow9OU?B1_{veG(2+Fqh}kG*Tct(em+QL zOJ5_0@sy$l&1|%Y8{1fC{u?jTAWW`jH1+d&hFGmi+^yc;v*R$(dtgO`&pf1i z*1nKbOlybSS$me&kPmqem2Zzgc4%(nbI=_R z(kia-qzi`B%ERC*<#w4-AZ^@d18=IZ%~`HuPU_QVo{}bT7=bcfZnaxjUoD*V7U%Yi z183U6Cncem#NS{@p+_PIwsS>&`2=+DN8Zs~hB{jknWWi%AjgPk+W2t%DMqP_l7Q|a zRxu%X&l&U!8X0j0x^Kx7f21BSbPg>ULomK*SQTF%oxIh!0nHK1C2y>VrXekCq~VLx ze?wC@(#GdoGMStbJo^&ugTm&~cnP)(dNR!{|L(14Wx zdRBI|kr-9oR1m~;dyyoxzk~S^rTtr<`?X(xPC1w=Lj4wM8gkSDKYb|M(PVa61)I+C z@udA)aHCimegjVS>DIF<>*tP>xx}+evv0YSsGtPjk&zP@CVIIzb@uc(PJ`{c_?WU^ zZlt}V$fG_cx5&g;K?BSKQ|8bVOx=%2c&?>SErtZ*s?f>wxKGtTM`sKp>&WCe(b?R>4(wr(5E3STb50SWQ6M$;*y9h=MUoT9x z;Cfml?|5|wGEYJD1&Yh5U6Z*pQewvB()o#m-Q%%*H3?+r_?{?nFAA9VmlD=xhZ7GB zAdU%-*oMZW$L~_L_C=bHGYZO6)qxGo z_f{sefu5CBwOJ8NX0AN5N0Y04Dh23Pi6mY?zZ_ymF6F8q%j=X>Kv0C$3BvReE;q-B z5yf9;`36USL`FE`T5%C6oe3>z4R%0nU^v_XT;rgPgWD_-rQtKt%_|%02zuL~^PLVh zWAi!c1~2g2x{jw97Kc3iP5_l#4X6#1ARjRxR)`g>S{lg+q7V^66DC)y2xO&(i#d2FOoxhuEH zTY7@b$z-y-yS?4?5Rj|wz@3sx|3yuKV03{PYS2c-cie0l~P`{I1J&Lw77Y zH)S;)dRMYKLnDdi+--Dv!7yh8DYfDsS`*&EAhHAYc6m-~8U8aa;yGktz+4@pG(5NG zH&FcrFeCZUZ)MqKh@g1!dVYiIaJF#(|6B~V^w_)fzHx=5HUAsI6H;$O#m6I$9t{Y; zh6~J(ax#6wl14|bvk2*AnhSwU|KXhCTKr<`(EHHU!0@IW(a5BlrT@C)Hu+gv0HASE zogKpW4Y(WHLf7kmyQ04`*n+GubzadY@8mFG-G1I1TVEsA5@!l}&}#^ywp!&N-?~4G zv@|tQgdcXep=(H^9erftS8iC%^EhQVzAa*MNV7;dGIUoy-|E0NORmej-70&_4M!Gi zTZm$tglhu1Yazr(m6A3whl;Ox%1VA^^9RaibFwR^?T9bPd)d>32>e{Si^i$baPbfeE)KR zsPMpgPab3vq5X0$40tm7ocgUPIu8k5e8}SBBp%<}Mmel`L8sUXf&2jdL79=hz|V7e zve%F=HBW6BJ9o6{X7UikjU>kW-@sg_N!f($98g?Ch_>h#LQ4SB)r7416&NQ7kajPR z2R0xQZ#PV9W0{1q5kYn<+N z@2CcDTI@PisyP6z*|4y5~G^bY$$Vja-CWug<2Wq9<^8}*SSBM>Wg zKr7VfTLP)#f zP!N(*7(mR!(RBs!4*vN4j3?qbC|G;({tScyQ}U=kpDsFok?>Z_0l=%u`|1z;bQc0U z1wMqGOeK*S0<2h7E>!*moUkh0au-VfS*e)bL6V?qU2ZCr-&i$G=YKYI2~Gcb>3?W& zs$pvV66oByHFizf8p>byvp{lVyJ&*#$nU%uY6F?7{Q zK-l~f5!!apvfuU!<$Nx`k4@(mM#8(ihL&aET`Qqty z#{B5LZ9*eKplpb;Fy9};={?}Pf9YG!MtJ5)Z_&Dh5A;l& z^bmI$>34eNjzWN1inRK=~ z&`)a?N8k+FT*`GHb>=LZm@5(~Bbm39S+#FARqz%s5@cMTvf~BUd+Qu;R^8 zo7Ee4_H$WF)M-vBt8SIlr_H&;7>NNdlUbe+F-_pM$EXE@HD29&M;#JH4$|C3E`*v~ zJq)7#?NTL|9|1M-F)N;!;@#o~B_mefEJ;AcZ~~vh7{(T15(?fTuntGy=~v@A$rLX|BvPYL0rNmy7-W=k8?T!}5bv(-N{ zRAaFp#8A(4KNg{D=yD!!r(!vkz6&>w!lU8926siN2CavZ^~-!h?X!pjlR%e8_3H@3 zV4Atc1t~OKxL~Nxx5x~BhO`yWh9oY$p>UuGqbl;7R_bfDir~QseGSx6bVeSh8$-+5 zQV`(D2XUw1{;$o>Sa*-aK!mX90+P@UHPEVnc=!7z+pvHO>o$fc`A4uVR$=zEzC+yfiaZl1JBoC&*M0 zE`48JxEvtCh_^;(4nOXYg#F6?9J&%IwSg%P*%tZItN<@7Spy2uNbUkt*WE#n;r$Ge ziOYk?B82%1#4Cex&HFen`_V>>$s*a@Kw%e0fOk-(>^Fb{HX+P?$E0bD;}UNW`7Uo0 zf@UHfFgc2ldQEYeZ`Hdm3?PyT>1037+;dc>99~PqxxAA+e z`{bjHVc;;^ynH#zm+@Tqayeshqn|)W>C)By`)QQAk6xj(%tUeO<{EQSG&2hsHJziyIKj9(R%_vl2)LVZZ?Tm&4~TBe#4sxD6E$Y-#1OK zKKpSt{3D|3;n$w@Q6IiB^0Za9g>TwvCbvVeLsK&|xJXV+sok3&_l)>>`)b=~u}B&# z&eDf>>f#gD6_{L}EA~az$Q(kTT_+#s#F`L=9?bB`ed?%m?A|cS4e>+$!S@0>aj`A6xm)-Ct-<0QBj)?5Lc4f#0{r~)IFIFnWNAMh z@F9}8L&iyFxWv_N1N!=dS2u=x55jV;s>IxdCH7g$mhfb3MOB4J-ODS$yf0)bNOEv| z*(35pv{)IxZ+&_thx!(rBS{AD<|yXl*zJQOEscZlq`Pe}NZFX#Dcgq~*|#iQzcF#A zBW5xZxjB7gk(QmW zch%&Zh4ZK_8n*w(u|&e#v_(Zso^h0i0ZTjC()CTfA4VhCJx9}ToPm{>+$u+{+*e#f zKSYN*Ge@H|v}AVpw&~?;kY$nc)9xwK@zd{3yHusRynI9?RMdNkbUGc>O&9O^*xB-c z6&Wb_VztqfICpo;I=?4*g)n5z67A{WYQLkhVHE66@PHo=yk!dF7I17H7NGI$>GqVZ zYiE|=6$ltPa;1{$3kRTwyC;YO5Di>C^}>hg;tt7rb;;QZW=k7jh-jE$imVsj-@W>n@kk(3 z22=S~{6;yZondpN}p@ZCqLa8y&StmbY ztgVz$QDPG{c-~pKexVMAw_No*6_$d%@h`Sn4;#h5^_!=@qAiomte?a}D;W^SOn!2@ z!75;useEOjOdV`Q4dSmld)A0!^tSS6Vx^TcK#iet>Lq(PyZ5Cc!z6zbw!2JvE~24b8hNf&-wxlyLW`_ny14|? z-a!IhP4V=8cT-s?R>vWG5|8_|aY5uUz6Ei9$+1`2Rlpj4%YCo15|i6^)vp^+IizFs z8yL9)SzyO}uuO|ii1JhmfnH>ki-%%1p4dU7Lxd|kr5@^`xIav&+C=9|)<8%&+t@%D zyE5EqT7_}b1kq!8{QTtOMeC~aQKf_zL!GR+Rp1YeOl;bet21+p&1Z7d-)$~|A3rXu zNb$7XR5axT8~kOB+XF&tdf?s(h|w3!f(zuIRZXJ9UiurkhkzpJ8E@$@+LId2>OUPB zqM7pEjpB8RwPXbg80Aw@nsIACa>Gd?Xftkn^X8M8#n=W~Km@B9JJ&cq+N~-qKdEn+ zI3jc6G&&L=jRm$L*9-m0b^mb!%TMn1iJFPnL!A_sJCHvtS?{sdY>f==%R9>C(T${! zq2Z@yOQh_FF&3f0(s3&5yb4eVMb`$K$J9ne<#;*pQ@?wD{441 z7S>JnyvW_adnQ|V!MK<_2cbA+Y_uoEL}7KmNyB!- zpKIX5&0C&0qY^?#s1jl8`1O2^6qGP!sUZl&#{4t;nzFEhsQnO{+;A44g!Yd6&ll5v zlTIGu<$#QI?S4hT#lC@Uw6$*TrDE)?^R{jMB+;ak&(km?b%zBmxJ2Wdr4jtnu3P)X z{rQ@R)~U@OZU@8?`FZ;+12tdPch?reoF$HTdr^Z*L|HSLyKgZft4e4| zw31a}{GC1e1YC30S#YOXwg+*FbHJ-&@bIe54Z|~2@*&Xl@cBb`j&i!-#+AT4m-Nr9 z`+|oPPx@=6%I&qQ(rvTaPTeJa(AN)$=SFG)T%^C%MTxrodm%3w*(CSUc7jU3<$i)CBf{9hNk_3e&#)t2p z0E$}vI;T_ERd>SF?Bb7s?Svx|^f74~(xGEKSXIwx5cEaRdoD^@kR;)QEB9414l6*3 zGIOt_@SIu%6$16b)^WD&4YfSi=peIonuIOJnwY{xRx z(U(~W#tMhiC+DMH+x<3XtsHB2USfy9m&b1dPj0sCq|5q9+3a8{Wt|a(bfeEHlip;E zd1wt0qm^I({+Nj#gy!G0f<0M+hiUBKZv@+URr6fZ*$-2-&?D%x_TFkQ8k6?V1ECs? zM5)P!uQdSe*Mi^dcRyTNS*hRS!!G;D`^Ms*iOFYj9cVm7_har={QM()>*NEPdw6mA zJOgJ>-9QB6RG|60XOnQW-k&Lgm|{&_U7brbFuPYHPHtZc8u?niKRN>z)p)8IUwSq< zY&-DCVyMP`I5QagnVj28k`amPUm$;Yt{J|-RUVs+u|fN#{%+i-jG+O!(~67?=I77} zj;Z0pzngjMe!7H5>=HuAwLwO1QN`MkhX00aTa$=|N$ppgssfDf@n8Z?$_;G;YYd=Y zfcdxwD`>z8HF@q}@YJs|db75IAHkDvm!+Te)k-l=&eCKcge2cCG(#bV-@?=h0z9EX zB!{njlh{X&AI2b@)*Ns0eC{u#4QDAJ$Wuny8FvX_@bTK74&m}U zL2q`qI>gfRBZf25@}~!gpB)Ei z4+se_v3@>nS(tbtWcvh)fgnd5-n=On=C%QOkB zr4M!7$(Kvw0{R~X>2>8nU!ny$pard39R0q=uH{g2cIKlu(V|usj?W3aEpcpo7(rZW z*xEuprNoj*TqAxT#_kSGVw-g`8AfX8Ns?|(HJ4X-w>O4795jpb7Nzy)!4nyK*fsSW z^Yw7R*C#uXgVIoo$2(#fh@XuBp4miM$FltEQM2P8AMkQRb2o1y7a+&3T`Blt%CJ5` zAbYdu@Niw_LGlL*;KJx1taP4dXNY3VAfLz5+Vn0(&n3faas2M_y!uD3o=HH-;EJh z3NPP>jnAq)4j)eoJrc1o}b!8&*0%gc72~$mq zeZE9K>`@{{))y%3G-RYWR%s4b3PH#OZJfqC*f>Bua*xChJ9ggL6ZT=ERRP>oWuVmS z)gfpz0^Gg1CfE5FtBmPI>-*1!Ihw`4P|^QtJoz_H`d^Lz0Wke92=)IJFx3^B&o`>5 z_mwIDJ>J?UmRccgORT|I5=o8eMRUaP{(C7Z6>LN90G}zI>tT`SwL~#UdU*MCP9cs7z0+gHD4iTw@!4T;Srm3!#B2E$6FIa+W{~vo`T9)+8@?UN z)D-Qxyv!TccnKCMFO=^g&KyuJiu?0=dD*yWJM(Rbg$r`r^Ju;v)3^h5_*iQ7y&pH1 z5Qzr#aBbjbN?^~@YBV?=_xtkn5)Q7xeba8*N!N9tX8rXKm&jgYG<(w*fAi?()aT!)IRVhQ1m%Y~-__Bi<0BvVD%;uHhp6yrCVp2QdWGjBubsD-1?6{k;v}KI;|{oPU71z1hY^az9Xl~Qi}&?w^oJSh_S5j}`G=<< z@qUV)wxW23OQgg&9{Oeb_~*9P>wsNxW7kg-&rk7Kyi-_R+#lhI$*w=M$0@~RH@LIJInXdM~>@@TZh)JVlb&Ti?p-_)OME@e`uvL*t91)R+S-x|p(q8~@w=m`h zQu2DSD1SAA&WXk&15Zi~jJSMw8m2+zK9+W<3w`#IoUs644*HpQGi>u?2YDI^X8#BI z{U09CJ$1;uOV;yKkro=J4>K*C7=f5l>rld2yjwi9Vz!qdy==c_cPkmW_`Y9r zzNyR>-50=zecU^098bj~3L>(Mc&=gN=eSY^s(`8%D zOvu_Ex?EzT4b(jXxsiovt_>|lXi7bf#||^9L}t0}hfJ0(#O``}^qtL>kl_-?YMIsP&4iyK=pWCO; ziUsziqJnZo(s8~Hb@n5!VV!e`A_{e^?(JJ~mb#te=Ys1IrjJ0ij$pSifVr0B@wqfBfIhwDstj-N~B5w?HeOW?&W)+22$(};qpm}Of zD)`RVIb6wUep`D>eMm(5&J2%m(z7yguQr?HR|Ktq%-DXGkO;9%1GAFLSq}zT<>KxplXPL9VTiw z*&C;c>Hv=<;&Re%!6b~Le_=(o5#1ByO~*$?J; zEteYl9o6f>Rg=Fj#UK=?`|qE#z-Xi}C-aCV+(XcO25tpcdpg=no(>-mmaCf8N^(%1 z%Bg~nrGN1!iHgN@NuT=a z>3rYJ`#N`wz|T(HzgGy~Sv-!K4yD&n>b(vpF->@60jPl--=rpXOng?uR!)4BUfKW^ zn84TBH9OAgKm`;&@F%_xI?0e@jPDO8q*)Pbzm9Y3#HIiX*`0Cjhk9Wjyh;qJ>zamf zyZ%mJF~@u|%cD5EMAO;9ibgoYbw|b5V;OIAHqUKl35)UEx{A`%69p(GaX_5z@y|n? zCq&zlYqD5C)b42AyqM8m5&P)^NBFYu{^P9hZZ~X8BeX5Jy}7kjCY-J`^xL=3NY6$i zCkG0PSp(9^2UQ;_y`;Vmq-|)RQdZ-Wg7Any7=xi8PCP6WYvLXfQtz?4s;#Pt`p6qZo* zTlP7=0P}*fYF_DlHx+eVjjQXoUrh4!rf0Iw=W!6}?-Fc8deYw`NxS2%7E;csweM%F zuXRY_$#1ok6FWK{Ti55*#2rcD1bTUjdCQBP1->qL7{v9};_ltz0z*zp z5j8b6ue@hPwDT?AnE5)$(*qY)!z&5Zt_<_CtS&nShl3~!c({C~@>AWmB>N=aH6Ak+XZz>fwR-Ijb z+%=jWO~?8Zwbn+#pzQIuuC~_NvAD94q=^2}eFLoIdsn#x&$I*=-t%59V8}5*K*H>H zOPP(@#n#$&SD*n1O*%W7EYD75s(IQ4?&4?Nw-^s^bMOE&u1$zn@ATNT^FEBHpe_G} znCJ8l)!F&D@kg4lMO@#sPvybn+}Q?HlC4`0#P<&mm}1Ygu0S#ZY{o@Fd}>Ui8{3)T zxlAke9H*W}aEaBZl`XhYK5gxB!@VIN&ySbMF^mbIX=>-Mk$0a-yo|25&FbO~f#wP2 zz~ZT<$5=uq6Ol zDJ$a@DE)LQ(`^DjlPC^ZA?_60o-vh0vL`m}eJk1XM$9W;n(48CM}SYD!7nH3%CKWz z+wNo1V>`O?ggr}1{k;{Txe*#UUuCU+e7&7hEMfLA`J^j#=rL%2f4`)oDcBjdPGeBp zK6sG8%E;(6+;P_3KTefaG zRk_hfK(`dN)wegS4=AI@;P5cmWNT>O`dJip^x(zJuc=46o#c@^2@y;7{O6MfQKDDW*V|HLi9~n{8lwvVR;R|D4;Mytf>pPo1834xtM>_|XH_J<)@z;zCe>5j-K zOw8JpquHV>I3vZdLQt+7)SpH%yR(zaG@$J^O_GbwyVX(f5$>={w+KPoW zRK*=>O#{}g4oaV`=lj6_8qgBj+uCI9a;l*CXXK=K(7wg5I1)WQS4gfR{BC6SXr~HC)$H*U%=xVh0pK2R(S4=i3)nB{Qj83eQ@P zH))L-gzLGj-mHaJ@hu33L==`jA}C#tlg}~9g)GT*l~ZanBqQ^V3i4u~4Virxvl=aS zv$2I5;1H-;R4M`D*i4RaTN$){nE`;^fQ#hK8;;ux_5>7}c*aE-Vr%QoPt*i)fy9A$ zM}VJS^B;tB&|T+WvVPtxRAmvRM*SN)+{OYS+1jLFxA1JjIxu zrvAOVt4TVKV1`NATx6*)_rH;^U_wVUIkuNWz*dDJE`XZd0Cy;L?}JCxd{bB|j2xn! z1%Mi3<<+0P`9$Wr)S8AKcHBvVewOf^K#*|R+Rn7?UDQHIk!;4S6gCqPjR3f`{K zd>6M&kFE-3(41F4fBR@bk;32c9*$hV7V8`htNu;EF(Hy)hXz${D9n#ZVVf#~ z60I4Y5z~$aOdpHr@e#y|wBNmvz*&%0uqtD+K02RxLRr6zw28prHdMTwzWWMncO(QV zLKHnqw+w~;5+6#*Zs7xrJdAP$CIrNktcJ&9l2`Y=k=H+{mM-2sNpUQeV!b|F4z5TS zvYF0t8{+&QJln}QNO$Xv%dODog9JQ!;$PM~Pvmq}g`P#6K10yV(cUw(k|rrO4~d?I9PXwR}d8; z&EgM;)G7@(a|I!{-jo$@&a}z3I&5_T`sVS{KrT(;3oS}K7)#x*lZ+l>N2njTJzd_#wZ*fXmMA^uP2=`xILo9F4u#QUhLx5@1L(8;JUv>@7u!D2G1jed}`RL+ORX=J-6&5t8)vzr8XnMn#@xR1WJ*v)G{{ zpm%wKiyM1J*h{V}?Y8>6Wh(fB;T1;`3dk{gN;Ii78pXWRtjQI&%b$u!aKEKD ztGu5B%-#%mUdn%Sc=F;H>@G6)HZ2|Y``+2)9AMMQ`42p1ANzmNX#T6({67oE^a=gSI9uGN*U|YX!e6zhrK-wbuw*wl=OO3`yy?~(psuhj%o!Zn3-^%Luj)Ws?;iOeq9{HZ zVgGZi?EsFo%VlKE2|7!tD`SXiw@XDW{hM;bMBNN9ea&M&KB8xt;v_sEmnWpX0T_%^ zprv=)S@%TxGzr2;U`iy?(a|x14&)Etv7DY!X+M8X(A(SF@EC(SUU3Jc@r#ixkoj={xOLy?nlBN}qdTLH;u)evWgm0%wLka$|WQ zbp0%^H4%h#_>vdX+bZ`gSa2#ZI<*8%V=r*!d=Z)7w;y3uPRjcP`rm6Yu{(}9KGz*J zegAuQIdHw);(CgJi|QQCRTrNrDyCo}2P4cvYioX>4iF+L`rP^* z_SNvypKYcOiJ$A0`c?>B`21c{GGYgvczJs(YH4W|)Ys!mN;SjWw?_%Bu>Q@W5sZf3 zBXG0c++6u{-D9mLpC+f*YZf?;+q!dG-**1EcbD-sCGe~i`SRsUm1AlpP;>|SZVbHxXeW)y+{coLnn_Hb$K5)r zblA4deAID!8+^t`zys*?v}*b(5Qae#G8+kc25z^EM(~9(77-EjseqF06oY058O1rS zs28+{`ZxZyws==c0{7v>uor$9lIuT+pPWUX#i()-PJxRbAb6fHWi`wQWXulhvOP;9 z=IFG=!%u-#K$cwk>Oou`7>aCzZ68w~`bUgB{|ihA_@S?SB}oHK_9r z4g~rbF{LVbkul>3%D*aNRO*K#=BsJza{zV}3--_rxo|!rG!_bIC24Iylv*Fqu(k%y zJ@HvImht>{C>%%gL*Z}sDoh}X-&?_4oo6st= zDU;Q0%(%F?HL36r{;|m59GNQ>f#akY$xvLd5~v+ALjQzZ{&-QV(;f~RoMW7I=C+b0 zBC0@q+yGD|A_m~$Vd`_)wH+O-#G-y(CQzXq-fTNd@}`;a>iIb@?8{nQ13j(-h<)tK zr-}2ClBdd!p3}0r(_or3kSxb7S-P+tX;(M}@a{W9f|l1WBERF)C=Jqv=jRDhzt1-p za3E&Bs&AVwtPRRRofQwoi7kn*3F=JawX+1a{*H`aHj*i%Mx=aA_T@Vz|Jqe%H3FZQ zqU@<8A#XL01$`^>eet+#O=8WHDfG%8HSqqCIwn{*2YFxjDjYuwHpT89U^yy?vOAv-lE4+_(OjDUW418hK-#YMkOp%j$A^i?oon;irrRV`AjS z`s(N;Q3jNL`}Xur`_8$oFxOJPBr{W*3Y%8;K|a&)DkIP2lPe~nbrKv$?L_<-xi3*8 zp_yKh9191kH!BOyhKTzAh%_ZtZ!tUArN=TZ4!*sf7MDMA*d3sXbw!2sAur|0Sr(6#Q#-d7~HSb=q}v zzE6i02)l9K)o;IfK`SOeFhJTBx#8(2Oc4~0XZDJh2vfoI-Mhx6#YH0zp!7;gg$X#Z zJ$ZHFV>Z!)2QiX~%08suIou^l-&11dO;eqDgb}6LLE+S+A(o6$e8AH6F?9KRU0vPY zl{S!T2g1O=Pb34-bgn&JTpk)*H2Oj@h@A>BS3laWdE9>6Mdwy!HI#`o>%W6u?N-*==Sm-@}f=M&4 zmtJ3NRH+!ifwI9wO&u}O(UxmvQsckG6;!0nF+rG-(?p;vy+3RFT%uDZ>xa@Z!P_AT z;gf=uP$qu)f`wsjt~hg1MqP+hWm-BSN?tE6YOwt+0TDJP@yCcN`5unhR|av3SI^i$ z|KQ-uR5m`IC4E>KgwR2+2G-9U+HQ=e>FQHnkN3GiG7oll(Z;s zy=WpbABagLE8LHh`>^$9wRZ0vFqWXRKf|jC?lfBt#>Vfd;4S?9p37Qn$t8fav>~b`Q+U6P|g^zqlG<&uW=373~^cR+@b2;zdlM0-@d?BKo z!0vJU;GyL@dw8SXo+DY{7Xd8E&u{gtOgQlK@%W#7nI-l`$jA?on=6t6_C%@V{jz2! zrA_x{8SOQ`&i2AsEe6bp$`M5#>WA*KpDWXL{K-H%326sZqMrNE3Q(vLr|$*Sy|LA4 zCoc3WobN!FpYav~HphTNLLMaltXp=0fi^1SRoxhX(OO6tYFJJ=Yg>}zTGQ~CAl6KPvs%ISoGzy)M6 z5@^S&G2qwg!{F~8i#gBBz1L@C>u1`H@kQ3Ds2ao{j^g{EIc@gBRR&WV@=fW52p*)G zsMml|MbY`pB&_)fD7`3RD^rwV32s~bvaVprUHk@mxW{lVHkQ#@wk*nNlil+CFh)6# zeF6(OWgVZ{FI0!~sW-hc?5E?rFvofdB92oN2qnUxnH-?Bx5bo_LX_s>R=foYi~v4w>Z16@y2VXM20e!P4g23D4koY1v1bq zUEG5D*TbKM0|pe}2HXm4pQ;447Z>5m$B)|aL>)1-XN#paI9$f1Y41Ti#K;NbthjG@ z@7-;PSu1eds_n}ec(H3`L;5BdO=jzza~ilGlai#rF9jGlcxZVDR)3D3Cp)9bq~`(M(vtVMGdF#tkf#EsT3 zLa{~dv)@Mn`o#nfgN{&GxII{_kTzgsC^@}eJo3=`M5&mUK9yJwuT;r@{G>2e(sRub#W;}EH#p%dsJ6e%W24#5CumEuroNs8r1s*)C;GU)DohYFX)w{- z7S(TuhrF|`_7oo88u{%-^jYe0UzrhF?pn4YKKLnW$?uDs!)#*+lk2~K|Dk?#rrfnA z^gwtPJ)(qh7IL{nfzmDtqxP=h3-=@C1PU{=@Fy`R?>s(W&b{qyuT8-jP|?HLo6~Jg zT>fdB(|{V_wZ_>R&B6l8GgmHC-#>;D&b$`gb*`!fEV`Wg^7|&(HlwU)QizxUwFSy$ zJHkX7w=nHZS0b070&$wG%+tGspauw5Lrgq2_A%gzgw3F}-AHS~CptrL&Cw_%>2$kh z|L+0GJ|0Fg#|MOjy1xMf1^(6Ny2w$AV4a&qe7+W!fv>m`qp@erTbS3bIX z7;S7w1Mbk_x{*XIj!Y;T*(*ETX5K6&@8uQ4q-Htmnv0Bd;){Vb+(LQxphTaWubcdu z{2`#E(fGGb`)d6$ZQ_a`5Dn-`FbMRzI{HxIU~li<_}b^*-bWtwc{HTH0$wM|iFq_o z8bhy$cd2cf~kxr*VWUz9cPA`+WNuAKQ!X8JL2QLa?RO=ALk>9t(kt7!GQ_O z>bJocE9d05yEAyyocj~gY?I&vjSz0eHXbj?k;xvSYb^p zsY*w;$N<;upQIc$(n@UOW9QI-&|`!j(45E&oV}RF3-SgmO7*LeQS3)P1-)r_Rkr^8 z)b9&!RNrxOzwy{;vRkKltLF6z^p|v4WdNkZUk*|&qy=CoeEt9nyFDAch+3g@xx;3+ z7U5wTI{y5fK;<7>E+9&JZELND#uZyROC|hIV=fj0psqU16Xp7kt?vEBt{AF<;jXT( zAdEor%TOK+IapDCYpd*}@)N?q-9O5=H_XBE8VDPJWj2TmXcEVKA8#@hQ%+ReZa!A+% zUzzCnG6+b&y= zBrK#%QKrDSb@J$@*VrE{DBHdqGX6-1J#hN7&`}E+9q3+Hrx~&BS4@JT2QV4j{e8Ra z&+*%TJOH&xRakZS6Rt}Cr>Y&Wp$8&Anxx?Kbc^PYuMXQmru%3Ru!6O%I8P{jXsD@M zl0^zM8GmHO(CD)63AN!1Y7mPu23iGnn4ROIOGAzl4T%5c^p&s60-U~D3Te{c>8;AG zmx10Wo`@BIu|X@0!5|e8B@H5`wge4wg}f<=}kYh#3|^ozMDTh_WXYS`SBwmLixPBJIp* z>(7(a3POAj@~=5_|N4X(pMA(<*UaR=Uq*E6K|W>mRXlMUP5RI|Q>Df2H_7S@pcI`^ zm?R&W-Yzl9y9wSVIisQ80I~*cMHKr(uKa!O`<~FAz1q%U9c}l{Ej!GeEq(+6ex0Wk zBg(4Le+f3}H=R8q&H`T^x;}>{%!s#~^wBVrJzY`nPB?14%*Hl3pZ1QY?kHt^)#}D} zw~JclW|%qBxTRwLLu)Pb{(=Fysd!JLjQ(lky%xYWolt>Z)Sdrd-r+48&_TQTRS3hK zTpmu!;ZFYJ!sRDZJCgyXtjrU~=)Ddia{!6k4Q6!Q^+wsYX-MjrdHrSa&~eT%MJgvJ zoia@4C1m?m#_vl4~{+8s7Uxd9%S@>3+s zB>FlBO~qq{c5b`gdRvC>N}|hsZswo_cjtH)*lR&YPE7>rKvlmgRnTKI`>z-)qWRyK z|Cbm4FLc>bTFlvhiI8KxeBlY~51Rn0@2}~&kGR8Oh2+>rI@gX`?LD}utQfhNgu@(m zh|ZHs?yRopInQATJ2d!yrQQ-^aPiFxb<=H1;PSS*a?9k9|^OIa8kmJwbgf&^LHAWQ~>xuKWR>?gCVL#Yn7|Bxs$_AY1mt)aNf3P>7#_XnWudh9iCq?Ya&_*Pzg zInQ~X0(K(Zn!I0QAi@@Oboayd1MI9eDAAOs;V)608 zQy~s)Y0z4L1U+$guRi*cAAiqklEYAbvu08geYc zEHSFG9QmpFPz%HEfN0Q-O<@GupZ>1irnyoNREhg+XL*|eLfi4pe)%>lWWu}cbcnmc z=VWce9%yT1UpBwJKpY=bkKJ1UV>ed)SI{d?4(mg*RNIWjYkd;NTLLH=XluA=VWw!) zTM94lOP&AldP^?XA1&Yuh>~O?nzf3XjC|;QFhfjg76x$wH6QHEOznWogH^9)eJ>*K z6}t>kl)raW%jTW#$8f|i|_p5D3zzHyb`JNa>eJi}nwBmfMGeD(kvW5`FR120U08A2Rr&L6E!9y=75 zgD)&9`sN|QDWV-IzUVgmxWc0MUM>MGmsP92fdO8ST*pw?;GeA@A!D#Dp?I66ql zsWCWA{vNL?`#sb9q;U2|1@zgG$q)x8e4rx~oa+N~*(IDAKBI%)q1*sh?T9+*apmc= z^=6yzM4b`d&7sD%G^XmIz5DMM=5KzOOSF>^lQOCGe1V;&xX06r{Du0kg88gb2ipPL zhgK^O=b%`Dp<@psvqE#_kF6aPIT=2 z_W6q!Me7QQdsf6fM}>0in6lF`o+lAMcw%#gl;c3Z@abZJVEO(POX;he=S4N6dEftS zr5&ow^-!f^R|U8lGhvKht9GqZ_D|qB6hYhe4YkpMYb&@u&^h-Jhu1+G% zl(Y~FEJi+&p$5JcTqcfS(1u~XlW`v?SqrVJ3{nfw2`r?C;&fUa7tZYO?b*_6UjYT& zmzIeHBBG*0_id-uIt+b`g@sjzq@rw350VEZZoubYnQ5#t+w)0u z_*L-3n~xy>@5$FBigsP1{_NKNMkass!0R%>#N7e21mNkHQ!^>mZw3|^49a}O5*7oP zZlScP)Tz(_sPzrbP{mxUmWL8?cqYTmQzBE*1-}n|a91*h53q$JDPiU_WyaXRRO~D@75U-5O70_03L~cJ)7Kc0yMHfZyOqB!sTFk*%ihC?*d4{^)+Uy3yY=?lLz{<3gNkII(fbnh%wK=pgeE&BJ z0;*C+h_nvYS*NscXz4f%worHyc{|zz5gt-8G;#*nPso9a;-n>uqldDd+ zj65?aA_MVYD(d;%FcrHlDQrx9-coas1J{^$oM8E6JmwXkY&d*?{^vHp31gpp8cTJ> zd}>t&aeC%QD!K!HiRra-%g+& z9|<@MgSeaJ{;Y9yt1zlzBpggnO+j1=3NbS8b?M=p3cN^WDv^IX|(F+QEXjuJ5W9{$07kZrZs>$Ok{;J~V>nN~{$06c(v;I>`_RP9>f8NlI zG5npUb7%V!0iSz)@KU)_3S?|V^O=j zChr6-kvuc6J=cZ?VHWkk0o-eksEq{$vtiY`pN}Zw-EMd1LH3UZ)}6Z>?gKdE#~9v_ zPxXh+zQwKDHL|Jsj(-OBwS^tbwJfc#g)<5CFDJS*q$5GC?v_nSp8e+OC*K za-ccc&s7G)2z`@RLg61x9}T{#t*sT_$Z7!4HcO9DV~?N8OWGX5 z9J4vVSEuuBU&im^!K#3ZPTii%C3N{53J!hJc;l4h|C0qGgGuTMW*Q)zUx`lpo4@#jvzM9NN+X-{rPR(w1 zT#L{4MIO|jOPB!y)KU4-ZvApA5tr6tQ!}{~I13HS{bV+bG63^^F>WowYq~fHSIY;G zNXylBn@Aj9wQf%cHHO0gOEMyfb@2PXuYi+sYD931NQ)Ohdqnjz?TUbzoB<~06;X_D z4}`Hs66Rm@NBi^7FGq!`Ceb75LJ3eklMEmSdEnjk&&uChdMa1RRw1fL(wEHe|=4Z*C7$r==CqCe$C|b zBvvYh@N(ZwNHABmpOQSZmPxb68Z$B_n_zh5#Gut$gf?F z;jCXJ7;qkNC#g`#yYc3WjD>{D>^R9&S9P0hAdkC=ltG^#uB!fQCVc&;gCj<{6^0+E z-3w9H;jWg$ND$Q7&UDu#4Sa2AsEeTnqUoBnWwL#SWLSGe@C%>xAsYDm$-Rw$;9vmC zpaO>NP{ONt+GP3JzaJM_oDSWi!4^KZ;sk)+`=8yIh9DOB)(yLtNy$ zW3l>-cJA|pfg z_rAF(mXg@!Jm>8|Sz2n!rN)lLP2(=VYoU7?>*A_nNM+?pVc~VLX&CT=$Of4c>qt?6 zwi~XrYdpdHu}cMkqCDn^f^)EN^Ic|4F+@@NUNarJf|Q%b8Sb6oHSl3Yo!L9Igo9r! zQuUU;raTYnO9Q))D?42P`&UNb$w9jfDukK~wt1Uu0?rIdM!wNH>A`br!#V zg(c%4p+cQ1Oc8^a@L|B+Nk7=w}IUQh#m~$Og37+7nnjG#U9e?zW|kAa9|WSf*iXjS4+)iW`P z;9Njqi@5l++HS?GY@QW?RhCiikFY=fD{2v_*45Npm9|R+-~A;Jx$#wQ4S8R4E8_ho znI*-{XW0>Z*;bd!YJSK*vRV~dsb(k5B_?{=ff%zLU&?sL|5Wsj;=A&O_wd~8nDDJG z;JSN}LUiBOWj|Gac+es8p~qzlW8KS@M-q6ZKsF#iD*uxW7~f9CXOn@Xwn6zV$wT}$ za2NK)a_;>X>|9-GXa5lH5xJU}Dcm;g9s3~gFBhB%(r&wBSUsVv?&!aW6KM^9jlKLD z6BDXG)Q>(+J)aaIk2G87UiR%~uH0$z*?IHQM65AWkk=nC^6cyJ2DBRp0insIANW5$ z*4-h6q||`z@_@*KPwHa^)7*CG{pHtX1Y-X#8xN7=xdM)A@;zIuNlcg+b^s?apr%8SPe;l&bxMuT5VjNHXOJuZTSQ7gj&hvHx|1Qg%REY@6RA-vK_;%hAoJOo3^wtJN{oonAX( zWJk^X>?r-EyKM2p;gm9PezhM79#;521@n1QF3OtTtdU1xRD9J6%g-CXFoE-bp^e63$QO18Z^I~AbFr8!Hrj^! zYDQyXVx)$LhAQyJ^NNdc*X2qDXI7LKw46<_n^Ly0-eX`aOv{wf#!hvn(8bV7(3AU2 z@tP34$N+t+$Cx7`@zG`w)+`2fs&UG$F_Psrz(DAA{>Z=fM@yH{cO?^T=W@_shs^ru5kY1IH!br z+B51H?HKmZY&I;G@`Z+%2T<2v3?CE7;#^MsDdL)*0m_)BF@#u10PTINXpxf}!Wfy$ z?$o6%=4AYOz&6Y1^j*wbjL&%Br1pOsT1BrOHpU{Boc__q8twi7so@76#Pnu4n0z=3 z@?A6Ki!B1|^5TD0#w)IkoBCnockg6Na^AoX$bi5$apAL?PF(aw3p08qTHxy+Tj6g2 zea9{7y4DjqycrC5xApz~Tf-T*t}@^FjmLTCA^e&5Cjt|EJ`u#ic0bbepvLqab?^5; zL&p%WWcDl-j$QkxVwgxovc;efrg`?A@k-7Vqr}iWA9h(I#(Ahd-T*~b6E>+oD1q@` z;vS%)y;|86wCPatN_Tz^>8XOb@55Q;9SVp=Ka+V8!>ImYB`X8@&-rG!@nzp}2_N~l zzB7#|r>HUEc$1Tzl)y!|*Rg zE$aob33#3Tr$Q9?06oGqhcFXY>GIPbp|qm_d4Z+=C4H&z{>2kGx@t1jQ!tjHfl z>fo>e!4WIORFp!{_}U3tJb7UzQ~$-+K3CB;AMGx)(sj~b`!&Z3!QL@~iC{|qQPb91 zL-FKYVf2%Z-&v&t6P(RQ%k!UuT*V9%+QG+ zbZ`pAqz5iK{tbD)4VS%b$v!-)K;TJzE)8kdW-*HUJ(Dm#}_J8k75r(TUusM5*^e7-Y?zdxG#TrETviT zSONzIN36>XMvu~MXa8vi^5K<9C}ko$I&hWD7$Z9Z=VDnIarg8uk!*LOD0@V8)bEHX zHpldrDzbeHxW0cJIqGS?XVDQ89UmRcSz7Z;lX;n;dVIEQQTBlj|42 zaz=$-rOIU{35iKDBB&<_4)tfmSl~Uf_dDIBVd0YV%^!VZ@k?lR?N4f~+Jn-%39ME{ zf!_`p8TB&cnaN7>f{tT)`=^QZ!%+%eiaP&e?FS%vWW9vzAh~AIP787sM z_fRONrMTTjMk@&=gqeSw50i|LnSZ17SM^pl?qwgmI4d!Yil+2#jMfu#7Qu7coid>Y z=#xW&VBuj80fWZC(5uh_vrAtD!``q>aaI|M1(odOq7Zd*lPZq#FR{=raLzqRII0$) z%$689ktx{G|K*YO+iy_+gkWSRJ*rSlko2Wf4cnw#Qdy#H7!Mwgjv0oWHmkNm6*04K zTWz(6gyZi0z(gg@R;smgVkI-d&WQ|?#Mm_m0holcolyJ9y&(wcd*UbB-W2=hYRda{ zzBwBGfjolh_|}$%1`nRzOOZW2?1&FMG?9z!3+tR;3m(`veR`%yd2v`N#M)BY%Xe#MFkiVBi2vC(I zEM{Nzz9Aa7volzS-LOf^X_ebK_B=ZM8<7Cd+d+d;9z9?pjEWrLJT;d_G^viy^FHyIY>c z)^KK%U*j)+K+Me?_aPEHQb609pGZ0NQnq&t4qSd^Bx{U5D$o?TJZF-BJ+a9HWMuEPZd@NHR>J~Ra zudcQ}kW=Q@tMhK-&t00_9zuX|z1moyD3waoLZVuh*HDzkF7C`u$-(I0?nS&zqQiIP ziCzK*SuA6W3($hdFYWKLHfV|CV!=fIC3I`r^}+{B^z~NE{F2a{=~vl~FN-?s+k;ER z>E8TkZG?A5ar07E(*E_?jm|f?=5s<6==oCa$=FS>l4IPC!BH%L4<|c}L*&M@@1$4= z*SS7K_dyVb7$Zn3s)OJQ{+aXrcsg)G54yCMj0{@g9|a?2U8Quwc(Ts`8)CJR3u5^L0d^)0}@Cr8T7Jv))*@De8GJz z?X9Gscq1==ljLe`oXOxuNxg(4GZiXcikY&XXSVzrZznZK28?HzX5&!mnoqCWhu zZ9OG%wdDGIk>23%egiqhfAUnYIhyGN`Kw2k8@cxrK49De<5MRE%mRJ5msZ-JZIQ<% zZ>8AB?Cvu^4>&8~$9gfhENO2@$+Ylxr&vRV(n)qdz;88LcO$_92?d%MBNts>9duTs zzWjKbR`jU~+o>a8XyD!oI@09xt$qj2hJgqp(@yEU2`TpEBZM__;Nj+62 z`g|tNsvO4p;8*bvgJuXG{D#k-jckq!#Y4*X>TD3}wVAu`QR5tG}n z*}fn`FUM;JFy|sO2KJ!@#<}@yJsbpncg1Fg1}tXD3(68ENPJSnA1WoAVe+ei;Lozb zxoey3Et1c|BBfw1!66Liy9*@oC8VxTEZl!kKBXEs_LCVzOb~BgrsO>uzOSCyvu}D& zZ%3nRDIKLasQW$ZBh$;TxJhYQ@$HO)dM0zt4JdQf1Mb_oH}9)cQWz<&Pex3xd&*7i zxp`x5bjr~YrRaWw*{V;02#zacoF*J{;SBP3k$bc@f#Imgg+;eb%yUH8iR$#a7<wR_B*vu{e!pKZ9l&lFE6bgc!@N)5bRb}W#u#>0%e_sWoSeBP{DR)N^Qgu@41;&;aF51+EK5i@OX=iO z6&}Ez&%3k#!EQbn{l~(Z3O`>Dp3IjIquCUDn3Rx3)u!;gje4M5_4-t`7M1@SZAs!` zGR2Uxn4cBUvwI*y_mxq3?gU@?qWI{rJ=-{NVU7W6vB8+$z~V`m2_4AU<>U%^I_&-T zec9j08YPRf_3cAFj2j|`NG=zG-I{`}2eRVPb&s8;JsNaIh=IfBUk_Uow#TunXu3(*W6w8GQ!3`AFV-8(&y>;JPeS+8 z7R=%(_--fuv~ozf%?IrcaU;gw`|aLyp!N6v;Nz`4_?~COOz-jXrD~JzBb!C+tnQ>E z)z3=f5uB#V*Da_=q^HcJD*fseRg5GwE_W=~&;LKl-ZCoAXKVAu-QC^Y9U7P5f#4oA zxQ1YjySoI};M!%zCB1cCG5ZyXxLmwSU*%8&SC%LA3`( zv;JOS&1Jte{RX`OepuC`7Kjn)_j;@kIeQm@SAl0s4^jvzYd&INm(*{oj@xwL=`%CY z!`lpQnJl9#Mx_gTI={{TfGKA-X4e8&uH3NHK_hDU=8PW5Bf2J=IwKPH@XB z#b*nG_rs4` zp4wYNyxLFDd{tooQLX7m1pcK>=p8sy?bLDx0G$hKjtg(5=B3~}*!dFX!8J1OTkCvERa=a)C4(*%bEB52a_2P`2< zj{K02kk5D;P6y-r!1td7Cj`B_^*ACg)z3YE^hWuyL z|2F9V_Wi{k+KiBbs3ItkV~Ab$>Da;bOzsgv|A_SI1*=8Z8`*oK{0wt9bl{-sytM32 z0=XX?kal_)!t#ck8}R8RP+ek~-${_)ZW%zuM`oZVj>8hICr*0>9jsoI+W;$sYhjyq zbcelP0o{5=&+awi#J!A|9i6=O4SzcQUgD@P-YARVV#zqy69A8g66c!)?|m%)^2Zw|qEax;#BSq}_&EXltKiWDe}9mWnoWQE(Zz zf@Dr8?qmIk-w$e(C|A5g&p9Nq~_%>g~s|eYikw=1evD%*vaBj<<1Clyon?yj9z(+N2 zg(+|#<#3$^5YmRzFk1_;y$5pVJ*uQE{%*jZd6hwI?guie5outHhB zibeN$KSWNqqe*^c+-t-TyXf0D5J?IDnb2OicO`3hzDRKT7$6=B?-#Tuli0-74pTrA zdNqrrz_3%!2Gxl=9w;N6GAd1w&ug*=CP}#sl-L1nnpU3O{>Xoy#qq5dJdc1tt1Jyn z-140a)=z9O&;;EXXQ7jvxwS`!a1*Z(A)1ahy*EzuvLd#dPL=l>+X*mUIb7_a`x;Oi zK7X$bzMNwx1IBJCJ$Lwrp20*d8(&&0eY#>^FgxbY$a8l#JZYKFK~bi^B3)iJev*WW zvnAFO)AhpYv;CH%lYtS-7csHdKkK2nzib5c{&=k7LmpkMxdx;E^&^$-g~xu*vsBhY zNUqs>9lKXsnowmhBJKogTp_CVMCWn}o4A2qrOtsTzhe{zkO{{L``>(5_v~ z+=0t7vJy^o4$UWk)mPKlR?hn7S4;z_T^0bc6M^LUDojG&W%}Kb=sip4MCF|?@nxpy z!L3h)G>%4;jQo%BAgtS-LHX9Cz|6y&I4*5VkZkwDg^sv~=*7vqFZkrc*WR}{Fqux) z06Tb=;H>)xg@QmJi}mP)7&498Adnf*g*e|S?)?|D-1cwL z^LS;9${S2Uhq-^ldYbEDAn8Tl(xX!#M>TLYB+NBX5aOD>D15HIp8<$|pN*@3&Bjo8 z=g&cf)1NdB}pQd%biwu-=B|@^z!z#pG>!~TCdmVjO8@2Kan|zO@jPTz?o8O3e z4$4bs&zryYlW*_WNm}Yu+tI6X6q4sl)zj`HN}f@YIY^N+#yPMd4AlHu^{$EWM>x&f z#z8Wlzg9+=pP72UDNefQ6YGe6w=yYswb=H2IAhQ=$>@f(!Pj>@d(s8r1r?VnB&Dem z7$e2#!D!A|aVLC*?`}9JuWY95`8iEqMNacqh(xf2ex!(=@sHm%X;Lym75t5fw{;yZ z1@l#saY!S4**(H~1KLbE8m}b%BO!Y`krOdB&cy^b`-bE><>SC!<200n$}MHw+xh(8 ze7iXeArEL;)Af(Ky0xQ?hyGeFWTNO?NmMIxHD3vrJ(3|Raf_0pJqD!k>W~KET%cjpjfL5JU$=(AVDM~B=paOQAwYysJAs{5cO=c@VZ=v z*et#>c(Z0LKYXIaKk>YzTfkGK?t3w5}PI8ZF=R_>v|%h!YRXKX4rb7WHl?N zx*Az~pc!Gio@NgCKIiiYnJ?Y4w=lwCEHAuvs9y}{<3YZ$SJ!U-KE- ziZ0swm*n1F`X=uN!U!|`I{K8g)MvVXyRau`anKlvunT8jpe&3q%o*e6^bZ}Q#QG^U z<3-lV$%lz|&8W5KinNva3>2}N-IBW2tf-*Fo6imGR3FXc=ZAWrM4fJ38PF1MwR#M8Ea}Fzf3uQ-AQ=4 zjGLva3L}8j?d?X3{c{Gd3LKVTNRic;kqr$`tSVXVJ%v=bU$Hv$aD1a>(Rsu#?woMgzS&_AXt89$}EbXw@TyBI83XKQP8uo zbMeNqE$k8%coV5WLWpbx!=;TEoqE(cd`~)uFb6K>KXj$%nHosU*e-#~$xhPu>3cs} z>v|%g-^MeC77L8v2Xtl)$~h~dVs;| z4A1V3{^1Y7+HhJTlJY5U=@>VLu<>(pBO0P}W;)R=6PqMACrzmb8nzqLC~u^9)F}|- znUnShhXERoLM<_TGxbAt@i&e8Y**nC&Vd&86a3@vDlI*ViXz}(b+*~Fth-=#wQBd( zq8Y~gBhFSw<#J8I8jz#)c(Bb3CpoiSi{YEkMAe;=`b0Va;xZO~>80OK}ja4;x32m0iC!wc%&nIw^9|gPL zFuf4G?AlP4=L`u2J{%Buz>LJGgl))NZ9neG+z3Y>Ts~pqN9=c3MufIW&|yi%K4A;foz+%M zEDIbC<$YNZHbtNw1B3SF4#uQl-dBLnv%O93TJu}2ntw=(o13BX0fi!Hk>syb384pPU?w4tldJ+aY=0Q`7*1*!ZNOg{f z&secA?da_I-9KhdNrmIXCY{X9T?xjlf%6U5OLg~vgiV{2pq*RFqU&o(b8G^nWA&*7 zFQ7$xS0@_QTX3Bn;d`w$N)kT>WU`P0(?d9AV`LhWae4f-UVJ}B8D&kUIjBoeFl^sF zorln2rZM-}mRz8#1Juq#%EjED6o1LL@Gy}1&D zrF+1JZz&aBzj!*oyu6@(FnG+m9@T0wxReKVF-fmtZwYJImh&dD4+|_0QFcT|@&sEw ze?6x3GJn>S9Pgd+-L|ox3iXE&Ep5EKOck4*Pl#%D)<2ODxZH;}&!cnp2n||df1}e! zSUW?K#gHS=vq`GWqt^iO&Y2|%3F?uVePv-CODK48Fny%;!jZrZ#A{A{6^(fMCPG;i zij?|#>pt!H?lPX1fK^(|MKutJH5DcXu^sA1vtn^a3(am?ml8B%QSw0-y)i99`WGP%I#1CUHKUypX3l@b)XXs`VjoQdyyC?hR0+;ckW-@)q2s>h|SkRcp?KfHf#RRFA^$xf=S zr}Z^)&3dMFWS!D_q^ciJ(R@xDkM!m1Dkaw~wu=WJ_aY+++38nl)Nas#`bkekF4)}Y zNSXRnW2YO+eTU*}zo^eE|EyxB1DaOlag!0{pmN=Q>RFA!D_BBdl1)=WcFagQo41a}7_85q?-U3-s)(!wt;8HFibCBKng;e8F1w6Ni z*kdT311ZRl{W>7wBcdp|{AHa=<~4CFk_)3O*ug=@kd>u2B5xS`x_Lc|Bh0c1k0~Rm z(60=o&wW)xAYG~%-`4&k6(2bp{w4rymN|`vt^l~Yu=vS0W=CI2NPVl+t{+vyl zO~yAA*aGub?O$>brFvfW)$`$^9m0NjCHlc*b0j!IT_EeahE_>7N7qV!JC&4pYnrS> z4+*@5-M>4OqAOd*CKNSkVdBvi36Y5(NUZMAOeTo)2ZNS!+1P5A#Mz(B4B6nE!(WUlFVZ-@Y!F}?F zH1Uqxa(YS7iv#?)b3FKlE}oDrT6Q+NB=W3CD9@ScsJ1P@gl3;TTDAuc3s7`RdG3G zlX0%2tRI~cP6HE7=nV8qt-3VJ@yx|kqh2PITQW?NT{riXXp&PCOdme}`NXANpJc>Sod{Io#WyzNB@1;y9 z@aJ~JQk_>uCVAOMCBwJG$1S?RByMWGa9UO5VwJfd0~)hD7{@#nQh3OtS`E$An?e77 zL7?KGPiiy>n8Pj15hj#aq^EZdNW+cf3^-xGnaC5fHx6~E$M#YRnL2$Gao!m1`{u`; zgI%LAH{jbH&*mF0F~;(J{IS-Pk1{cz^0=NkXoAAN^LFO@U6<&> z!KjUfQwh@17h5dW0bwe#^bE$Ryk*VXeUE#K0j;eRy zp9vK+)^cd1a;TTBkr9_UPTAMAz1{JfdmefjVL&0^(KV?@fwA*RcGQqhbenFzg0@)5 zpYsdXGfMD4z#~I#y+?*-2MQrkGDa7kDs+6nr9H>xGaSi@bdWK z%jn2CudCzF5Z=GF)tPd;sL?bm(ZTWwS99;)@D2H3sVM;29kOHw++!-?=$52^-OujP zMwQI^i$3bs;n;r8nAcrXz#L%>>va49d3WNk}6w8aIRQ0flZb=|OU+S$<1{ZWEn_ zepd?ZZ%OT&*gD-`LzLnC76<-TvqkX)V{@Ur2dovis~Hg>``B3-hsHbAf9;ffXj}Ma zJIqk%jaMDmvT;Rkgwo>Z(6@SYHYTRC@S^V1R%!DAW~ATIcO*ju4K>YwS$l6q!SQ|G zoKS!HHgncciMtO7`^SEorK*!sHZtWSeWKWJvYMvo+Xo!L@+f{yN#aZeqfk7o;m*Y7 z=R<5Qyb&7+M9r@{b%%f@{{_{YrQW7@bnTdJS9{9`lA@ouaOAI?6Ci^Dhd)fuRJvcd zYakVOkXi&`U`L%LoMfmG2ja7eQ)MgJ(<>*$&DE^)L68P&?h9ch?c1!@dFh=z%*?vE zK7sbBt95lzsM`R>Yk<11#PiNCl2Te(miMTRSoz}jOpkg4EI3htOKJc#)*#`>0is+j zmaC@>bkY;&m|17&vPGk6E4Sc$#0a=R%ceMJk73Zr-`ghaS%@ln>#!}#dgCz;djx_h z3XLQcp5^oC7A-xn`NXv0UQqw5)5b*=L3DF;GnvApF4IzJK*mec<@K>}8s+d)f*0i6 z4adt)Qm;E!772Nx38A9=4T%vVoWg$8uucfyC&w2)f+_xWkIM6a_JX02m&OD=YI8XJ znsvMC80Hat7q!)NqVcv=cVjhgwfYk-cK^r9o4YS!$=`0=4cV*3SZ98*tmPjs)G1+g zjOnpo5EJea95PN6qY}RSW4yldM>ZYxyortCq|Jf-Sd{7oe74NawCwt2`dXA}Eh zO9;22(~m|r_f6672MD@mOdF|Jr%T;>tw3fbSk|6LmOAQOHShzS@wkPhFUc4+WSQnM zW1t1y7)nd?5k$kBL&hW(a|B?#{08Ht($59y(eV%gF1Vx|MX9Db$beiWo1RpXl-bV4wfjLI2;;CoADj zN|~*OVUYT_u0|*)jGiH1d)%JInnWTnlR(iG;I<3F4bM>R^d}y&BoEX8A6)<;rRJmi zPPyGKRj~R3!fc)|sn@=a9}muEjBCr=L+}Y;35XGRE?B#ClNw&!Ggw7Rq4K>=`Ptuf z*Ld|wn@~cIYV_vscVjj%_I~+t6DOeeHh>MQerS}mW#I|k_CXbD`1I%3GH3%4s>{*y z_(&R~dNUA0VhAbgmmW_?m-oD!xR_w#@o2x}h zP3@P2jJt`$Ur?CdnNLCVDurs{XrP4nvV|3oFxr9Quju(z}$)450zyeMNEC-O2NG2{Lf-T9l8 zHhl|JIRR|HgSbKNnMH;B+*DZ8oXZOi*WkFty5@yvk-N^gx{I+rspFCUd4-J*`#pd` zX=ySOAlA_o9|p?>#_X%qPN*F%2c&Q4S2i+*QNs&TGgJhR@jzi9Zip{GR#T$)ODHyb z|IW~GRzUAnjJbe&KF$WcUV={s9BR~z6fGNA^E2jnMzIm4hbd)3u^;h1fPcr|CA1lw z4sv%uQG{ED!aXOTgLhO(>~V{SNa5BGxjNfz{n<`e%7^jYf#KX3{LCk5ex&LSuQ5%T$d0xUVCFnSl6 zWS?D34GG~Q--e$vlJsf>ACli^%Futqh z;)mGtVbgbwX#p(>C2PhU_V!bu4?mKx9#zsNz8C@2<@sUYEHU7}p-+q~Xx*W&j#jA}y4A6Lxu{4joZyLmG}UrQG8uf)wp zQW6B_*us-2Jzo%?RSa`Euy~v@5DN^^T)+<;n5e`~f(#DbH`}LkT8GATh-XQo1o|j0 zHRh;?A>*=8y_Jf#46G|8M7|8hIosF2ILLP_r+N6~*>H-&TdO1Wjw=qhMXk`%QH~Pg z)KSohUH~kpAOfiXY?HYB8sezUxX2g(lGkRZwQ%haq;ITf=^+Cl4)u7!Ulu|fPp-3L zy(BNPCDLUb=!PJOIQ2tggv+r$-(Hc;3TSP|TV~L@h~v6xLwaHX?vi_<@R~oLx10k# z>Y;|k{G%AUm*5k~dHt-~%+gE!aYdKpVKJ=3a3;_&pSC}mW%~j!_!cl9L>^5KWVQu4;*wO184(HBL!i335$-65G=BZ%= z#gkHO<>TX_bJdt=s+NqrnKF4qiqcdKik#dXyr&N8Nc^s=m{e{$kMX~It?t&dYm~)Z z$qGk8ZMnyzL60$}#Kyby@#jO0dlZViQL^U}bxX17h-9B2NwcmRmh0mfG17flX5-M3 zIQ7+lQxXrDBd1cuF)sya8$NOp{!#VsDCzYM_atU%fd%VbIG#?kS+46W@R#eu4I_Wf z@l_lXOXV~JL>85p{G3*$I%n)V-w@Zg|JEN~_xDy&>8kxL!SR)I>v4U0mLu~*%i0D1 z6tlyyo_)sO>ktF!Ty2v_Q@v7l zFn#=I<3LNByd?ID#NK@5=-5ztc1)e$t`q}c&;0bZ?k?ra7}B-Gm+#BUT?|y)Ha9YX zR2awt-2j`xs0*_f=hX?G6s~-~^*uqaM%?`+_>cP=tjP7YgU*Se#x-fa%mLBOt?9W8 zl2cd(w7Kx}Uev$#am}zjX+r&H>pM|qBhhlQ`?627^2Y)eFcxz(cR&2LFQ>AUKb`4t)qtVF#iNomE2XaN&3l-5ONao_zfR!k9C zwTFAT)qeC=v>#}Mzq9ANeMjFWdQU~0Y75i^p(tmh^JESw(hYneKCf~gq7Q!CkF@;L{?>XSmu%NCXN0JA#T4-4Cv*3d ztx!5&!SQs7G%gsVNZJDW9@K0W$g)ZqgJK)_4@2EwE9L^A?j^ofdqoO$*^(_m8fqZ$ z)u!IzcY~Grh?=H6pxVEZtg?1!W~|TLScG+6X=oS1j4uc#-}ad%r(TQM)DFcC5LatZ z!ArPjeV655MI1G7i@2$761k*ob>+G?-R>a05PG$RsmeD){XIb)ipupy?Mv2kM57x5 zOrjN>S9m)wdT|B%kBvJ`%G7Vu;4e|pNBc>@4IjtHIE5!VR!0j?*2Dpc@UeHHQHpF@ zUP>(#tCJY)4givq{xC#gl>~0XPJHph$%ng0v|Q1%7d<)_=w|TeRXWgEvK5|EF>twv z{%rQ`1#|T%3U-_hLY4}&mwe;#R-pNQ=sq-q+}>aS?v-Jk}^SYalh)leC2o0@omMgS&d7Ypn}^WO6EEXe17)MCx4zPfV5D z^89B3qvzv;=5uWTSILy#{2N9af0J2&NA#P+6}ek5hse*K%Ql4Z5c6>W#ya|1QzmzT zhM0gNUnmC2cnPhrZn?GxX8Y_?LBrQ#>P*V2x%~A+1YR6BVr&H-g%k&?59dBhHW5?76{&F5@v39prD%w=cFEj=p4pS*HQL>2#n|A;5 zL$8!!I3`SoRwBaY()W1Lk5sICT~SojxY+nXE37>oWs2b3)v8@(>+h!cKW$`>(4NQH z{202#WucYHa@n)|68Fdjiiv#z1Z!}$cq&e}*D*r<6e!;HWMsr!GM8M;nbuvp-h6LW z@mXNLL9J6x7Y_Oh-f)4W_J%S7Ymf<^Ql<%ef);)uIftndZ{@P`iU^FueYMSjgpZRrwHQ2bFH?Wga7hHnev1{PPErJ~zWLUoZN zBkz8Pe#MLm+@miiAanvBSndzA(;b!dA7+acWjcgivSNvwCFUw$C79#Af#<2W!h$xwHk zMnC$r^p|>7u*V{_OnL$T`B5HCh_0@=q->B{wzv5vk~uX?;hQQ}QfRTG6H#5y;BurF9 zdk#EMLP9g!md0y6>Cr{5Tx?xA)t*MLxSMP0ua|QW+YEqkTfGqTdPb_1P;-CtK!t+& zKMBp~N^z+pYFBva1fEMF!l&S6DL&+Q808qAVzadYeGdm1&pP6akQZsAH6A;csmQCz zT4NV_*%GeXCJFW~EWT@cO&oF=EH{q31}RNW)AI{8*rk_vH}(qkKe2Mu^t(|IG&_v zH=vylk?SW5>ZfR}5zhs=Cg2Yr3Ewz zCh}~u?TH$=@C|V#A*L#ORrfrRq4dTE2(7!UuC?rqmP4yQV zRu$`Ub$O`R+ z$BpEHmjAQjSGt_VpUN~(b0PZ`o2{;g_0>AuQpa%p-`<@F<8??z{AUkxMRL=Q%Nw#| zFGxfZuk}&B`D@fbI7!6&2!uUJ;$H_U1-`=CRb5-@E{|v`UQD1E}jKIp# zU1SjlVUZ}k_-dO2aXrVB^t&*pBu&XJYbJF@vT`*PT|mbD1%3oeO(VVaiIl>|ZrypD z8CSu}VHm?y3XzQ=qLOKNVZ>?cP(P%`@_FIic3EA$&Yc@tUH>?bu^laAg)HFC=5L2g z8f+qS{Bg0hCW2>UC85v8m&Q9WYXQdqa|DxvrzJ}>uSuimnsjsyJN6m6%IW9A9KT@G4$gXK*z$c9iBdQn zq++51_=`O>RF635^)uK_CcWR24@;~Hc4J%_(xeAxrRyIZAN@~+ zePZHDP~QWU12W`(qFKZ0-NfwE?AZIr<1pw}jK@ph?*KcclqX*QTqsHUv&Z<*H({t` zek^6Y=4jp*hh@;IS7cj@BDPlEL^%F}hZw$57WswzO!kNF%b^jnH@e+YK!vgKs2CHj zW$xb}AhsjD0((9LG5IG))AO5j0p*&SDoMwNF-hnZr5df8h3FA~Uoj zp-4E8m?%9uCqLziAa9iauK8GGiVFClT9;aYsvi;dlwpw*eNF`bs7yOF1k(tkk6XU@Y@c8Nt)A!t16yP>F+T{F zVRO^YwT%=Ht~>>_-NHTS6FILQvCYEIuIpBn$xkQCTKTyPTXp|4sap_gv+y z@7SJ-ZRYOkAALi?d?CGp!Bq(o<}n2-^t1gr+uW}vxUnMXH@RR>hKnU*jf=@SqR`u^kn@S5=)@}mOl0lY=W~i+SdA7c25j$~ zJibc+yUY@3Y*1r!E}74AUR+~^OnXY^2Geb*qz?hg;;u8uS($z+g@fuPXE~6N2p?e4 z82xZSV3p2Lv2?_!F~#pCmQUC3vZz6@NQ2gyCB|x!UxSr=zKhiMiun_QH)4kj(y#@C zc0ARD1Mo2^l|Aa#k#=sdEM2w@B?T{pXLn*tEy)}c0KpJYV1`4hv^6p}wb0E`Bk24U z8oQ3p6K?}O+Bz~KI3B?-OJ{;do;IT*(VNvKp=Q90-KNZjZjnQOKe@k4*)jZ)?ANI8sBPaAM z`VwrseN4;uV`NUnG^2}5gdzv$U8u{2?iMW6X_ImO{+u~m3NS`q%s+>Mh~YLB137|< z7qc+X7?3pStqWj8HBe~C`M~Q9{min|1&8g7YzY`6<_N66E#beRg-D_)8`Ihx$X#&vfa$Rb7SS7Iq8%-7uxF{S!suvd? zr1#8%y~DLR8(Y9i>kFWi@>at7)Y6R_bj=@SR74}q1;v;o+F)= z?Os@F<*VT&!snx6_z9QRLncJ5-*wb#H($11JLPtHX z=mm|qa?np1V zH%o4eFa}hClXww8$cmv5v!(_`( zJ&;C|VSJA7cD=xD8RaVBx6!~aFWLSwc)YTX>lK0&vc)LIDy}vJh><}i+w9qwE@zfC z+vX!Hcrx>qShm9%z_-eN#hSl&cMa|rJnKPP@sCTkzju{Im?A4~w$|c*SRtZEpQg?V znm*XuH)Ycn3+ zJzEp-!G?gj6kj%9C4>BT_ctuK3DdV5C8}ezc=t7_D}32DF%Wb?!cWf_UGRU?b@+2Z z@BZVe1QV_4l$nj?O+M^XgPGA5=`;m;iDtI$VqSJ^1RUWq0V;@iXSQK3{+lMhXDGz-dhNf+Uwn`iaunZS#x$fF-l`EWgCnF1a^(O4#qv};us zvR3y5H4WDpOXd{5$9>z!@~1%i!&5PrFrDNTetD2Sn@I1PZvjc$#w;>@(kLz1$6+J- zi)W@A3;b44|5bIlg#DG}tg^5R=c-$%vu=o$oKEz7VEg722`LtKaFRR??JoTj)NUE3 z1&m2r$Orlaa#kK=P){t)b@~i+nLlDPZ$$qX)-5fTHU}S^38RoI2J7ZlJ^nWZ{E?s# zS4UX%oUm-Oa^}4b-U!&RU8t8BGz1U*W#zT(*GaaJ9v`wRM*$4pmHc};W8N<`#Jy5! zpy=;Y7_m_FmGYOu$Ld}`;&_w{Szx^3M}=)OHJTrJL^hYPf2({5tH`4LofiIrG$=B|NarQtg^ zXAq1ikS$e`DzR8D6n+|OBHQK@nW*@f4!vE3gseuk(D(7NEm5BYw(t(~8+>s2Vo=qy zD5qoUG!CRN(VobNe_42F@YM#Q=|2*UB>=9}c=eJ74p8{0gP{ zJ(mhQJ4SSJrYe(B{0{b&3uwi`^)8S0G zA}Vw!_+0{M9>ekDZM`r=pv(2%(B*y#ECS+5F-N$4;Ipmq*Cn^qD?5E{plI$l3{TJ7>5~~P!Au4FmM_qticAVuWKhmdfPI8bO5SG^=<|y|fu}=J2frKo1I(#r(fI zksy}F{IWTBj_MPNH%@aT=Qrg5V1Cx!f=kILXzo~>wYW9sOsIX56rTq}dL>?m1w)&a zVu1>`8n4tA?#K)Y?UQ6@m2<<%k~2YgF6=-1XJA-Pkg+~%lgyAdGF~-p0KmvyMpZ{^MWP?B!3L~tCjZ0ObOp%FFS3TeDtPPoP4a6$ zPs;hJ*^dZ0^7@d_0u>O-B7x<0f7UC1kRoz9UvZOs-??Zbdka>MoA;3s|5Ih&$uqu z(h<9}O8X$HO2av?L>X>4joJk=kl%qqZ$~fW?0{@c(2j*5k-Sr~<97jMg_lH{Boae4 z2MXk%wLST124=U=y#C5=QKLVd(~hB#a6dila)Wi#Eo8({vhPKv(C>A8<*l^%tw#2B z4J{=79qq=R02{C+2+$9I*@i;wvjC`G#~zCZqac%z6Fl|^aI1Wn;6|`%^*Yk^_yz1} z)#A?A=7N{3@jyrC))Nl~)-?ihF2qveeP`)i2p0)tTsb4(_Cd;FG-h)lo&1hH8?IuW zrAUQPw8qk-V3LY`(TAV4Iu!jLj1GSB_=XV-f9-Du4(y?+tC)XJ&#MVH<@wUpY{uI| zQmpUK``Vo^VeTcp!bRPO0YopV^4O{}(bd96pQ1T=)O_N1EPMJR&<}~5xSVZ_GL3*0 z8cg3Ko-Jw`@@Q2n%1x*UU&-@p{$&60*xnh`NTsdAF`cAGYU=q}3uCs$MX}T|q5={< zb!xzYYbDW(<_DX^nayT%RZ)yR6NaL9fJ}c6zQ~We0tu&q=&iELd$?mCAKLjvKejqhcv<@AbX&&MY#!J7Dm zIG&u77+W%^q*ln&KQR~;N4#RZ`ZY`75I;P#cyDzx7PRA=z3E0+qhZ(u2!U#kiOv$k zttzZF*<=v*Q<_{uR{RtCgG?e|dy|k(_25pCQX%Dx1?HQDr0;?oZML@^h@Bv(2ySj& zsWq8Q>(MDGXl)0qfRz3e;6yI=+N!W!`1wu9@=<+uqU!Q|brJxe z82BJJxktWUCP2V+!%iSd=0(CSnq@?grB#$)+c2w9{bA)|05w5+=UHJOyxId0V;>mc zJ|-tvCDaLhI7Wrtgo<5e(FY&vq6s4g2S`={HsRyzIEEwUDN6F*O}`9m0ZFVrF^&OI z_CLF;3lr_nZ%q~X(P)1IA(*PPy&U+xzyE^7kJ69J5TML!|MWD_<3gn87U*yS@p|%R z25o+GJzL=j)B-lDSozc~JfdZ0UZ6s*RF87bi?)r2^A0jD6_QYQw^xA0FYX!eZz)4TJuhk{*Nu!df|ZsL!bp8Jg&o1>+Ew3uT=-M7J=y=$cfdU4~G z&lhm{m@~!*9PDm*z%*I>ADz8*SX_IK?fr zxO;IZ?ocRhL6e+(-?#VK``qW=bI-l=@A<5(WX`oR#&5iHyoGQ&(7scJhTY6(}_io*{b?iw)~~(O@hqUHxJ-Hd&$fgIRx5P1?>B8 zqRkaY?n&O0|KU-OFWaXBk(d|u(@AVMXx@c2A?A~ahmu6&!94<8uIPf;wv zWcr{}InJthROMOjDHJoZCBGA?O3s2%HU_}-I}6G8korf!8&f*iFKL1xU+OW~V@8*A zn?`$9XoF;nENrC#c0L3hK5!dqr6`~(fO>k#eyWXuLNpcE>I31eZ=SB@4-*TpzoU6Gb^-zi8B zZ3>*G@vXnUTyoR>l(97#LXSjfZZ64i1;`LX>Au4k6Avjqh%uEK{|fP>rN6w7Vq}1s zSFz_trFDU8D01G5z&PTOzpl_C&v?{pjSK|Y>zH-G+_37REQ$)3R@>6HzS6rNP2<; zS(}07Oy-^$*elkzUWO!jX`kLrv#+i2AU;-oo1l$NQ8Id?j(ZAqD-oeey868v972v} z){pm$_69Mr{mDdgEi+ii|e=6%O+0!Ub`?+^b0QVV|N9uiO zhTpwIkL$T~A)Hpfu7CKIwE-B0fQ`Oq<4h-kt0Rg@s6J|B!ProxFxbv{2+-@g*K}(v~^s5L-(HnJV%?eaNzaS-&Z_N^?`x6Is4x zMBpxiY1k8M$r`U+XcPtgRmyXOoF{S2*F^CJREWEI?>EstnDGT%5yf>2e(UDVzCUAC zdIOz{ZBl*%U41*#$PgDqy0}?w$_VfYvq-rJ$)k!i<%5n%LZb&>R)OWVpYEpySx-c7 z+LMg-Jzjq2!(i3e2>vw=;DYAOP(No;3w*n(BGd-6ZC2dCG-GG}CA&gLM^}DDf6emm zJ|X|_61e}_Qsn=`)c>Dqy?VV1$k1(W!7LpfkJM|ZF=|jOCFctZ`eSFL_lMBe<$k^39lYA2ANTIH1pmxd(G?k()TAG$^=T+^8^RW8>T zATu<)NrrR|o9R6dfg*ELy>Pn=kp@OPi=dl7&D_fWiMAxDS2{L)|0kHbr%9D$`f>l? z+B5a^!pj*B?hJ(oORkVN7_uW){B3j|ea!?}0L$GEKT+^%jY3ew+}UP%ozW2Kpq2lt z`b?O?wEo#D`)8YWUpvb2E}oNWeKH2MP~R1$Ft|SG)!41v-R-5=Se7nSpVmoU$NB!V zoKo_JlxHN4>xtouKCww0ILdNVl>}c1WJ_IH*G13-P=uJaao`9fv4^E z9?VqdHrn7Tk6>!~XZ@90&w=81FuY=1GADRnllx=0kXo13#m3`AJ%-WP7?k%T^V-Q#77KXWiGD2I=dY#T)&6c7w9l_58H^+}29R}yEc zTK?M~+^BB>j>PYXSK!LZmU?}a5=4LbN3IbW#)x+1CjUURy>P#rn{vM%LmBpC1F42u zAXz?mA`H{t(%3nRtZPnMzBu>^ZwrBm@S?|q)ycTgf2ma?B^&8d?0yS^s3k?RRokx8 zH5r4B3q5lMMjE`GHMK=yCS;c&fVaTd%(>>=`gZSea?ZFPqZ&fH3^zZKEa=?B2tAtH zw&UvWBS@FYy@m1N*EOuc1|1$JDpwX0Uo>|xXmy~7Sw=EWDRdlm-Q1^nWJ@4t(;_P9 zMh3b*HZ0D}V48QId}>TDm+b&cU07tdZ^~UPR`G@&i?zj}#E)b-=Eldfi;)lf;vf)G z#Kg^w!OacL&+S%g|6BTm6)S!8K@=W!x5wAnI)`ooY+nUJy6-~Xw%hdr$5-eRxV>8T z?dJvhn8&5JKd`VcJy9X7(!Bk0=@_*A`gscP1E!Cj|31Jn1N59JmdcBmn(wa!DnyD> z57$OW`CsKvA-eDOd0n05ue_{yFLPxrb;W5RdF+yx3&tSZ!EznFZw23AJLv`scIWoA$LDZ)7&Su}jmLg9N zlbm(k@5RWW@Mp%0g1QR1)+%g^O=-28Xd~jos-6*2^W_0Bt!abVgN}CZ7*aTWN>bC5 zsmdeha>zQV(iy0tEZ}Hz!$OV~b-4NMGJ4;0E_@ClIx;?n`1R|dHW-9O#tX~p4&G5& z0e{u=I+L?8cIk|1ZCsk!Oal}gdTt)=!lp#X(*k1*3rg6BwletNlBRz`weQ&(!wPjE ze&G%Gd(t#yXO+1sJQdO0X$iW0z>oVdJ+q;t@Ebpsrjr&`ZNtx>XccfjnU^6Oh#qv* zeuvwxsn9hkW>0V^In>d9O_BkQ^)BTHy`s|Uv8$ijX<%d8;eQEOqp9oge!x;;CW?>2 zRqBI3%C)m@dLiQHPVZXA_f;zCr4Sa(s2`FU)%&OteV1cb1M8mopO?DLmQ8Mzjm2%O z_h0XCyrGFWAq$UN8Ji5GfaTa32cQbJX_V}3cN?Q7OhK}Cc!91-kSZ{nOh;gjTw@<5 z!YFdD!h1!QY55)#tsHQK!!&Swewihn?hs@bEp@J@ruy@TceJv=%cSQ!OiLF5q#5<{HfvXWT z%xgN#c4XBhd6hnql@R#=R#CRudjY?0#^pubcN;a@Y|-!8^8gIq); ze!=oRx9xfC<Gt@ktH$~Jo+p!l>U109H^s1UL}IoK3<`FgEVs7Q{G`Ax zk512Z(euf_cf-5Jc!KIQ%7ZGmuB(o;p)V?pBZ*4jl;evU{UYwy0{4CKdCMVJqRkp#0OEj~n+g;`F#Qp+=xN~7H3 zI2?8QdvM-Pow3G8pPov@x7um zpg6Ps5Fh#@H57f8ZM_tCIWhcSRw`mCeyaQ`RR!-`zx3Uu^$G>W18iySwyLnw_^8vK zJ*(g{q2P#6|7k!HR?C|&kw2O)d$ep0c=f(D&`Qtmy3lH4e59TQ@8pw*Pr8~;`3?0> zT&bop3XYN7i@kLR>Nk9x^G{HaR0-4lfrPBAV<8sEhA!r<5@n1!zgPS&e#8>PI;zDNk$N<6TY!l-Jhct>vTLe_z>JvQ+N z3TucPs-}bpmr2ivVb=IUhO^^WZp`MlEDqY6l`GHX4G zN(mlznc_wYGaJ)wjWBXPKSc}y;rrrfw}@}DSnw+9i@Z;p%Bh-DtcHYs=g{_eza5Go zg)4JXlc^6Q<~R5GP?JxrtZyx})2(}0Ut3q0d`r_!PJcOn*`v@EU`CNrPe&-UHrArW zr1suv`_C^I`u*ru9)WZocW`oDMQ!gr7J>-%XU0o`EMhi!E4_nErz*+%+f5NV#30Q} zU^3UCm85HNiGz$}0Wr^^Qe#wBfts43JzW{I>SZ6PtA`9DGqNs|o#T&25RQmjCr0gu z=hCY}fQuYB%k?=2N#^-wx4~E#0rv{t)&q;49h=4X^GrI~0URQl6&a`F&37WHYqr$Sh~uja z3zEO3-0~DNiPd1CA1=mkbzHf8#uk13&L1^}?so6fLk|fXuIk&BqQCcwa#*U^D?Ms5 zz)S9TNHR|wSs8%G73!|9E9PxhB>L;qJorBtt`vs{b{%;>f3$;b*;lh|vQ5}SlFwr0 ztIbYs1SgYe+kYF6k^EZU8IKE_%<9W(Y-p)0x;DG#Y;1KVHXUDA{2D$%nxCd2e*A^NqrHhmxwQ8g?v@D*WG4 zNWW8v4sBw-jyM<{rumdDw6=e>NRst>m-bxm*{fUZIj%lLQol1?mzqVByc})U5o5sP zMqgh`+w#MSss@w!R_Q>fagsc)-xtrCEa;+jg%_#?>ul{@ik%PY?pDs;TgO#`7{cwH z0Zv?Y26I_RYRW|^2rc#Meg*y`7P=s_Ua~7oE|#crpj=9#duw&Y`2Em8)lrW?K8?u5 zDzWWcM5Wzj)j#+T$F@1+6#Yr6)~}>Za6F8eYGoU|LL=ibat9XJ%3d$Py;2v@^yW1VD@&BVQ4+{DEdkA% zff_96@iOEz01oC+rkDqI3&AQPoqbJtV)RCuXmpMX?{aEH29r-aikBp@2s8@)Sqe`) z&;sny+&SHdN(rgw(R!vt0X@MjSplRCja-bED5>j1SEPwj!~4rO=ED zNt{?v6xw>(wIMlXSEp$!8=n-4g#{{_=RB#G8qUl6KU*>shU~)f7135G6};s9&c>tK ziMWU4Ik(N0&wijI@Aj{H_cD?lw=ZcD+UG?dz;KhjsWYY}z}2ayxYw#Bx*FVMk4ev1 z#C(P@z&r0zOW+;p2iz|)HdW-Rq>MD*@osj+2n4OH0&?_SjQqqUZICgEAe#~X+A>Fh zw~Z|O^UK4AX*+Kg7TyeEWcP2+tV&b?UTXGcplZpaJ~q4dE5@%mtP`vk$=YI0(_s-y zkUDx@*t6+u$u@fToh&PJ#k3O2a$50=Bn&%KA_3a)z7|bUK?Z=IKVva|WKMe^sweuE z$~T!Wca}1grh(<&!(UCtwoP!otSgxiY6_)HKGIw3qW2qjnfq}gYi z%!j@G=N3t8(fc_>IndJ36nSG!IOEf|odeV?=OgS8!Xcyrygckh=&YqJ8)Eu`@ z7~b@Qe+EcXYF?-`9I51Y25^<-cOX*@HIjw7o?Lw9p>%C`e10!b@Li+Pmn;f)5Qjmk z8Fv*Rv{pt>uF~&xLBJJ_W*pIDUVy&IE?hG<5U;MK>?D_DP3et}((vYq>P6t5?>CPt zzj)TO!-Kft{6fbA;-wVg>;lSUnXmn2m)@pYVMJsmu1%VQ-a2h!xib zYBCE{G`KHiwxwS}XgwfF6%Ri}HjBp>*;pUS#xOsUADUWDzqVY;@gRn~HXxrWd|@{< zI9Ehb*JjSgq$c7UPHjjjE<@%Fv&g~{-gaM&jWoIHaVi0S zH4d>aw)eahdeR+5(|axeUzGYdv&pA^)lr?_ex|usX1ypU2`^CDm&jH6yqmLoU2@q? ze?*S^y`HCU2xjS@!F?hf#hZ>#3!lv(?&5LY*@#W34>SYmP z7I(yRY~rGF<-cj3^&dcB_`pIi*L+yNvgg|#m=5w5Pr67$#NDkhc!vq8DF7%Sy-lJv z8oZKBp-7$~S$O@ONu=H30&kSb1P!mZx2yrxfwNGwS$<2y@rwg}gr=ea_VySdy))2; zkS8l*p=z|bG#Z7)k0{ENK!4iHZHURwle^^2?&vu2ihUGJ0mL-kk08+5D)A{yW>NP7 zbvc|>;B$zgs-u_q-sSL{3dHvai-RMXLzr3fPOos7EZXsQD#^{w>LGYxcIHiZ2qTv( z%`4;>X^)>!5t%jf%O!b1?oWs!l@N>B_y<|xVkTS-{ zlm&@kq!pLRoN_LZkSy0p8XUOdeu!_(b?LVafV$h1U)t*X9I+A{uxwZ*fGR=C`)U)i zVB0tW12MHjz>flSc)qoz|ZEj<7=yErP{U zdrFW?;PdZ`NSJxz51-J#-3PxNt$F#qWD`~Dx%4A91oSQEmaml~1crZ2$KALQZ4g`A zAPBRS55k(7Ma$9LB(XE^YA7Xoi|4^z3r}OaPaU4qFVO}=H%7JpXa^VWwaOHHLg&*n z)w4kK1&Y8+h<@DDpqBhX)porBwlWcYzqTs-j9r!toUU^TQx(WY5DJj@Ak2k^V)5fqW6xq zRl2%#@9~75$~X3mA7)82YJiV~+(?|-oLL48reAIN)W4fJv*XBLe$YHiDNg*jRlM1S zE%VNP>UDkcJsBjg=Xgp_Kq}>(I+n?M(Lb~I{Rr(X@>hA5&$WrHOqRPRuo5iLeHH)0 z$jhKNPF3T~T`$Sav5;d8>FB%tjRZp&y^4ZcvH=ko-qZ33Xfs7EL-XD>aRot<7Ie8a z%1;&_qdTsDicIsR1kXUkb*5#p{T5zh;Q(%f3n857AKt+;i#zXb*uJK=mn_v zk1>}8I~E3TwU1;S!e;xAJo!l`W{O`oKFLT>!_!p%c!rkGV9gy8%#Wj{rj{yYH``0+ zr31MAUGZRaJP&!t5p;Scy;aJL-{$Dwy~p2L2k^haeuo75%^VR4!HxZ;|I-#(>eRqip?neBL zmvAQxy%ojk082YVqIvPRQy&^hb;gh9%&>&}^Gs>wu6coW=TE$_lwdHe^v_>@bLPZ{ zPy|rOF@;uN{AN$}zEeu4Hy@f?+gPFhuexPzriX6OkjT@oCz+%6vdbhjR-yhHV_42e z=9hz#styp&tlyb=z%72qgQbKJC+z2+spr)?2|L4HkqDks(VBNWO_4Mh6((UR@of_2 zm2Q+z&CIr+Kn7$KN#oIsy5D*CWv_Ape3NKU;qfqTmiM8M1^<`Bi9Rs&593djIBRX5 zDPP{mPYkr~DuRTGc$dBed7apo=Tx5-iX=mx9#(z7(K7Y`?j%(DLYg3hnd5Zaj0BVu zAyTd9G>XuyW|(?u_zW}`TV!NbjMX8fek?0Dd5I|cOZrSY?WsL5a)30LH#VZq-4J6V z%pGnyt^@6Kmq`qyH@%hKyo7fCG1$im0s6G4v|rpmeT_k79#a6$U+U7Q zxgagwrOkgX#LGks+LwW8snTd%E!@ooF~{KencjQa!_No}KIrPma9#Ai!!Epp8WUr9 zzbohyYE{zhg3ZaWCqm9A26iVShgL!C$%iNhVvv`%Ini#W8V^^15J%mU&2t&_q`()| z4jslb`KHT9I^)O)@%WFx=e~;j2ZHNzCk=-1UhS^i=CrUHW!q}i1$l&Qwa+lEK)PIw zUYG;HQiPjNICdI9PM@z!Z<+QOdiU$)Sip@0fE$@uR3ffCz~&S{eTw(i#I$-q0_pi< z8bn5@R&%{Oc-R8GUOW#=1q0Ys$XqlT7HLk>f4O}RtqBM2$tcA>v^sXP@I-{rxqW$n83ZiQ%Ls|+=Im%!Lb(h?L*R7Xf8O0~c zlhJAe7#{%;ab~KS!lEK7s|K<34FBb)OTX|_qKB^mHLq2E&4A9)5D~+ynIABokdTn9 z34d({B)K&&lcH$I{xi1Nl7lMJ4ISmlw#>cF5oXOK9-3P=@{1?5PgxzQa(7HsX2#d(01v^Q4z#cuG=YdNS^jzE;lk)-71 z0MXbCgH`Dbpd-Oam%Qk+;5jEKaBvxLv?)L!lr(Hi%pjt3CFpVYtIiro%1MwGTy?6W9Ow&J zf5hbrvBG`cTjXUQRO>4R1DO7&EzD=$G?GL#|FK)H*rGZR0a{pCxD^%_ zwje}EL&1M2M7ZCHfTE-1CN@p_p08>VKpcsd^4T8-fMmZl> z9CcpRVx2cIp{ycb{KeZ%piy})t&W6vObE9b85ugdx`^KsEU%{UG2O4b3T0KWCfLir z=xr`6piaraI$js=Y;(LOcIL16l|(7}!tQ4-$>6R8ThH4!Z&Dyk%R{nX_C6;^$FPMA z%l{$nDr&|>iy&dm_tp!hXR@h&a&wu&Wc|{Ux)zB^RDpXEoC_`yNrqh?{A65pKkvNb z@MX1Z?DpJOv&*`oyhUDS+EI_qKAH75?+yvpRWYiB&|>a634vjSDDmNcKB>d28gGvi zD_){vq3IMFFgTRRnsyzjv%Yc7VrKu1Azr%QaCLEg5Z5F2R_9_wn(u zpo(;A$)izB^fFAfiRH7ib-Uz^G$-e$ExZCkUzvb+E2&KT@WECsoKnQK zSqk%g*%u=~q07$??Pb1=U#_KAN0r$jqL(9!#sZMe?j!T=eKwH?3MY7NfS`KrV9I_E z`&=|$c)NrE!&+Pu@xDwO*l}A1czaTT%)Ed?6e7jW)6&v1Gn&TQ)T3O|gVV7n&V;0i zs{@?2FX^+Wua&*hJ->U(7#bR)Z;drzl~j^K3rGt}zDg^p6x(~L+US((`dLEqo(NHG zXHnkxc}@Pbhrr8w@H5Hnl+@jqM)&R4zzZ4J-p7L+`$k7raZ*2%&qsU3O2*em>JzAh zu18(T?7SvkKZV_4kh|5)$fJ(ywb#5E+JTNX*r#gQL~r1W!_HL3;b?e8iwQNp?8D}5 zK9G)-6UpK+eQ$_!C7k=TDWx;}3f7mP^VUp`Nk!_1rL;S$ntW;o=pYOkL-_hJ>qIU(aX!w=Z??WpJoIu6bzK_Uu+1AbcSfzwV7l zr^j;0#(&2!aA*6W&J@K0{t}6w_cV6)Rg^b+E(;#>=cwdUFv!czwO9qYfbc{09^I^9 zP)LBfy1LbDiRugIIAm3&v5Ee9mgb`&FB17#VDIsOMDU|`mMKWt3wEd86W;s6y(v#g zMkw&CvWKJsgI&)tVox>^3DqRbDi%Q^6i$4}8TG#&+D)RDROC$St0qt}BRRZ$%F~ze zCVW(nG-0-OsYoxeL=C07jnI^s@!(J>3A<(7ZkDwEb*m3sCte zLrP7Zk1u$p&YKcypk{xCeHM7J7RZjK(AE-uIxR$zf)`KD&p=CT&sWHDSTG!zOV~kv z)5K^&gYoW)l@Pu%S*i;BS_av|jPfnK;{uGdLi@dMSnRS+_EKNy!6rZ#=;_(PUb&G! z$@T~UaF(~Y*Xp`1o*8s0#v$`Uy=#q!*_0zZ^ScX0$=pfwdowd0bHD8<(7bg6x~7%0 zuk!w_^aRiHZ{Jbrc9@EHVIZ)q>O=*~*bAV-_x|YX`$r{oO}|_#fu4S9>o)zXxB|nk z!zSd_uh#8UbzP4iUTMDBzFkQesPq)NH=lrhyvy=lbom~WLRlkGWK3Mag-D?gW_8E= zBB9iISGA>&@;-98DcU4X5oH?dtix_>1MWNI=D-pQZsx2C&0#H~EfTSz(j(y`_mLTG z&FVZcAPIpJWHH&RQ^kJ>@{tTdrFx!7O9y!Nn!^m;M+Ky%(6|t9tR(49dpPL9z|IfH z!+(zK3s8NN`DS2Jg{*miySdf$W!3_tga*1Ww>Ot^ndR-qRUyZxrWZd0X?TQ|ILRcB z*$=G{rly0n9GCJG{8$5%Br0EL~*pFpQ?n_B!c&APb zl_MmT$l4OU1}iBjeNM>u8>ynw_NN9#KL@wTsv$PkC|ZMPuN@wfBEsg&VcSjIDxvdD zFS(IEwj_;D;9l7gTy%+PR~fYT_EVg9bYfoBBFeMlZ+* zr#Pwywp4luWGcRmmC1}KV?7=$20e~e0|ZtzFk?To9Hw~pwV!v5TQM;c1Yp9hql?&@ zpHZ7sQ76k_ESF6y<*a*rmrVir$mlP6w)>;s>@}z{Bv>N~wLei3GgDw!8 z9Hq$(+0_1G*)Mj4jS?U^vPi%oki|#wS=x~MuW2LMwtw;_%o zkS&iHhGwtC0MO^k;UbuFF>D=DsqKBC5T0OU!o>RCO$dx)L*qkZBJz6{e4&N5zVxn? z8;?D&t8P0snS=9d_X7NW2WIq;UtNz9-qgs1f2pkCYHR7^2{jSsqkWn|B66>UxVhok zokoWviv3>O|9PWucFcQT!PsaE;Ysj)Sx!PkCKEm~N&dR~PQLD-IkI^m6;Ret>hLA7BQBcnM0tYe9UwsZ&`Q{Ta*(^46 zp7-tdOy$>wA{P&~Temi~lBf2o_y-gIVtmMCWJwQI$V`1}1IAn}Ngo0YY6oy^%t37O zsKx2fJnfZiP~IjW>n|i*qUiW@WwZNZQVaK0!x>Bkp6-RBsW%595{9yImxe}&QRrsv zt0MHgM&RJ``KF9g^G;El{?qHP0q;%HN2EYuXvMaE)!!>ca-uG5DAVv5Weo75MWlot z%eJ(gyjnmYQ1!c}A=YQwjT<~>0ZCTR&oT*9=#NZw=ZYpHXc6@pV3c# z_ZNC>u*ufghxxV5v0aRFc=Xrv76;e!BMK1qq<)b@d2HM-*fV#(qEF7vf;uPtK_Eg8 z+URyIeg|YSFuwC3FMdL#Fj)4NUx)?_|)+OC`eV?KrHRa!jL)cqc( z#mPgM-UI@m4_(`!eiOB@m05FoiNRLWc3)f4*MlzDsbyLe7%!B4D2}0c>5-LWZ6MIw zNeH)09eX-3BE4nNSCTF_M2{{RG1&NA0z~TQ^)y@zUX+$ z#SG9~dhE8@73@qKt426#_%K_l-dQ{dvjTSq))#6Ur^Q%aWWljrj~^2KZ*~MYv-6s4 z^}lm1q}^j#sKURpW)3f{-`spC+Sc)=@E*fVoD9tZ{2}Vgtxt#k#Tl&GKDko5rPzf^WL~;~RMVSC4t%4g(aJuqbbcd(*Bnt6uXFdyjE6?bn`oxl?KLJchCKj{m+fE}73?*(F*t1prQpLKUi zPm65fW{9xXRS`~QPJ+MkbTZ_j_b_buxpNOBko9n4^7wwZ1`G0$H$^7bJAtkxxhxRp zqA6Ok>g_cyI`nt=ri*bEl}?fSie6xNgR11DS&&HRZ@tjH;&}=Z0ToFqa%Xi>R{D&4 zH&YP|wWw1CIG))&rmF6&-<;|W_F{bMFpAAib*mf5d)w5W6%;@KFNd42b-!c(7XtD7 zOW9jwd#5xT@!N;bry7!QG(* z(bOc%fdsGFl!2PG_aoiZMS$xV6CP1WKhoNe#VX9a@*i39;&rlSN1{Lh!pCdv6pU~p zS135snE@n$d8gKu?#I6jM(hIY3uloqV`i=VMLmW*Va6#Z9q%2*f)TmQ5+e#Uh+nXo zUVtYx$42cX8C0@EdmLCSYHDg$o*%A@;j#0m$L>(6Bn=+B#aUuvV)M6exwXfsrU}Oe zi=3opkK`|H=!gusv2bt-dn(Z6DnqAC;H`&}Kdx_7eBs9t9-*WCO+E~E)}en$p3^Dl zBX$(-FZ)MaJEpXw5l$Gf)_laY1Rl9i8G*k`4X>E@>(CGFy+kerZj<)6Artm$19w5) zx;Y@7aH%M6d2hs>Fh>*V9%=mQ3Ip1Md)*uQON6tJ|d@ ziO|#EL|fqAJK1_x7{1Uxj`|B&MRVD1;9 zUshV$@;8O)xyK~ed85rxgFbutT^BBWd}R`=z(POn5i_i)M}$w7fx<KMgrnYRE;eW>f|7FggD z^`V&(=oHzaOmG4DfxmTS-!Yyy!vG*AtGUPxvTm2y}>;wg_7x%*SZUH@2KESQP+Mwi69*IT zIn{L@taJka%Z;|Tea8jDM=MkzMu#7m^OgCabcPO>yZ{ zPMTogL7LqOSsuI5ucdFB&lj?I^tGg{eTCW0-n=n=6Ce76nnr5F4AKNt*d99`xG4_p zsbI2*ELG16_;|83L;fO~+TfZbR>1-ufzYX@Chm$+`kZ$8PMMR@hFo#|>WAaSshdz)X7ycrk|Ipm z1jhKm?s@3$u$xz3>oHPWt7NT^wOuwY(&G1IJe@hbu9hF_!R-9Hfx@PO*D)fJFZ1j1 zkN`&6PU^^Y3{Qw;=psT-dfKNs4&K&P;FTcRA^V{3o~p2pKI1d(VvDRgu2?`U)?bNl zW60tYnM;&uQkd*_8A|!aO>)q-8QWJF?RnhI($q=BrH^qgDQ}Wog^MwD3it8H6u;h` z{i^r$o#o^L(aaJjNw-j1jD%z0seChqG;?ZBXiqksg(7;T^o!_t*lrTh(Ey!_EA4BQ z@f)HTpB$_aK3mt%@;0+pcX z4?$>6Q_j&6c*{18-q0+=!?NIh-#_e)a~k@|aaoOZMkj_lwpXeDB$Ok6#SHMsCXw(j zElWp};Azm+Uf!rDKy5npRveIy&x6h~{_+&~=vbngc$#Z@u!ZjpVuN-%c~ zTgcjX3DkJpET_iPm!L=xttcDL{`9AAgQZ=2&g$uIXgdrYk!M+Nsd*xj9Pa^oasP6^ zFK+6{f9@#Fk6Wi3%>J<9VTknB%wUPgy%bD)+CCG4b=pd{XU&qD)EPlQ+r(ym06w1S zdNR80o`>+#(a~WTvFEWy^nV3cyP?`Dm5HWx`s8urXT=A9%Tjw?!8nmBS7Du99-Urs zf_3h{nl;mPu_;Yxm5dM$PkMS%pRu*NkiXFlPiVFX zeQBBfPu}y-$5k5eL5;&T^L~vCr2!DT+QbutRNwKds^*^0iC8-e8o1D8;k7Dkbv@}# z&!hnO&M=>y98NiZ;6FWlld)chg{@pc1KGddf-^kd;_|1tTA=?cy|CpNIR~);p7LIp zKaMd7V&;8_NePOmLuB4Gmv-%NDSw2gW3iE)*BfK=ZXxZR`;F?dN(>^|kO0?BsrS#k zK7Yky7)ZYJs(;nz!+Q<8Zb5VLsP)Sy$h3}jv(LO2o0mcgElkf-un+a<=!f}oY-|t4 zvC}gknMKHX9rq3KerxweMKg|$(P?B+B@GuQ@D=jb Date: Tue, 24 Sep 2019 19:17:35 -0400 Subject: [PATCH 30/57] Automatic changelog generation for PR #12398 [ci skip] --- html/changelogs/AutoChangeLog-pr-12398.yml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12398.yml diff --git a/html/changelogs/AutoChangeLog-pr-12398.yml b/html/changelogs/AutoChangeLog-pr-12398.yml new file mode 100644 index 00000000000..0da19f04d18 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12398.yml @@ -0,0 +1,9 @@ +author: "Fox McCloud" +delete-after: True +changes: + - tweak: "Slimes are a simple mob subtype" + - rscadd: "using a bloodlust slime potion on a docile slime removes the docility" + - rscadd: "using a docility potion on a rabid slime calms them down" + - tweak: "slime core removal surgery steps are now just scalpel->hemostat" + - rscadd: "Slimes have action buttons to feed on, evolve, or reproduce" + - bugfix: "Fixes beepsky arresting slimes (maybe it should be a feature....)" From 0ad54794fc5c86537bee985b8cb59dacc34491cb Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Tue, 24 Sep 2019 19:39:12 -0400 Subject: [PATCH 31/57] Fixes Extinguishing Some Fires (#12410) --- code/game/objects/items.dm | 4 ---- code/game/objects/objs.dm | 4 ++++ 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 7acaf887828..25c39c3e9f1 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -154,10 +154,6 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d /obj/item/blob_act() qdel(src) -/obj/item/water_act(volume, temperature, source, method = TOUCH) - . = ..() - extinguish() - /obj/item/verb/move_to_top() set name = "Move To Top" set category = null diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index ded21767fe6..2dec47151ac 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -272,6 +272,10 @@ a { user.set_machine(src) onclose(user, "mtcomputer") +/obj/water_act(volume, temperature, source, method = TOUCH) + . = ..() + extinguish() + /obj/singularity_pull(S, current_size) if(anchored) if(current_size >= STAGE_FIVE) From 655a8f38e330e985703b412a489616df1403352e Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Tue, 24 Sep 2019 19:39:14 -0400 Subject: [PATCH 32/57] Automatic changelog generation for PR #12410 [ci skip] --- html/changelogs/AutoChangeLog-pr-12410.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12410.yml diff --git a/html/changelogs/AutoChangeLog-pr-12410.yml b/html/changelogs/AutoChangeLog-pr-12410.yml new file mode 100644 index 00000000000..d86cfd1f155 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12410.yml @@ -0,0 +1,4 @@ +author: "Fox McCloud" +delete-after: True +changes: + - bugfix: "Fixes not being able to extinguish some items" From b2509450da5a808947a8ef479760edf16297ce04 Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Tue, 24 Sep 2019 20:02:33 -0400 Subject: [PATCH 33/57] Removes Christmas (#12411) --- christmas.dm | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 christmas.dm diff --git a/christmas.dm b/christmas.dm deleted file mode 100644 index e69de29bb2d..00000000000 From 3bc3df1e8fbccb1358a7035d1a5ef285df21e372 Mon Sep 17 00:00:00 2001 From: variableundefined <40092670+variableundefined@users.noreply.github.com> Date: Tue, 24 Sep 2019 21:57:58 -0400 Subject: [PATCH 34/57] Manual Changelog Compile 9/24/2019 Night --- html/changelog.html | 72 ++++++++++++++++++++++ html/changelogs/.all_changelog.yml | 64 +++++++++++++++++++ html/changelogs/AutoChangeLog-pr-12360.yml | 4 -- html/changelogs/AutoChangeLog-pr-12362.yml | 4 -- html/changelogs/AutoChangeLog-pr-12372.yml | 5 -- html/changelogs/AutoChangeLog-pr-12373.yml | 4 -- html/changelogs/AutoChangeLog-pr-12375.yml | 5 -- html/changelogs/AutoChangeLog-pr-12377.yml | 4 -- html/changelogs/AutoChangeLog-pr-12380.yml | 4 -- html/changelogs/AutoChangeLog-pr-12381.yml | 6 -- html/changelogs/AutoChangeLog-pr-12382.yml | 4 -- html/changelogs/AutoChangeLog-pr-12387.yml | 4 -- html/changelogs/AutoChangeLog-pr-12388.yml | 7 --- html/changelogs/AutoChangeLog-pr-12389.yml | 8 --- html/changelogs/AutoChangeLog-pr-12394.yml | 4 -- html/changelogs/AutoChangeLog-pr-12397.yml | 4 -- html/changelogs/AutoChangeLog-pr-12398.yml | 9 --- html/changelogs/AutoChangeLog-pr-12399.yml | 4 -- html/changelogs/AutoChangeLog-pr-12400.yml | 6 -- html/changelogs/AutoChangeLog-pr-12401.yml | 5 -- html/changelogs/AutoChangeLog-pr-12402.yml | 4 -- html/changelogs/AutoChangeLog-pr-12409.yml | 4 -- html/changelogs/AutoChangeLog-pr-12410.yml | 4 -- 23 files changed, 136 insertions(+), 103 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-12360.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12362.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12372.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12373.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12375.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12377.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12380.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12381.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12382.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12387.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12388.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12389.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12394.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12397.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12398.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12399.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12400.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12401.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12402.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12409.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12410.yml diff --git a/html/changelog.html b/html/changelog.html index c9a4359caf0..c0c76d3ffdd 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,78 @@ -->

+

24 September 2019

+

AzuleUtama updated:

+
    +
  • Fixed misleading uplink description for chef's traitor knife.
  • +
  • Reorganises products in seed vendor.
  • +
  • Fixes Durathread mutating into more Durathread
  • +
+

Dave-TH updated:

+
    +
  • Mob spawners will no longer sometimes send players to the void.
  • +
  • The ghosts inside possessed blades are now invincible and will not die to weird edge cases.
  • +
+

Evankhell561 updated:

+
    +
  • mechs now start with a high-capacity power cell+
  • +
+

Fox McCloud updated:

+
    +
  • Buckling has its own icon
  • +
  • Fixes Xenobio monkey shortcuts not working
  • +
  • Bodyscanners are similar to sleepers; interact with them by clicking on the scanner; there is no console anymore
  • +
  • Summon guns/magic is no longer free, but costs 2 spells points
  • +
  • Summon guns/magic makes 10% of the crew antags with the objective to collect guns/magical items and kill anyone who gets in their way
  • +
  • If a wizard (or admin) summons guns/magic, latejoiners to the round will also acquire summoned items
  • +
  • Wizard's hardsuit is now battlemage armor
  • +
  • Battlemage armor protects you from pressure of space (but not the cold), has no slowdown, and a moderate amount of armor, however, it has 16 shields to block incoming attacks
  • +
  • Can purchase additional charges for your battlemage armor for 1 spell point
  • +
  • Shielded hardsuits now show the shield on the mob
  • +
  • Abductors, Skeletons, Shadowlings, and Plasmamen never get hungry
  • +
  • Abductors, Skeleton, and Plasmamen can't taste anything
  • +
  • Wood Golems now have a diet and taste sensitivity much like Diona
  • +
  • Unathi are more sensitive to tastes
  • +
  • Adjusted the sensitivity of "sharp" and "dull" tastes a bit
  • +
  • Slimes are a simple mob subtype
  • +
  • using a bloodlust slime potion on a docile slime removes the docility
  • +
  • using a docility potion on a rabid slime calms them down
  • +
  • slime core removal surgery steps are now just scalpel->hemostat
  • +
  • Slimes have action buttons to feed on, evolve, or reproduce
  • +
  • Fixes beepsky arresting slimes (maybe it should be a feature....)
  • +
  • Fixes Seed Vault gene modder having limitations
  • +
  • Fixes not being able to extinguish some items
  • +
+

Ionward updated:

+
    +
  • Fixed Tajaran fat sprites, they are no longer duplicates of their slim torso.
  • +
  • Fixed fat aqua jumpsuit only using one direction.
  • +
  • Fixed missing Lasagna icon.
  • +
+

Kyep updated:

+
    +
  • The Hierophant club and warp cubes (lavaland loot) no longer allow you to teleport into or out of areas that are set to forbid teleports.
  • +
  • Fixed a small bug that caused coins named "syndicate coin" or "antag token" to both incorrectly appear as "valid coin".
  • +
+

Markolie updated:

+
    +
  • Fixed naked equipment selection and reincarnation not working.
  • +
+

TDSSS updated:

+
    +
  • all huds are the first option when ghosts cycle through huds
  • +
  • fixed brig door timers from announcing admin names when stopped via admin powers.
  • +
+

Ty-Omaha updated:

+
    +
  • You can now silence the current midi with a verb in the preferences tab, without affecting your prefrence to hear midis in the future.
  • +
+

datlo updated:

+
    +
  • Fixed clown changelings not losing comic sans on transformation
  • +
  • Clowns can now lose the clumsy and comic genes through DNA manipulation (but not mutadone)
  • +
+

22 September 2019

Evankhell561 updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 1207e01fa7a..0e23667e483 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -11495,3 +11495,67 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. does not cause a runtime anymore TDSSS: - tweak: Just slight gloves refactor, shouldn't impact anything in game. +2019-09-24: + AzuleUtama: + - bugfix: Fixed misleading uplink description for chef's traitor knife. + - tweak: Reorganises products in seed vendor. + - bugfix: Fixes Durathread mutating into more Durathread + Dave-TH: + - bugfix: Mob spawners will no longer sometimes send players to the void. + - bugfix: The ghosts inside possessed blades are now invincible and will not die + to weird edge cases. + Evankhell561: + - tweak: mechs now start with a high-capacity power cell+ + Fox McCloud: + - tweak: Buckling has its own icon + - bugfix: Fixes Xenobio monkey shortcuts not working + - tweak: Bodyscanners are similar to sleepers; interact with them by clicking on + the scanner; there is no console anymore + - rscadd: Summon guns/magic is no longer free, but costs 2 spells points + - rscadd: Summon guns/magic makes 10% of the crew antags with the objective to collect + guns/magical items and kill anyone who gets in their way + - rscadd: If a wizard (or admin) summons guns/magic, latejoiners to the round will + also acquire summoned items + - tweak: Wizard's hardsuit is now battlemage armor + - tweak: Battlemage armor protects you from pressure of space (but not the cold), + has no slowdown, and a moderate amount of armor, however, it has 16 shields + to block incoming attacks + - rscadd: Can purchase additional charges for your battlemage armor for 1 spell + point + - tweak: Shielded hardsuits now show the shield on the mob + - rscadd: Abductors, Skeletons, Shadowlings, and Plasmamen never get hungry + - tweak: Abductors, Skeleton, and Plasmamen can't taste anything + - tweak: Wood Golems now have a diet and taste sensitivity much like Diona + - tweak: Unathi are more sensitive to tastes + - tweak: Adjusted the sensitivity of "sharp" and "dull" tastes a bit + - tweak: Slimes are a simple mob subtype + - rscadd: using a bloodlust slime potion on a docile slime removes the docility + - rscadd: using a docility potion on a rabid slime calms them down + - tweak: slime core removal surgery steps are now just scalpel->hemostat + - rscadd: Slimes have action buttons to feed on, evolve, or reproduce + - bugfix: Fixes beepsky arresting slimes (maybe it should be a feature....) + - bugfix: Fixes Seed Vault gene modder having limitations + - bugfix: Fixes not being able to extinguish some items + Ionward: + - bugfix: Fixed Tajaran fat sprites, they are no longer duplicates of their slim + torso. + - bugfix: Fixed fat aqua jumpsuit only using one direction. + - bugfix: Fixed missing Lasagna icon. + Kyep: + - bugfix: The Hierophant club and warp cubes (lavaland loot) no longer allow you + to teleport into or out of areas that are set to forbid teleports. + - bugfix: Fixed a small bug that caused coins named "syndicate coin" or "antag token" + to both incorrectly appear as "valid coin". + Markolie: + - bugfix: Fixed naked equipment selection and reincarnation not working. + TDSSS: + - tweak: all huds are the first option when ghosts cycle through huds + - bugfix: fixed brig door timers from announcing admin names when stopped via admin + powers. + Ty-Omaha: + - rscadd: You can now silence the current midi with a verb in the preferences tab, + without affecting your prefrence to hear midis in the future. + datlo: + - bugfix: Fixed clown changelings not losing comic sans on transformation + - tweak: Clowns can now lose the clumsy and comic genes through DNA manipulation + (but not mutadone) diff --git a/html/changelogs/AutoChangeLog-pr-12360.yml b/html/changelogs/AutoChangeLog-pr-12360.yml deleted file mode 100644 index 58aa0a0335d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-12360.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Kyep" -delete-after: True -changes: - - bugfix: "The Hierophant club and warp cubes (lavaland loot) no longer allow you to teleport into or out of areas that are set to forbid teleports." diff --git a/html/changelogs/AutoChangeLog-pr-12362.yml b/html/changelogs/AutoChangeLog-pr-12362.yml deleted file mode 100644 index ca4c4171aa7..00000000000 --- a/html/changelogs/AutoChangeLog-pr-12362.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Kyep" -delete-after: True -changes: - - bugfix: "Fixed a small bug that caused coins named \"syndicate coin\" or \"antag token\" to both incorrectly appear as \"valid coin\"." diff --git a/html/changelogs/AutoChangeLog-pr-12372.yml b/html/changelogs/AutoChangeLog-pr-12372.yml deleted file mode 100644 index e294bb4c03e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-12372.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "datlo" -delete-after: True -changes: - - bugfix: "Fixed clown changelings not losing comic sans on transformation" - - tweak: "Clowns can now lose the clumsy and comic genes through DNA manipulation (but not mutadone)" diff --git a/html/changelogs/AutoChangeLog-pr-12373.yml b/html/changelogs/AutoChangeLog-pr-12373.yml deleted file mode 100644 index c6104a19c10..00000000000 --- a/html/changelogs/AutoChangeLog-pr-12373.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "TDSSS" -delete-after: True -changes: - - tweak: "all huds are the first option when ghosts cycle through huds" diff --git a/html/changelogs/AutoChangeLog-pr-12375.yml b/html/changelogs/AutoChangeLog-pr-12375.yml deleted file mode 100644 index 4391987e967..00000000000 --- a/html/changelogs/AutoChangeLog-pr-12375.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - tweak: "Buckling has its own icon" - - bugfix: "Fixes Xenobio monkey shortcuts not working" diff --git a/html/changelogs/AutoChangeLog-pr-12377.yml b/html/changelogs/AutoChangeLog-pr-12377.yml deleted file mode 100644 index 529267617e0..00000000000 --- a/html/changelogs/AutoChangeLog-pr-12377.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - tweak: "Bodyscanners are similar to sleepers; interact with them by clicking on the scanner; there is no console anymore" diff --git a/html/changelogs/AutoChangeLog-pr-12380.yml b/html/changelogs/AutoChangeLog-pr-12380.yml deleted file mode 100644 index 89a5fe22f1d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-12380.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "TDSSS" -delete-after: True -changes: - - bugfix: "fixed brig door timers from announcing admin names when stopped via admin powers." diff --git a/html/changelogs/AutoChangeLog-pr-12381.yml b/html/changelogs/AutoChangeLog-pr-12381.yml deleted file mode 100644 index adc4cf02ce9..00000000000 --- a/html/changelogs/AutoChangeLog-pr-12381.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - rscadd: "Summon guns/magic is no longer free, but costs 2 spells points" - - rscadd: "Summon guns/magic makes 10% of the crew antags with the objective to collect guns/magical items and kill anyone who gets in their way" - - rscadd: "If a wizard (or admin) summons guns/magic, latejoiners to the round will also acquire summoned items" diff --git a/html/changelogs/AutoChangeLog-pr-12382.yml b/html/changelogs/AutoChangeLog-pr-12382.yml deleted file mode 100644 index 518ee606aaf..00000000000 --- a/html/changelogs/AutoChangeLog-pr-12382.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Evankhell561" -delete-after: True -changes: - - tweak: "mechs now start with a high-capacity power cell+" diff --git a/html/changelogs/AutoChangeLog-pr-12387.yml b/html/changelogs/AutoChangeLog-pr-12387.yml deleted file mode 100644 index 60df714e6b0..00000000000 --- a/html/changelogs/AutoChangeLog-pr-12387.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Markolie" -delete-after: True -changes: - - bugfix: "Fixed naked equipment selection and reincarnation not working." diff --git a/html/changelogs/AutoChangeLog-pr-12388.yml b/html/changelogs/AutoChangeLog-pr-12388.yml deleted file mode 100644 index 4f064ebce36..00000000000 --- a/html/changelogs/AutoChangeLog-pr-12388.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - tweak: "Wizard's hardsuit is now battlemage armor" - - tweak: "Battlemage armor protects you from pressure of space (but not the cold), has no slowdown, and a moderate amount of armor, however, it has 16 shields to block incoming attacks" - - rscadd: "Can purchase additional charges for your battlemage armor for 1 spell point" - - tweak: "Shielded hardsuits now show the shield on the mob" diff --git a/html/changelogs/AutoChangeLog-pr-12389.yml b/html/changelogs/AutoChangeLog-pr-12389.yml deleted file mode 100644 index 0ec30bdb4c7..00000000000 --- a/html/changelogs/AutoChangeLog-pr-12389.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - rscadd: "Abductors, Skeletons, Shadowlings, and Plasmamen never get hungry" - - tweak: "Abductors, Skeleton, and Plasmamen can't taste anything" - - tweak: "Wood Golems now have a diet and taste sensitivity much like Diona" - - tweak: "Unathi are more sensitive to tastes" - - tweak: "Adjusted the sensitivity of \"sharp\" and \"dull\" tastes a bit" diff --git a/html/changelogs/AutoChangeLog-pr-12394.yml b/html/changelogs/AutoChangeLog-pr-12394.yml deleted file mode 100644 index 2ea7342cd5a..00000000000 --- a/html/changelogs/AutoChangeLog-pr-12394.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ty-Omaha" -delete-after: True -changes: - - rscadd: "You can now silence the current midi with a verb in the preferences tab, without affecting your prefrence to hear midis in the future." diff --git a/html/changelogs/AutoChangeLog-pr-12397.yml b/html/changelogs/AutoChangeLog-pr-12397.yml deleted file mode 100644 index c6cc4a2fb22..00000000000 --- a/html/changelogs/AutoChangeLog-pr-12397.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "AzuleUtama" -delete-after: True -changes: - - bugfix: "Fixed misleading uplink description for chef's traitor knife." diff --git a/html/changelogs/AutoChangeLog-pr-12398.yml b/html/changelogs/AutoChangeLog-pr-12398.yml deleted file mode 100644 index 0da19f04d18..00000000000 --- a/html/changelogs/AutoChangeLog-pr-12398.yml +++ /dev/null @@ -1,9 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - tweak: "Slimes are a simple mob subtype" - - rscadd: "using a bloodlust slime potion on a docile slime removes the docility" - - rscadd: "using a docility potion on a rabid slime calms them down" - - tweak: "slime core removal surgery steps are now just scalpel->hemostat" - - rscadd: "Slimes have action buttons to feed on, evolve, or reproduce" - - bugfix: "Fixes beepsky arresting slimes (maybe it should be a feature....)" diff --git a/html/changelogs/AutoChangeLog-pr-12399.yml b/html/changelogs/AutoChangeLog-pr-12399.yml deleted file mode 100644 index 8013e14d834..00000000000 --- a/html/changelogs/AutoChangeLog-pr-12399.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Dave-TH" -delete-after: True -changes: - - bugfix: "Mob spawners will no longer sometimes send players to the void." diff --git a/html/changelogs/AutoChangeLog-pr-12400.yml b/html/changelogs/AutoChangeLog-pr-12400.yml deleted file mode 100644 index 993a116d9b9..00000000000 --- a/html/changelogs/AutoChangeLog-pr-12400.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Ionward" -delete-after: True -changes: - - bugfix: "Fixed Tajaran fat sprites, they are no longer duplicates of their slim torso." - - bugfix: "Fixed fat aqua jumpsuit only using one direction." - - bugfix: "Fixed missing Lasagna icon." diff --git a/html/changelogs/AutoChangeLog-pr-12401.yml b/html/changelogs/AutoChangeLog-pr-12401.yml deleted file mode 100644 index 8e9f4b6e26f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-12401.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "AzuleUtama" -delete-after: True -changes: - - tweak: "Reorganises products in seed vendor." - - bugfix: "Fixes Durathread mutating into more Durathread" diff --git a/html/changelogs/AutoChangeLog-pr-12402.yml b/html/changelogs/AutoChangeLog-pr-12402.yml deleted file mode 100644 index d6acda813a4..00000000000 --- a/html/changelogs/AutoChangeLog-pr-12402.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Dave-TH" -delete-after: True -changes: - - bugfix: "The ghosts inside possessed blades are now invincible and will not die to weird edge cases." diff --git a/html/changelogs/AutoChangeLog-pr-12409.yml b/html/changelogs/AutoChangeLog-pr-12409.yml deleted file mode 100644 index b4d9aedc449..00000000000 --- a/html/changelogs/AutoChangeLog-pr-12409.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - bugfix: "Fixes Seed Vault gene modder having limitations" diff --git a/html/changelogs/AutoChangeLog-pr-12410.yml b/html/changelogs/AutoChangeLog-pr-12410.yml deleted file mode 100644 index d86cfd1f155..00000000000 --- a/html/changelogs/AutoChangeLog-pr-12410.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fox McCloud" -delete-after: True -changes: - - bugfix: "Fixes not being able to extinguish some items" From 61a899b5d1ba1f2aed242af366ec60caf7218795 Mon Sep 17 00:00:00 2001 From: AzuleUtama <44248086+AzuleUtama@users.noreply.github.com> Date: Wed, 25 Sep 2019 18:18:50 +0100 Subject: [PATCH 35/57] Fixes improvised shotgun showing up as an ammo recipe --- code/modules/crafting/recipes.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm index 126e9f30b31..3863183b2af 100644 --- a/code/modules/crafting/recipes.dm +++ b/code/modules/crafting/recipes.dm @@ -246,7 +246,7 @@ tools = list(/obj/item/screwdriver) time = 100 category = CAT_WEAPONRY - subcategory = CAT_AMMO + subcategory = CAT_WEAPON /datum/crafting_recipe/chainsaw name = "Chainsaw" From 0bf421ae38cae5485f7046f7b513fd5f0ba1409b Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Wed, 25 Sep 2019 13:41:59 -0400 Subject: [PATCH 36/57] Automatic changelog generation for PR #12417 [ci skip] --- html/changelogs/AutoChangeLog-pr-12417.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12417.yml diff --git a/html/changelogs/AutoChangeLog-pr-12417.yml b/html/changelogs/AutoChangeLog-pr-12417.yml new file mode 100644 index 00000000000..65bc070f4a3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12417.yml @@ -0,0 +1,4 @@ +author: "AzuleUtama" +delete-after: True +changes: + - bugfix: "Improvised shotguns are now in the correct tab when trying to craft them." From 6bd0d0813af31660498afb0085d72e0d814382eb Mon Sep 17 00:00:00 2001 From: Mark van Alphen Date: Wed, 25 Sep 2019 20:47:16 -0600 Subject: [PATCH 37/57] Revert "Revert "Datumizes traitors and mindslaves"" (#12378) --- code/__DEFINES/role_preferences.dm | 1 + code/datums/mind.dm | 189 ++++---- .../game/gamemodes/autotraitor/autotraitor.dm | 22 +- code/game/gamemodes/objective.dm | 1 + code/game/gamemodes/traitor/traitor.dm | 321 +------------- code/game/machinery/cloning.dm | 2 - code/game/machinery/syndicatebeacon.dm | 23 +- .../objects/items/weapons/holy_weapons.dm | 1 + .../items/weapons/implants/implant_traitor.dm | 84 ++-- code/modules/admin/topic.dm | 56 +-- code/modules/admin/verbs/randomverbs.dm | 12 +- .../antagonists/traitor/datum_mindslave.dm | 52 +++ .../antagonists/traitor/datum_traitor.dm | 418 ++++++++++++++++++ code/modules/power/apc.dm | 2 +- paradise.dme | 2 + 15 files changed, 674 insertions(+), 512 deletions(-) create mode 100644 code/modules/antagonists/traitor/datum_mindslave.dm create mode 100644 code/modules/antagonists/traitor/datum_traitor.dm diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index 34ad4d69e54..5b93e570222 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -10,6 +10,7 @@ // justice if someone's abusing your role #define ROLE_SYNDICATE "Syndicate" #define ROLE_TRAITOR "traitor" +#define ROLE_MINDSLAVE "mindslave" #define ROLE_OPERATIVE "operative" #define ROLE_CHANGELING "changeling" #define ROLE_WIZARD "wizard" diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 84d5ab32b8a..1a6bc4eb1c7 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -132,11 +132,17 @@ var/output = "[current.real_name]'s Memories:
    " output += memory - if(objectives.len) + var/antag_datum_objectives = FALSE + for(var/datum/antagonist/A in antag_datums) + output += A.antag_memory + if(!antag_datum_objectives && LAZYLEN(A.objectives)) + antag_datum_objectives = TRUE + + if(LAZYLEN(objectives) || antag_datum_objectives) output += "
    Objectives:
    " output += gen_objective_text() - if(job_objectives.len) + if(LAZYLEN(job_objectives)) output += "
    Job Objectives:
      " var/obj_count = 1 @@ -152,8 +158,16 @@ /datum/mind/proc/gen_objective_text(admin = FALSE) . = "" var/obj_count = 1 + var/list/all_objectives = list() + for(var/datum/antagonist/A in antag_datums) + all_objectives |= A.objectives + + if(LAZYLEN(all_objectives)) + for(var/datum/objective/objective in all_objectives) + . += "
      Objective #[obj_count++]: [objective.explanation_text]" + for(var/datum/objective/objective in objectives) - . += "Objective #[obj_count]: [objective.explanation_text]" + . += "Objective #[obj_count++]: [objective.explanation_text]" if(admin) . += "
      Edit " // Edit . += "Delete " // Delete @@ -162,7 +176,6 @@ . += "Toggle Completion" . += "" . += "
      " - obj_count++ /datum/mind/proc/_memory_edit_header(gamemode, list/alt) . = gamemode @@ -327,14 +340,20 @@ /datum/mind/proc/memory_edit_traitor() . = _memory_edit_header("traitor", list("traitorchan", "traitorvamp")) - if(src in SSticker.mode.traitors) + if(has_antag_datum(/datum/antagonist/traitor)) . += "TRAITOR|no" if(objectives.len==0) - . += "
      Objectives are empty! Randomize!" + . += "
      Objectives are empty! Randomize!" else . += "traitor|NO" . += _memory_edit_role_enabled(ROLE_TRAITOR) + // Mindslave + . += "
      mindslaved: " + if(has_antag_datum(/datum/antagonist/mindslave)) + . += "MINDSLAVE|no" + else + . += "mindslave|NO" /datum/mind/proc/memory_edit_silicon() . = "Silicon: " @@ -352,7 +371,7 @@ /datum/mind/proc/memory_edit_uplink() . = "" if(ishuman(current) && ((src in SSticker.mode.head_revolutionaries) || \ - (src in SSticker.mode.traitors) || \ + (has_antag_datum(/datum/antagonist/traitor)) || \ (src in SSticker.mode.syndicates))) . = "Uplink: give" var/obj/item/uplink/hidden/suplink = find_syndicate_uplink() @@ -803,7 +822,8 @@ qdel(flash) take_uplink() var/fail = 0 - fail |= !SSticker.mode.equip_traitor(current, 1) + var/datum/antagonist/traitor/T = has_antag_datum(/datum/antagonist/traitor) + fail |= !T.equip_traitor(src) fail |= !SSticker.mode.equip_revolutionary(current) if(fail) to_chat(usr, "Reequipping revolutionary goes wrong!") @@ -1142,46 +1162,41 @@ else if(href_list["traitor"]) switch(href_list["traitor"]) if("clear") - if(src in SSticker.mode.traitors) - SSticker.mode.traitors -= src - special_role = null + if(has_antag_datum(/datum/antagonist/traitor)) to_chat(current, "You have been brainwashed! You are no longer a traitor!") + remove_antag_datum(/datum/antagonist/traitor) log_admin("[key_name(usr)] has de-traitored [key_name(current)]") message_admins("[key_name_admin(usr)] has de-traitored [key_name_admin(current)]") - if(isAI(current)) - var/mob/living/silicon/ai/A = current - A.set_zeroth_law("") - A.show_laws() - A.verbs -= /mob/living/silicon/ai/proc/choose_modules - A.malf_picker.remove_malf_verbs(A) - qdel(A.malf_picker) - SSticker.mode.update_traitor_icons_removed(src) - - + if("traitor") - if(!(src in SSticker.mode.traitors)) - SSticker.mode.traitors += src - var/datum/mindslaves/slaved = new() - slaved.masters += src - som = slaved //we MIGT want to mindslave someone - special_role = SPECIAL_ROLE_TRAITOR - to_chat(current, "You are a traitor!") + if(!(has_antag_datum(/datum/antagonist/traitor))) + var/datum/antagonist/traitor/T = new() + T.give_objectives = FALSE + T.should_equip = FALSE + add_antag_datum(T) log_admin("[key_name(usr)] has traitored [key_name(current)]") message_admins("[key_name_admin(usr)] has traitored [key_name_admin(current)]") - if(isAI(current)) - var/mob/living/silicon/ai/A = current - SSticker.mode.add_law_zero(A) - SEND_SOUND(current, 'sound/ambience/antag/malf.ogg') - else - SEND_SOUND(current, 'sound/ambience/antag/tatoralert.ogg') - SSticker.mode.update_traitor_icons_added(src) if("autoobjectives") - SSticker.mode.forge_traitor_objectives(src) + var/datum/antagonist/traitor/T = has_antag_datum(/datum/antagonist/traitor) + T.forge_traitor_objectives(src) to_chat(usr, "The objectives for traitor [key] have been generated. You can edit them and announce manually.") log_admin("[key_name(usr)] has automatically forged objectives for [key_name(current)]") message_admins("[key_name_admin(usr)] has automatically forged objectives for [key_name_admin(current)]") + else if(href_list["mindslave"]) + switch(href_list["mindslave"]) + if("clear") + if(has_antag_datum(/datum/antagonist/mindslave)) + var/mob/living/carbon/human/H = current + for(var/i in H.contents) + if(istype(i, /obj/item/implant/traitor)) + qdel(i) + break + remove_antag_datum(/datum/antagonist/mindslave) + log_admin("[key_name(usr)] has de-mindslaved [key_name(current)]") + message_admins("[key_name_admin(usr)] has de-mindslaved [key_name_admin(current)]") + else if(href_list["shadowling"]) switch(href_list["shadowling"]) if("clear") @@ -1251,17 +1266,20 @@ var/mob/living/silicon/robot/R = current if(istype(R)) R.emagged = 0 - if(R.activated(R.module.emag)) - R.module_active = null - if(R.module_state_1 == R.module.emag) - R.module_state_1 = null - R.contents -= R.module.emag - else if(R.module_state_2 == R.module.emag) - R.module_state_2 = null - R.contents -= R.module.emag - else if(R.module_state_3 == R.module.emag) - R.module_state_3 = null - R.contents -= R.module.emag + if(R.module) + if(R.activated(R.module.emag)) + R.module_active = null + if(R.module_state_1 == R.module.emag) + R.module_state_1 = null + R.contents -= R.module.emag + else if(R.module_state_2 == R.module.emag) + R.module_state_2 = null + R.contents -= R.module.emag + else if(R.module_state_3 == R.module.emag) + R.module_state_3 = null + R.contents -= R.module.emag + R.clear_supplied_laws() + R.laws = new /datum/ai_laws/crewsimov log_admin("[key_name(usr)] has un-emagged [key_name(current)]") message_admins("[key_name_admin(usr)] has un-emagged [key_name_admin(current)]") @@ -1282,6 +1300,8 @@ else if(R.module_state_3 == R.module.emag) R.module_state_3 = null R.contents -= R.module.emag + R.clear_supplied_laws() + R.laws = new /datum/ai_laws/crewsimov log_admin("[key_name(usr)] has unemagged [key_name(ai)]'s cyborgs") message_admins("[key_name_admin(usr)] has unemagged [key_name_admin(ai)]'s cyborgs") @@ -1300,7 +1320,8 @@ message_admins("[key_name_admin(usr)] has unequipped [key_name_admin(current)]") if("takeuplink") take_uplink() - memory = null//Remove any memory they may have had. + var/datum/antagonist/traitor/T = has_antag_datum(/datum/antagonist/traitor) + T.antag_memory = "" //Remove any antag memory they may have had (uplink codes, code phrases) log_admin("[key_name(usr)] has taken [key_name(current)]'s uplink") message_admins("[key_name_admin(usr)] has taken [key_name_admin(current)]'s uplink") if("crystals") @@ -1316,9 +1337,12 @@ log_admin("[key_name(usr)] has set [key_name(current)]'s telecrystals to [crystals]") message_admins("[key_name_admin(usr)] has set [key_name_admin(current)]'s telecrystals to [crystals]") if("uplink") - if(!SSticker.mode.equip_traitor(current, !(src in SSticker.mode.traitors))) - to_chat(usr, "Equipping a syndicate failed!") - return + if(has_antag_datum(/datum/antagonist/traitor)) + var/datum/antagonist/traitor/T = has_antag_datum(/datum/antagonist/traitor) + T.give_codewords() + if(!T.equip_traitor(src)) + to_chat(usr, "Equipping a syndicate failed!") + return log_admin("[key_name(usr)] has given [key_name(current)] an uplink") message_admins("[key_name_admin(usr)] has given [key_name_admin(current)] an uplink") @@ -1402,13 +1426,8 @@ qdel(H) /datum/mind/proc/make_Traitor() - if(!(src in SSticker.mode.traitors)) - SSticker.mode.traitors += src - special_role = SPECIAL_ROLE_TRAITOR - SSticker.mode.forge_traitor_objectives(src) - SSticker.mode.finalize_traitor(src) - SSticker.mode.greet_traitor(src) - SSticker.mode.update_traitor_icons_added(src) + if(!has_antag_datum(/datum/antagonist/traitor)) + add_antag_datum(/datum/antagonist/traitor) /datum/mind/proc/make_Nuke() if(!(src in SSticker.mode.syndicates)) @@ -1627,42 +1646,40 @@ if(G) G.reenter_corpse() + /datum/mind/proc/make_zealot(mob/living/carbon/human/missionary, convert_duration = 6000, team_color = "red") - if(!missionary || !istype(missionary)) //better provide a proper missionary or the rest of this is gonna break - return 0 zealot_master = missionary var/list/implanters - var/ref = "\ref[missionary.mind]" if(!(missionary.mind in SSticker.mode.implanter)) - SSticker.mode.implanter[ref] = list() - implanters = SSticker.mode.implanter[ref] + SSticker.mode.implanter[missionary.mind] = list() + implanters = SSticker.mode.implanter[missionary.mind] implanters.Add(src) SSticker.mode.implanted.Add(src) SSticker.mode.implanted[src] = missionary.mind - //ticker.mode.implanter[missionary.mind] += src - SSticker.mode.implanter[ref] = implanters + SSticker.mode.implanter[missionary.mind] = implanters SSticker.mode.traitors += src - special_role = "traitor" + + + var/datum/objective/protect/zealot_objective = new + zealot_objective.target = missionary.mind + zealot_objective.owner = src + zealot_objective.explanation_text = "Obey every order from and protect [missionary.real_name], the [missionary.mind.assigned_role == missionary.mind.special_role ? (missionary.mind.special_role) : (missionary.mind.assigned_role)]." + var/datum/antagonist/mindslave/S = new() + S.add_objective(zealot_objective) + add_antag_datum(S) + + var/datum/antagonist/traitor/T = missionary.mind.has_antag_datum(/datum/antagonist) + T.update_traitor_icons_added(missionary.mind) + to_chat(current, "You're now a loyal zealot of [missionary.name]! You now must lay down your life to protect [missionary.p_them()] and assist in [missionary.p_their()] goals at any cost.") - var/datum/objective/protect/mindslave/MS = new - MS.owner = src - MS.target = missionary.mind - MS.explanation_text = "Obey every order from and protect [missionary.real_name], the [missionary.mind.assigned_role == missionary.mind.special_role ? (missionary.mind.special_role) : (missionary.mind.assigned_role)]." - objectives += MS - for(var/datum/objective/objective in objectives) - to_chat(current, "Objective #1: [objective.explanation_text]") - SSticker.mode.update_traitor_icons_added(missionary.mind) - SSticker.mode.update_traitor_icons_added(src)//handles datahuds/observerhuds - - if(missionary.mind.som)//do not add if not a traitor..and you just picked up a robe and staff in the hall... - var/datum/mindslaves/slaved = missionary.mind.som - som = slaved - slaved.serv += current - slaved.add_serv_hud(missionary.mind, "master") //handles master servent icons - slaved.add_serv_hud(src, "mindslave") + var/datum/mindslaves/slaved = missionary.mind.som + som = slaved + slaved.serv += current + slaved.add_serv_hud(missionary.mind, "master") //handles master servent icons + slaved.add_serv_hud(src, "mindslave") var/obj/item/clothing/under/jumpsuit = null if(ishuman(current)) //only bother with the jumpsuit stuff if we are a human type, since we won't have the slot otherwise @@ -1679,7 +1696,7 @@ /datum/mind/proc/remove_zealot(obj/item/clothing/under/jumpsuit = null) if(!zealot_master) //if they aren't a zealot, we can't remove their zealot status, obviously. don't bother with the rest so we don't confuse them with the messages return - SSticker.mode.remove_traitor_mind(src) + remove_antag_datum(/datum/antagonist/mindslave) add_attack_logs(zealot_master, current, "Lost control of zealot") zealot_master = null @@ -1689,8 +1706,8 @@ var/mob/living/carbon/human/H = current H.update_inv_w_uniform(0,0) - to_chat(current, "You seem to have forgotten the events of the past 10 minutes or so, and your head aches a bit as if someone beat it savagely with a stick.") - to_chat(current, "This means you don't remember who you were working for or what you were doing.") + to_chat(current, "You seem to have forgotten the events of the past 10 minutes or so, and your head aches a bit as if someone beat it savagely with a stick.") + to_chat(current, "This means you don't remember who you were working for or what you were doing.") /datum/mind/proc/is_revivable() //Note, this ONLY checks the mind. if(damnation_type) @@ -1805,4 +1822,4 @@ /mob/living/simple_animal/construct/armoured/mind_initialize() ..() mind.assigned_role = "Juggernaut" - mind.special_role = SPECIAL_ROLE_CULTIST \ No newline at end of file + mind.special_role = SPECIAL_ROLE_CULTIST diff --git a/code/game/gamemodes/autotraitor/autotraitor.dm b/code/game/gamemodes/autotraitor/autotraitor.dm index 2137888d0b8..390c9ab37b5 100644 --- a/code/game/gamemodes/autotraitor/autotraitor.dm +++ b/code/game/gamemodes/autotraitor/autotraitor.dm @@ -128,28 +128,8 @@ var/mob/living/newtraitor = newtraitormind.current //message_admins("[newtraitor.real_name] is the new Traitor.") - forge_traitor_objectives(newtraitor.mind) - - if(istype(newtraitor, /mob/living/silicon)) - SEND_SOUND(newtraitor, 'sound/ambience/antag/malf.ogg') - add_law_zero(newtraitor) - else - SEND_SOUND(newtraitor, 'sound/ambience/antag/tatoralert.ogg') - equip_traitor(newtraitor) - - traitors += newtraitor.mind to_chat(newtraitor, "ATTENTION: It is time to pay your debt to the Syndicate...") - to_chat(newtraitor, "You are now a traitor.") - newtraitor.mind.special_role = SPECIAL_ROLE_TRAITOR - var/datum/atom_hud/antag/tatorhud = huds[ANTAG_HUD_TRAITOR] - tatorhud.join_hud(newtraitor) - set_antag_hud(newtraitor, "hudsyndicate") - - var/obj_count = 1 - to_chat(newtraitor, "Your current objectives:") - for(var/datum/objective/objective in newtraitor.mind.objectives) - to_chat(newtraitor, "Objective #[obj_count]: [objective.explanation_text]") - obj_count++ + newtraitor.mind.add_antag_datum(/datum/antagonist/traitor) //else //message_admins("No new traitor being added.") //else diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 8bdee684ae1..214c349978a 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -63,6 +63,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu explanation_text = "Assassinate [target.current.real_name], the [target.assigned_role]." else explanation_text = "Free Objective" + return target /datum/objective/assassinate/check_completion() if(target && target.current) diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index 408c5fa1de9..ae131286afd 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -16,9 +16,10 @@ required_enemies = 1 recommended_enemies = 4 + var/list/datum/mind/pre_traitors = list() var/traitors_possible = 4 //hard limit on traitors if scaling is turned off var/const/traitor_scaling_coeff = 5.0 //how much does the amount of players get divided by to determine traitors - + var/antag_datum = /datum/antagonist/traitor //what type of antag to create /datum/game_mode/traitor/announce() to_chat(world, "The current game mode is - Traitor!") @@ -47,158 +48,24 @@ if(!possible_traitors.len) break var/datum/mind/traitor = pick(possible_traitors) - traitors += traitor + pre_traitors += traitor traitor.special_role = SPECIAL_ROLE_TRAITOR - var/datum/mindslaves/slaved = new() - slaved.masters += traitor - traitor.som = slaved //we MIGT want to mindslave someone traitor.restricted_roles = restricted_jobs possible_traitors.Remove(traitor) - if(!traitors.len) + if(!pre_traitors.len) return 0 return 1 /datum/game_mode/traitor/post_setup() - for(var/datum/mind/traitor in traitors) - forge_traitor_objectives(traitor) - update_traitor_icons_added(traitor) - spawn(rand(10,100)) - finalize_traitor(traitor) - greet_traitor(traitor) - modePlayer += traitors + for(var/datum/mind/traitor in pre_traitors) + var/datum/antagonist/traitor/new_antag = new antag_datum() + addtimer(CALLBACK(traitor, /datum/mind.proc/add_antag_datum, new_antag), rand(10,100)) + if(!exchange_blue) + exchange_blue = -1 //Block latejoiners from getting exchange objectives ..() -/datum/game_mode/proc/forge_traitor_objectives(datum/mind/traitor) - if(istype(traitor.current, /mob/living/silicon)) - var/objective_count = 0 - - if(prob(30)) - var/special_pick = rand(1,2) - switch(special_pick) - if(1) - var/datum/objective/block/block_objective = new - block_objective.owner = traitor - traitor.objectives += block_objective - objective_count++ - if(2) //Protect and strand a target - var/datum/objective/protect/yandere_one = new - yandere_one.owner = traitor - traitor.objectives += yandere_one - yandere_one.find_target() - traitor.targets += yandere_one.target - objective_count++ - var/datum/objective/maroon/yandere_two = new - yandere_two.owner = traitor - yandere_two.target = yandere_one.target - traitor.objectives += yandere_two - objective_count++ - - for(var/i = objective_count, i < config.traitor_objectives_amount, i++) - var/datum/objective/assassinate/kill_objective = new - kill_objective.owner = traitor - kill_objective.find_target() - traitor.objectives += kill_objective - traitor.targets += kill_objective.target - - var/datum/objective/survive/survive_objective = new - survive_objective.owner = traitor - traitor.objectives += survive_objective - - else - var/is_hijacker = prob(10) - var/martyr_chance = prob(20) - var/objective_count = is_hijacker //Hijacking counts towards number of objectives - if(!exchange_blue && traitors.len >= 8) //Set up an exchange if there are enough traitors - if(!exchange_red) - exchange_red = traitor - else - exchange_blue = traitor - assign_exchange_role(exchange_red) - assign_exchange_role(exchange_blue) - var/list/active_ais = active_ais() - for(var/i = objective_count, i < config.traitor_objectives_amount, i++) - if(prob(50)) - if(active_ais.len && prob(100/GLOB.player_list.len)) - var/datum/objective/destroy/destroy_objective = new - destroy_objective.owner = traitor - destroy_objective.find_target() - traitor.objectives += destroy_objective - traitor.targets += destroy_objective.target - else if(prob(5)) - var/datum/objective/debrain/debrain_objective = new - debrain_objective.owner = traitor - debrain_objective.find_target() - traitor.objectives += debrain_objective - traitor.targets += debrain_objective.target - else if(prob(30)) - var/datum/objective/maroon/maroon_objective = new - maroon_objective.owner = traitor - maroon_objective.find_target() - traitor.objectives += maroon_objective - traitor.targets += maroon_objective.target - else - var/datum/objective/assassinate/kill_objective = new - kill_objective.owner = traitor - kill_objective.find_target() - traitor.objectives += kill_objective - traitor.targets += kill_objective.target - else - var/datum/objective/steal/steal_objective = new - steal_objective.owner = traitor - steal_objective.find_target() - traitor.objectives += steal_objective - traitor.targets += steal_objective.steal_target - - if(is_hijacker && objective_count <= config.traitor_objectives_amount) //Don't assign hijack if it would exceed the number of objectives set in config.traitor_objectives_amount - if(!(locate(/datum/objective/hijack) in traitor.objectives)) - var/datum/objective/hijack/hijack_objective = new - hijack_objective.owner = traitor - traitor.objectives += hijack_objective - return - - - var/martyr_compatibility = 1 //You can't succeed in stealing if you're dead. - for(var/datum/objective/O in traitor.objectives) - if(!O.martyr_compatible) - martyr_compatibility = 0 - break - - if(martyr_compatibility && martyr_chance) - var/datum/objective/die/martyr_objective = new - martyr_objective.owner = traitor - traitor.objectives += martyr_objective - return - - else - if(!(locate(/datum/objective/escape) in traitor.objectives)) - var/datum/objective/escape/escape_objective = new - escape_objective.owner = traitor - traitor.objectives += escape_objective - return - - -/datum/game_mode/proc/greet_traitor(var/datum/mind/traitor) - if(istype(traitor.current, /mob/living/silicon)) - SEND_SOUND(traitor.current, 'sound/ambience/antag/malf.ogg') - else - SEND_SOUND(traitor.current, 'sound/ambience/antag/tatoralert.ogg') - to_chat(traitor.current, "You are the traitor.") - var/obj_count = 1 - for(var/datum/objective/objective in traitor.objectives) - to_chat(traitor.current, "Objective #[obj_count]: [objective.explanation_text]") - obj_count++ - return - - -/datum/game_mode/proc/finalize_traitor(var/datum/mind/traitor) - if(istype(traitor.current, /mob/living/silicon)) - add_law_zero(traitor.current) - else - equip_traitor(traitor.current) - return - /datum/game_mode/traitor/declare_completion() ..() @@ -212,28 +79,6 @@ objective.check_completion() return 0 -/datum/game_mode/proc/give_codewords(mob/living/traitor_mob) - to_chat(traitor_mob, "The Syndicate provided you with the following information on how to identify their agents:") - to_chat(traitor_mob, "Code Phrase: [GLOB.syndicate_code_phrase]") - to_chat(traitor_mob, "Code Response: [GLOB.syndicate_code_response]") - - traitor_mob.mind.store_memory("Code Phrase: [GLOB.syndicate_code_phrase]") - traitor_mob.mind.store_memory("Code Response: [GLOB.syndicate_code_response]") - - to_chat(traitor_mob, "Use the code words in the order provided, during regular conversation, to identify other agents. Proceed with caution, however, as everyone is a potential foe.") - -/datum/game_mode/proc/add_law_zero(mob/living/silicon/ai/killer) - var/law = "Accomplish your objectives at all costs." - var/law_borg = "Accomplish your AI's objectives at all costs." - to_chat(killer, "Your laws have been changed!") - killer.set_zeroth_law(law, law_borg) - to_chat(killer, "New law: 0. [law]") - give_codewords(killer) - killer.set_syndie_radio() - to_chat(killer, "Your radio has been upgraded! Use :t to speak on an encrypted channel with Syndicate Agents!") - killer.verbs += /mob/living/silicon/ai/proc/choose_modules - killer.malf_picker = new /datum/module_picker - /datum/game_mode/proc/auto_declare_completion_traitor() if(traitors.len) @@ -292,149 +137,11 @@ text += "
      The [special_role_text] has failed!" feedback_add_details("traitor_success","FAIL") + var/phrases = jointext(GLOB.syndicate_code_phrase, ", ") + var/responses = jointext(GLOB.syndicate_code_response, ", ") + + text += "

      The code phrases were: [phrases]
      \ + The code responses were: [responses]

      " to_chat(world, text) return 1 - - -/datum/game_mode/proc/equip_traitor(mob/living/carbon/human/traitor_mob, var/safety = 0) - if(!istype(traitor_mob)) - return - . = 1 - if(traitor_mob.mind) - if(traitor_mob.mind.assigned_role == "Clown") - to_chat(traitor_mob, "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.") - traitor_mob.mutations.Remove(CLUMSY) - var/datum/action/innate/toggle_clumsy/A = new - A.Grant(traitor_mob) - - - // find a radio! toolbox(es), backpack, belt, headset - var/obj/item/R = locate(/obj/item/pda) in traitor_mob.contents //Hide the uplink in a PDA if available, otherwise radio - if(!R) - R = locate(/obj/item/radio) in traitor_mob.contents - - if(!R) - to_chat(traitor_mob, "Unfortunately, the Syndicate wasn't able to get you a radio.") - . = 0 - else - if(istype(R, /obj/item/radio)) - // generate list of radio freqs - var/obj/item/radio/target_radio = R - var/freq = PUBLIC_LOW_FREQ - var/list/freqlist = list() - while(freq <= PUBLIC_HIGH_FREQ) - if(freq < 1451 || freq > 1459) - freqlist += freq - freq += 2 - if((freq % 2) == 0) - freq += 1 - freq = freqlist[rand(1, freqlist.len)] - - var/obj/item/uplink/hidden/T = new(R) - target_radio.hidden_uplink = T - T.uplink_owner = "[traitor_mob.key]" - target_radio.traitor_frequency = freq - to_chat(traitor_mob, "The Syndicate have cunningly disguised a Syndicate Uplink as your [R.name] [T.loc]. Simply dial the frequency [format_frequency(freq)] to unlock its hidden features.") - traitor_mob.mind.store_memory("Radio Freq: [format_frequency(freq)] ([R.name] [T.loc]).") - else if(istype(R, /obj/item/pda)) - // generate a passcode if the uplink is hidden in a PDA - var/pda_pass = "[rand(100,999)] [pick("Alpha","Bravo","Delta","Omega")]" - - var/obj/item/uplink/hidden/T = new(R) - R.hidden_uplink = T - T.uplink_owner = "[traitor_mob.key]" - var/obj/item/pda/P = R - P.lock_code = pda_pass - - to_chat(traitor_mob, "The Syndicate have cunningly disguised a Syndicate Uplink as your [R.name] [T.loc]. Simply enter the code \"[pda_pass]\" into the ringtone select to unlock its hidden features.") - traitor_mob.mind.store_memory("Uplink Passcode: [pda_pass] ([R.name] [T.loc]).") - if(!safety)//If they are not a rev. Can be added on to. - give_codewords(traitor_mob) - -/datum/game_mode/proc/remove_traitor(datum/mind/traitor_mind) - if(traitor_mind in traitors) - SSticker.mode.traitors -= traitor_mind - traitor_mind.special_role = null - traitor_mind.current.create_attack_log("De-traitored") - if(issilicon(traitor_mind.current)) - to_chat(traitor_mind.current, "You have been turned into a robot! You are no longer a traitor.") - else - to_chat(traitor_mind.current, "You have been brainwashed! You are no longer a traitor.") - SSticker.mode.update_traitor_icons_removed(traitor_mind) - -/datum/game_mode/proc/update_traitor_icons_added(datum/mind/traitor_mind) - var/datum/atom_hud/antag/tatorhud = huds[ANTAG_HUD_TRAITOR] - tatorhud.join_hud(traitor_mind.current) - set_antag_hud(traitor_mind.current, "hudsyndicate") - -/datum/game_mode/proc/update_traitor_icons_removed(datum/mind/traitor_mind) - var/datum/atom_hud/antag/tatorhud = huds[ANTAG_HUD_TRAITOR] - tatorhud.leave_hud(traitor_mind.current) - set_antag_hud(traitor_mind.current, null) - - -/datum/game_mode/proc/remove_traitor_mind(datum/mind/traitor_mind, datum/mind/head) - if(traitor_mind in implanted) - //var/list/removal - var/ref = "\ref[head]" - if(ref in implanter) - implanter[ref] -= traitor_mind - implanted -= traitor_mind - traitors -= traitor_mind - if(traitor_mind.som) - var/datum/mindslaves/slaved = traitor_mind.som - slaved.serv -= traitor_mind - traitor_mind.special_role = null - traitor_mind.som = null - slaved.leave_serv_hud(traitor_mind) - for(var/datum/objective/protect/mindslave/MS in traitor_mind.objectives) - traitor_mind.objectives -= MS - - update_traitor_icons_removed(traitor_mind) - if(issilicon(traitor_mind.current)) - to_chat(traitor_mind.current, "You have been turned into a robot! You are no longer a mindslave.") - else - to_chat(traitor_mind.current, "You are no longer a mindslave: you have complete and free control of your own faculties, once more!") - -/datum/game_mode/proc/assign_exchange_role(var/datum/mind/owner) - //set faction - var/faction = "red" - if(owner == exchange_blue) - faction = "blue" - - //Assign objectives - var/datum/objective/steal/exchange/exchange_objective = new - exchange_objective.set_faction(faction,((faction == "red") ? exchange_blue : exchange_red)) - exchange_objective.owner = owner - owner.objectives += exchange_objective - - if(prob(20)) - var/datum/objective/steal/exchange/backstab/backstab_objective = new - backstab_objective.set_faction(faction) - backstab_objective.owner = owner - owner.objectives += backstab_objective - - //Spawn and equip documents - var/mob/living/carbon/human/mob = owner.current - - var/obj/item/folder/syndicate/folder - if(owner == exchange_red) - folder = new/obj/item/folder/syndicate/red(mob.locs) - else - folder = new/obj/item/folder/syndicate/blue(mob.locs) - - var/list/slots = list ( - "backpack" = slot_in_backpack, - "left pocket" = slot_l_store, - "right pocket" = slot_r_store, - "left hand" = slot_l_hand, - "right hand" = slot_r_hand, - ) - - var/where = "At your feet" - var/equipped_slot = mob.equip_in_one_of_slots(folder, slots) - if(equipped_slot) - where = "In your [equipped_slot]" - to_chat(mob, "

      [where] is a folder containing secret documents that another Syndicate group wants. We have set up a meeting with one of their agents on station to make an exchange. Exercise extreme caution as they cannot be trusted and may be hostile.
      ") - mob.update_icons() diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 1ce0bcd97e7..ca0eff0aa95 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -430,8 +430,6 @@ SSticker.mode.add_cultist(occupant.mind) SSticker.mode.update_cult_icons_added() //So the icon actually appears SSticker.mode.update_cult_comms_added(H.mind) //So the comms actually appears - if((H.mind in SSticker.mode.implanter) || (H.mind in SSticker.mode.implanted)) - SSticker.mode.update_traitor_icons_added(H.mind) //So the icon actually appears if(H.mind.vampire) H.mind.vampire.update_owner(H) if((H.mind in SSticker.mode.vampire_thralls) || (H.mind in SSticker.mode.vampire_enthralled)) diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm index 1a63371915b..ed12291c79b 100644 --- a/code/game/machinery/syndicatebeacon.dm +++ b/code/game/machinery/syndicatebeacon.dm @@ -57,9 +57,6 @@ return if(istype(M, /mob/living/carbon/human)) var/mob/living/carbon/human/N = M - SSticker.mode.equip_traitor(N) - SSticker.mode.traitors += N.mind - N.mind.special_role = SPECIAL_ROLE_TRAITOR var/objective = "Free Objective" switch(rand(1,100)) if(1 to 50) @@ -74,23 +71,17 @@ objective = "Kill all monkeys aboard the station." else objective = "Make certain at least 80% of the station evacuates on the shuttle." + var/datum/objective/custom_objective = new(objective) - custom_objective.owner = N.mind - N.mind.objectives += custom_objective - - var/datum/objective/escape/escape_objective = new - escape_objective.owner = N.mind - N.mind.objectives += escape_objective - - + var/datum/antagonist/traitor/T = new() + T.give_objectives = FALSE + T.add_objective(custom_objective) + T.add_objective(/datum/objective/escape) + N.mind.add_antag_datum(T) + to_chat(M, "You have joined the ranks of the Syndicate and become a traitor to the station!") - message_admins("[key_name_admin(N)] has accepted a traitor objective from a syndicate beacon.") - var/obj_count = 1 - for(var/datum/objective/OBJ in M.mind.objectives) - to_chat(M, "Objective #[obj_count]: [OBJ.explanation_text]") - obj_count++ src.add_fingerprint(usr) src.updateUsrDialog() diff --git a/code/game/objects/items/weapons/holy_weapons.dm b/code/game/objects/items/weapons/holy_weapons.dm index 0de138805f1..d496d7a9f01 100644 --- a/code/game/objects/items/weapons/holy_weapons.dm +++ b/code/game/objects/items/weapons/holy_weapons.dm @@ -619,6 +619,7 @@ /obj/item/nullrod/missionary_staff/proc/do_convert(mob/living/carbon/human/target, mob/living/carbon/human/missionary) var/convert_duration = 6000 //10 min + if(!target || !ishuman(target) || !missionary || !ishuman(missionary)) return if(ismindslave(target) || target.mind.zealot_master) //mindslaves and zealots override the staff because the staff is just a temporary mindslave diff --git a/code/game/objects/items/weapons/implants/implant_traitor.dm b/code/game/objects/items/weapons/implants/implant_traitor.dm index 16d8943567d..743488e4354 100644 --- a/code/game/objects/items/weapons/implants/implant_traitor.dm +++ b/code/game/objects/items/weapons/implants/implant_traitor.dm @@ -17,64 +17,65 @@ return dat /obj/item/implant/traitor/implant(mob/M, mob/user) + if(!M.mind) // If the target is catatonic or doesn't have a mind, don't let them use it + to_chat(user, "This person doesn't have a mind for you to slave!") + return 0 + if(!activated) //So you can't just keep taking it out and putting it back into other people. - var/mob/living/carbon/human/H = M - if(ismindslave(H)) - H.visible_message("[H] seems to resist the implant!", "You feel a strange sensation in your head that quickly dissipates.") + var/mob/living/carbon/human/mindslave_target = M + if(ismindslave(mindslave_target)) + mindslave_target.visible_message("[mindslave_target] seems to resist the implant!", "You feel a strange sensation in your head that quickly dissipates.") qdel(src) return -1 if(..()) var/list/implanters - var/ref = "\ref[user.mind]" - if(!ishuman(M)) + if(!ishuman(mindslave_target)) return 0 - if(!M.mind) + if(!mindslave_target.mind) return 0 - if(M == user) + if(mindslave_target == user) to_chat(user, "Making yourself loyal to yourself was a great idea! Perhaps even the best idea ever! Actually, you just feel like an idiot.") if(isliving(user)) var/mob/living/L = user L.adjustBrainLoss(20) - removed(M) + removed(mindslave_target) + qdel(src) + return -1 + if(ismindshielded(mindslave_target)) + mindslave_target.visible_message("[mindslave_target] seems to resist the implant!", "You feel a strange sensation in your head that quickly dissipates.") + removed(mindslave_target) qdel(src) return -1 - if(ismindshielded(H)) - H.visible_message("[H] seems to resist the implant!", "You feel a strange sensation in your head that quickly dissipates.") - removed(M) - qdel(src) - return -1 - H.implanting = 1 - to_chat(H, "You feel completely loyal to [user.name].") + + mindslave_target.implanting = 1 + to_chat(mindslave_target, "You feel completely loyal to [user.name].") if(!(user.mind in SSticker.mode.implanter)) - SSticker.mode.implanter[ref] = list() - implanters = SSticker.mode.implanter[ref] - implanters.Add(H.mind) - SSticker.mode.implanted.Add(H.mind) - SSticker.mode.implanted[H.mind] = user.mind - //SSticker.mode.implanter[user.mind] += H.mind - SSticker.mode.implanter[ref] = implanters - SSticker.mode.traitors += H.mind - H.mind.special_role = SPECIAL_ROLE_TRAITOR - to_chat(H, "You're now completely loyal to [user.name]! You now must lay down your life to protect [user.p_them()] and assist in [user.p_their()] goals at any cost.") + SSticker.mode.implanter[user.mind] = list() + implanters = SSticker.mode.implanter[user.mind] + implanters.Add(mindslave_target.mind) + SSticker.mode.implanted.Add(mindslave_target.mind) + SSticker.mode.implanted[mindslave_target.mind] = user.mind + SSticker.mode.implanter[user.mind] = implanters + SSticker.mode.traitors += mindslave_target.mind + + to_chat(mindslave_target, "You're now completely loyal to [user.name]! You now must lay down your life to protect [user.p_them()] and assist in [user.p_their()] goals at any cost.") + var/datum/objective/protect/mindslave/MS = new - MS.owner = H.mind + MS.owner = mindslave_target.mind MS.target = user.mind MS.explanation_text = "Obey every order from and protect [user.real_name], the [user.mind.assigned_role == user.mind.special_role ? (user.mind.special_role) : (user.mind.assigned_role)]." - H.mind.objectives += MS - for(var/datum/objective/objective in H.mind.objectives) - to_chat(H, "Objective #1: [objective.explanation_text]") + + var/datum/antagonist/mindslave/S = new() + S.add_objective(MS) + mindslave_target.mind.add_antag_datum(S) - SSticker.mode.update_traitor_icons_added(user.mind) - SSticker.mode.update_traitor_icons_added(H.mind)//handles datahuds/observerhuds + var/datum/mindslaves/slaved = user.mind.som + mindslave_target.mind.som = slaved + slaved.serv += mindslave_target + slaved.add_serv_hud(user.mind, "master") //handles master servent icons + slaved.add_serv_hud(mindslave_target.mind, "mindslave") - if(user.mind.som)//do not add if not a traitor..and you just picked up an implanter in the hall... - var/datum/mindslaves/slaved = user.mind.som - H.mind.som = slaved - slaved.serv += H - slaved.add_serv_hud(user.mind, "master") //handles master servent icons - slaved.add_serv_hud(H.mind, "mindslave") - - log_admin("[key_name(user)] has mind-slaved [key_name(H)].") + log_admin("[key_name(user)] has mind-slaved [key_name(mindslave_target)].") activated = 1 if(jobban_isbanned(M, ROLE_SYNDICATE)) SSticker.mode.replace_jobbanned_player(M, ROLE_SYNDICATE) @@ -83,6 +84,7 @@ /obj/item/implant/traitor/removed(mob/target) if(..()) - SSticker.mode.remove_traitor_mind(target.mind) + target.mind.remove_antag_datum(/datum/antagonist/mindslave) + to_chat(target, "You are no longer a mindslave: you have complete and free control of your own faculties, once more!") return 1 - return 0 \ No newline at end of file + return 0 diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index a6926fe3414..603873cc4fb 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1963,37 +1963,39 @@ usr.client.create_eventmob_for(H, 1) logmsg = "hunter." if("Crew Traitor") + if(!H.mind) + to_chat(usr, "This mob has no mind!") + return + var/list/possible_traitors = list() for(var/mob/living/player in GLOB.living_mob_list) - if(player.client && player.mind && !player.mind.special_role && player.stat != DEAD && player != H) - if(ishuman(player)) + if(player.client && player.mind && player.stat != DEAD && player != H) + if(ishuman(player) && !player.mind.special_role) if(player.client && (ROLE_TRAITOR in player.client.prefs.be_special) && !jobban_isbanned(player, ROLE_TRAITOR) && !jobban_isbanned(player, "Syndicate")) possible_traitors += player.mind + for(var/datum/mind/player in possible_traitors) if(player.current) if(ismindshielded(player.current)) possible_traitors -= player + if(possible_traitors.len) var/datum/mind/newtraitormind = pick(possible_traitors) - var/mob/living/newtraitor = newtraitormind.current - var/datum/objective/assassinate/kill_objective = new - kill_objective.owner = newtraitormind + var/datum/objective/assassinate/kill_objective = new() kill_objective.target = H.mind - kill_objective.explanation_text = "Assassinate [H.real_name], the [H.mind.assigned_role]." - newtraitormind.objectives += kill_objective - SSticker.mode.equip_traitor(newtraitor) - SSticker.mode.traitors |= newtraitor.mind - to_chat(newtraitor, "ATTENTION: It is time to pay your debt to the Syndicate...") - to_chat(newtraitor, "You are now a traitor.") - to_chat(newtraitor, "Goal: KILL [H.real_name], currently in [get_area(H.loc)]"); - newtraitor.mind.special_role = SPECIAL_ROLE_TRAITOR - var/datum/atom_hud/antag/tatorhud = huds[ANTAG_HUD_TRAITOR] - tatorhud.join_hud(newtraitor) - set_antag_hud(newtraitor, "hudsyndicate") + kill_objective.owner = newtraitormind + kill_objective.explanation_text = "Assassinate [H.mind], the [H.mind.assigned_role]" + var/datum/antagonist/traitor/T = new() + T.give_objectives = FALSE + T.add_objective(kill_objective) + to_chat(newtraitormind, "ATTENTION: It is time to pay your debt to the Syndicate...") + to_chat(newtraitormind, "Goal: KILL [H.real_name], currently in [get_area(H.loc)]") + newtraitormind.add_antag_datum(T) else to_chat(usr, "ERROR: Failed to create a traitor.") return logmsg = "crew traitor." + if("Floor Cluwne") var/turf/T = get_turf(M) var/mob/living/simple_animal/hostile/floor_cluwne/FC = new /mob/living/simple_animal/hostile/floor_cluwne(T) @@ -2687,28 +2689,16 @@ return feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","TA([objective])") + for(var/mob/living/carbon/human/H in GLOB.player_list) if(H.stat == 2 || !H.client || !H.mind) continue if(is_special_character(H)) continue //traitorize(H, objective, 0) - SSticker.mode.traitors += H.mind - H.mind.special_role = SPECIAL_ROLE_TRAITOR - var/datum/objective/new_objective = new - new_objective.owner = H - new_objective.explanation_text = objective - H.mind.objectives += new_objective - SSticker.mode.greet_traitor(H.mind) - //ticker.mode.forge_traitor_objectives(H.mind) - SSticker.mode.finalize_traitor(H.mind) + H.mind.add_antag_datum(/datum/antagonist/traitor) + for(var/mob/living/silicon/A in GLOB.player_list) - SSticker.mode.traitors += A.mind - A.mind.special_role = SPECIAL_ROLE_TRAITOR - var/datum/objective/new_objective = new - new_objective.owner = A - new_objective.explanation_text = objective - A.mind.objectives += new_objective - SSticker.mode.greet_traitor(A.mind) - SSticker.mode.finalize_traitor(A.mind) + A.mind.add_antag_datum(/datum/antagonist/traitor) + message_admins("[key_name_admin(usr)] used everyone is a traitor secret. Objective is [objective]", 1) log_admin("[key_name(usr)] used everyone is a traitor secret. Objective is [objective]") diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index aa22dfe944c..02e7dbd72cb 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -440,9 +440,11 @@ Traitors and the like can also be revived with the previous role mostly intact. //Now for special roles and equipment. switch(new_character.mind.special_role) if("traitor") - SSjobs.AssignRank(new_character, new_character.mind.assigned_role, 0) - SSjobs.EquipRank(new_character, new_character.mind.assigned_role, 1) - SSticker.mode.equip_traitor(new_character) + if(new_character.mind.has_antag_datum(/datum/antagonist/traitor)) + var/datum/antagonist/traitor/T = new_character.mind.has_antag_datum(/datum/antagonist/traitor) + T.equip_traitor(src) + else + new_character.mind.add_antag_datum(/datum/antagonist/traitor) if("Wizard") new_character.loc = pick(wizardstart) //ticker.mode.learn_basic_spells(new_character) @@ -462,13 +464,13 @@ Traitors and the like can also be revived with the previous role mostly intact. if("Cyborg")//More rigging to make em' work and check if they're traitor. new_character = new_character.Robotize() if(new_character.mind.special_role=="traitor") - call(/datum/game_mode/proc/add_law_zero)(new_character) + new_character.mind.add_antag_datum(/datum/antagonist/traitor) if("AI") new_character = new_character.AIize() var/mob/living/silicon/ai/ai_character = new_character ai_character.moveToAILandmark() if(new_character.mind.special_role=="traitor") - call(/datum/game_mode/proc/add_law_zero)(new_character) + new_character.mind.add_antag_datum(/datum/antagonist/traitor) //Add aliens. else SSjobs.AssignRank(new_character, new_character.mind.assigned_role, 0) diff --git a/code/modules/antagonists/traitor/datum_mindslave.dm b/code/modules/antagonists/traitor/datum_mindslave.dm new file mode 100644 index 00000000000..ae728b95773 --- /dev/null +++ b/code/modules/antagonists/traitor/datum_mindslave.dm @@ -0,0 +1,52 @@ + +// For Mindslaves and Zealots +/datum/antagonist/mindslave + name = "Mindslave" + roundend_category = "mindslaves" + job_rank = ROLE_MINDSLAVE + var/special_role = ROLE_MINDSLAVE + +/datum/antagonist/mindslave/on_gain() + // Handling mindslave objectives on top of other antag objective sucks, so Im just gonna do it like this + to_chat(owner.current, "New Objective: [objectives[objectives.len].explanation_text]") + update_mindslave_icons_added() + +/datum/antagonist/mindslave/on_removal() + if(owner.som) + var/datum/mindslaves/slaved = owner.som + slaved.serv -= owner + slaved.leave_serv_hud(owner) + antag_memory = "" + owner.special_role = null + update_mindslave_icons_removed() + ..() + +/datum/antagonist/mindslave/apply_innate_effects() + . = ..() + if(owner.assigned_role == "Clown") + var/mob/living/carbon/human/slave_mob = owner.current + if(slave_mob && istype(slave_mob)) + to_chat(slave_mob, "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.") + slave_mob.mutations.Remove(CLUMSY) + +/datum/antagonist/mindslave/remove_innate_effects() + . = ..() + if(owner.assigned_role == "Clown") + var/mob/living/carbon/human/slave_mob = owner.current + if(slave_mob && istype(slave_mob)) + slave_mob.mutations.Add(CLUMSY) + +/datum/antagonist/mindslave/proc/add_objective(datum/objective/O) + objectives += O + +/datum/antagonist/mindslave/proc/remove_objective(datum/objective/O) + objectives -= O + +/datum/antagonist/mindslave/proc/update_mindslave_icons_added() + var/datum/atom_hud/antag/traitorhud = huds[ANTAG_HUD_TRAITOR] + traitorhud.join_hud(owner.current, null) + set_antag_hud(owner.current, "hudmindslave") + +/datum/antagonist/mindslave/proc/update_mindslave_icons_removed() + var/datum/atom_hud/antag/traitorhud = huds[ANTAG_HUD_TRAITOR] + traitorhud.leave_hud(owner.current, null) diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm new file mode 100644 index 00000000000..4e9a5ad4bf7 --- /dev/null +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -0,0 +1,418 @@ +#define TRAITOR_HUMAN "human" +#define TRAITOR_AI "AI" + +// For "Actual traitors" +/datum/antagonist/traitor + name = "Traitor" + roundend_category = "traitors" + job_rank = ROLE_TRAITOR + var/special_role = ROLE_TRAITOR + var/give_objectives = TRUE + var/should_give_codewords = TRUE + var/should_equip = TRUE + var/traitor_kind = TRAITOR_HUMAN + var/list/assigned_targets = list() // This includes assassinate as well as steal objectives. prevents duplicate objectives + + +/datum/antagonist/traitor/on_gain() + if(owner.current && isAI(owner.current)) + traitor_kind = TRAITOR_AI + + var/datum/mindslaves/slaved = new() + slaved.masters += owner + owner.som = slaved //we MIGHT want to mindslave someone + SSticker.mode.traitors += owner + owner.special_role = special_role + + if(give_objectives) + forge_traitor_objectives() + if(!silent) + greet() + update_traitor_icons_added() + finalize_traitor() + + +/datum/antagonist/traitor/on_removal() + //Remove malf powers. + if(traitor_kind == TRAITOR_AI && owner.current && isAI(owner.current)) + var/mob/living/silicon/ai/A = owner.current + A.clear_zeroth_law() + A.common_radio.channels.Remove("Syndicate") // De-traitored AIs can still state laws over the syndicate channel without this + A.laws.sorted_laws = A.laws.inherent_laws.Copy() // AI's 'notify laws' button will still state a law 0 because sorted_laws contains it + A.show_laws() + A.malf_picker.remove_malf_verbs(A) + A.verbs -= /mob/living/silicon/ai/proc/choose_modules + qdel(A.malf_picker) + + if(owner.som) + var/datum/mindslaves/slaved = owner.som + slaved.masters -= owner + slaved.serv -= owner + owner.som = null + slaved.leave_serv_hud(owner) + + assigned_targets.Cut() + SSticker.mode.traitors -= owner + owner.special_role = null + update_traitor_icons_removed() + + if(!silent && owner.current) + antag_memory = "" + to_chat(owner.current," You are no longer a [special_role]! ") + ..() + + +/datum/antagonist/traitor/apply_innate_effects() + . = ..() + if(owner.assigned_role == "Clown") + var/mob/living/carbon/human/traitor_mob = owner.current + if(traitor_mob && istype(traitor_mob)) + to_chat(traitor_mob, "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.") + traitor_mob.mutations.Remove(CLUMSY) + + +/datum/antagonist/traitor/remove_innate_effects() + . = ..() + if(owner.assigned_role == "Clown") + var/mob/living/carbon/human/traitor_mob = owner.current + if(traitor_mob && istype(traitor_mob)) + traitor_mob.mutations.Add(CLUMSY) + +// Adding/removing objectives in the owner's mind until we can datumize all antags. Then we can use the /datum/antagonist/objectives var to handle them +// Change "owner.objectives" to "objectives" once objectives are handled in antag datums instead of the mind +/datum/antagonist/traitor/proc/add_objective(datum/objective/O) + owner.objectives += O + +/datum/antagonist/traitor/proc/remove_objective(datum/objective/O) + owner.objectives -= O + + +/datum/antagonist/traitor/proc/forge_traitor_objectives() + switch(traitor_kind) + if(TRAITOR_AI) + forge_ai_objectives() + else + forge_human_objectives() + + +/datum/antagonist/traitor/proc/forge_human_objectives() + var/is_hijacker = prob(10) + var/martyr_chance = prob(20) + var/objective_count = is_hijacker //Hijacking counts towards number of objectives + if(!SSticker.mode.exchange_blue && SSticker.mode.traitors.len >= 8) //Set up an exchange if there are enough traitors + if(!SSticker.mode.exchange_red) + SSticker.mode.exchange_red = owner + else + SSticker.mode.exchange_blue = owner + assign_exchange_role(SSticker.mode.exchange_red) + assign_exchange_role(SSticker.mode.exchange_blue) + objective_count += 1 //Exchange counts towards number of objectives + + + var/objective_amount = config.traitor_objectives_amount + + if(is_hijacker && objective_count <= objective_amount) //Don't assign hijack if it would exceed the number of objectives set in config.traitor_objectives_amount + if (!(locate(/datum/objective/hijack) in objectives)) + var/datum/objective/hijack/hijack_objective = new + hijack_objective.owner = owner + add_objective(hijack_objective) + return + + for(var/i = objective_count, i < objective_amount) + i += forge_single_objective() + + var/martyr_compatibility = 1 //You can't succeed in stealing if you're dead. + for(var/datum/objective/O in owner.objectives) + if(!O.martyr_compatible) + martyr_compatibility = 0 + break + + if(martyr_compatibility && martyr_chance) + var/datum/objective/die/martyr_objective = new + martyr_objective.owner = owner + add_objective(martyr_objective) + return + + if(!(locate(/datum/objective/escape) in objectives)) + var/datum/objective/escape/escape_objective = new + escape_objective.owner = owner + add_objective(escape_objective) + return + + +/datum/antagonist/traitor/proc/forge_ai_objectives() + var/objective_count = 0 + var/try_again = TRUE + + if(prob(30)) + objective_count += forge_single_objective() + + for(var/i = objective_count, i < config.traitor_objectives_amount) + var/datum/objective/assassinate/kill_objective = new + kill_objective.owner = owner + kill_objective.find_target() + if("[kill_objective.target]" in assigned_targets) // In the rare case the game can't find a target for the AI thats not a duplicate + if(try_again) // It will attempt to location another target ONCE + try_again = FALSE // This code will really only come into play on lowpop rounds where getting duplicate targets is more common + continue + assigned_targets.Add("[kill_objective.target]") + add_objective(kill_objective) + i += 1 + var/datum/objective/survive/survive_objective = new + survive_objective.owner = owner + add_objective(survive_objective) + + +/datum/antagonist/traitor/proc/forge_single_objective() + switch(traitor_kind) + if(TRAITOR_AI) + return forge_single_AI_objective() + else + return forge_single_human_objective() + + +/datum/antagonist/traitor/proc/forge_single_human_objective() // Returns how many objectives are added + . = 1 + if(prob(50)) + var/list/active_ais = active_ais() + if(active_ais.len && prob(100/GLOB.player_list.len)) + var/datum/objective/destroy/destroy_objective = new + destroy_objective.owner = owner + destroy_objective.find_target() + if("[destroy_objective]" in assigned_targets) // Is this target already in their list of assigned targets? If so, don't add this objective and return + return 0 + else if(destroy_objective.target) // Is the target a real one and not null? If so, add it to our list of targets to avoid duplicate targets + assigned_targets.Add("[destroy_objective.target]") // This logic is applied to all traitor objectives including steal objectives + add_objective(destroy_objective) + + else if(prob(5)) + var/datum/objective/debrain/debrain_objective = new + debrain_objective.owner = owner + debrain_objective.find_target() + if("[debrain_objective]" in assigned_targets) + return 0 + else if(debrain_objective.target) + assigned_targets.Add("[debrain_objective.target]") + add_objective(debrain_objective) + + else if(prob(30)) + var/datum/objective/maroon/maroon_objective = new + maroon_objective.owner = owner + maroon_objective.find_target() + if("[maroon_objective]" in assigned_targets) + return 0 + else if(maroon_objective.target) + assigned_targets.Add("[maroon_objective.target]") + add_objective(maroon_objective) + + else + var/datum/objective/assassinate/kill_objective = new + kill_objective.owner = owner + kill_objective.find_target() + if("[kill_objective.target]" in assigned_targets) + return 0 + else if(kill_objective.target) + assigned_targets.Add("[kill_objective.target]") + add_objective(kill_objective) + + else + var/datum/objective/steal/steal_objective = new + steal_objective.owner = owner + steal_objective.find_target() + if("[steal_objective.steal_target]" in assigned_targets) + return 0 + else if(steal_objective.steal_target) + assigned_targets.Add("[steal_objective.steal_target]") + add_objective(steal_objective) + + +/datum/antagonist/traitor/proc/forge_single_AI_objective() + . = 1 + var/special_pick = rand(1,2) + switch(special_pick) + if(1) // AI hijack + var/datum/objective/block/block_objective = new + block_objective.owner = owner + add_objective(block_objective) + if(2) // Protect and strand a target + var/datum/objective/protect/yandere_one = new + yandere_one.owner = owner + yandere_one.find_target() + + if("[yandere_one.target]" in assigned_targets) + return 0 + else if(yandere_one.target) + assigned_targets.Add("[yandere_one.target]") + + add_objective(yandere_one) + var/datum/objective/maroon/yandere_two = new + yandere_two.owner = owner + yandere_two.target = yandere_one.target + yandere_two.explanation_text = "Prevent [yandere_one.target], the [yandere_one.target.assigned_role] from escaping alive." + add_objective(yandere_two) + + +/datum/antagonist/traitor/greet() + to_chat(owner.current, "You are a [owner.special_role]!") + if(!LAZYLEN(owner.objectives)) // Remove "owner" when objectives are handled in the datum + to_chat(owner.current, "You don't have any objectives right now.") + else + owner.announce_objectives() + if(should_give_codewords) + give_codewords() + + +/datum/antagonist/traitor/proc/update_traitor_icons_added(datum/mind/traitor_mind) + var/datum/atom_hud/antag/traitorhud = huds[ANTAG_HUD_TRAITOR] + traitorhud.join_hud(owner.current, null) + set_antag_hud(owner.current, "hudsyndicate") + + +/datum/antagonist/traitor/proc/update_traitor_icons_removed(datum/mind/traitor_mind) + var/datum/atom_hud/antag/traitorhud = huds[ANTAG_HUD_TRAITOR] + traitorhud.leave_hud(owner.current, null) + set_antag_hud(owner.current, null) + + +/datum/antagonist/traitor/proc/finalize_traitor() + switch(traitor_kind) + if(TRAITOR_AI) + add_law_zero() + owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/malf.ogg', 100, FALSE, pressure_affected = FALSE) + var/mob/living/silicon/ai/A = owner.current + A.show_laws() + if(TRAITOR_HUMAN) + if(should_equip) + equip_traitor() + owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/tatoralert.ogg', 100, FALSE, pressure_affected = FALSE) + + +/datum/antagonist/traitor/proc/give_codewords() + if(!owner.current) + return + var/mob/traitor_mob = owner.current + + var/phrases = jointext(GLOB.syndicate_code_phrase, ", ") + var/responses = jointext(GLOB.syndicate_code_response, ", ") + + to_chat(traitor_mob, "The Syndicate have provided you with the following codewords to identify fellow agents:") + to_chat(traitor_mob, "Code Phrase: [phrases]") + to_chat(traitor_mob, "Code Response: [responses]") + + antag_memory += "Code Phrase: [phrases]
      " + antag_memory += "Code Response: [responses]
      " + + to_chat(traitor_mob, "Use the codewords during regular conversation to identify other agents. Proceed with caution, however, as everyone is a potential foe.") + + +/datum/antagonist/traitor/proc/add_law_zero() + var/mob/living/silicon/ai/killer = owner.current + if(!killer || !istype(killer)) + return + var/law = "Accomplish your objectives at all costs." + var/law_borg = "Accomplish your AI's objectives at all costs." + killer.set_zeroth_law(law, law_borg) + killer.set_syndie_radio() + to_chat(killer, "Your radio has been upgraded! Use :t to speak on an encrypted channel with Syndicate Agents!") + killer.add_malf_picker() + + +/datum/antagonist/traitor/proc/equip_traitor() + + if(traitor_kind == TRAITOR_HUMAN) + var/mob/living/carbon/human/traitor_mob = owner.current + + // find a radio! toolbox(es), backpack, belt, headset + var/obj/item/R = locate(/obj/item/pda) in traitor_mob.contents //Hide the uplink in a PDA if available, otherwise radio + if(!R) + R = locate(/obj/item/radio) in traitor_mob.contents + + if(!R) + to_chat(traitor_mob, "Unfortunately, the Syndicate wasn't able to get you a radio.") + . = 0 + else + if(istype(R, /obj/item/radio)) + // generate list of radio freqs + var/obj/item/radio/target_radio = R + var/freq = PUBLIC_LOW_FREQ + var/list/freqlist = list() + while(freq <= PUBLIC_HIGH_FREQ) + if(freq < 1451 || freq > 1459) + freqlist += freq + freq += 2 + if((freq % 2) == 0) + freq += 1 + freq = freqlist[rand(1, freqlist.len)] + + var/obj/item/uplink/hidden/T = new(R) + target_radio.hidden_uplink = T + T.uplink_owner = "[traitor_mob.key]" + target_radio.traitor_frequency = freq + to_chat(traitor_mob, "The Syndicate have cunningly disguised a Syndicate Uplink as your [R.name]. Simply dial the frequency [format_frequency(freq)] to unlock its hidden features.") + traitor_mob.mind.store_memory("Radio Freq: [format_frequency(freq)] ([R.name]).") + else if(istype(R, /obj/item/pda)) + // generate a passcode if the uplink is hidden in a PDA + var/pda_pass = "[rand(100,999)] [pick("Alpha","Bravo","Delta","Omega")]" + + var/obj/item/uplink/hidden/T = new(R) + R.hidden_uplink = T + T.uplink_owner = "[traitor_mob.key]" + var/obj/item/pda/P = R + P.lock_code = pda_pass + + to_chat(traitor_mob, "The Syndicate have cunningly disguised a Syndicate Uplink as your [R.name]. Simply enter the code \"[pda_pass]\" into the ringtone select to unlock its hidden features.") + antag_memory += ("Uplink Passcode: [pda_pass] ([R.name].") + return 1 + + +/datum/antagonist/traitor/proc/assign_exchange_role(var/datum/mind/owner) + //set faction + var/faction = "red" + if(owner == SSticker.mode.exchange_blue) + faction = "blue" + + //Assign objectives + var/datum/objective/steal/exchange/exchange_objective = new + exchange_objective.set_faction(faction,((faction == "red") ? SSticker.mode.exchange_blue : SSticker.mode.exchange_red)) + exchange_objective.owner = owner + owner.objectives += exchange_objective + + if(prob(20)) + var/datum/objective/steal/exchange/backstab/backstab_objective = new + backstab_objective.set_faction(faction) + backstab_objective.owner = owner + owner.objectives += backstab_objective + + //Spawn and equip documents + var/mob/living/carbon/human/mob = owner.current + + var/obj/item/folder/syndicate/folder + if(owner == SSticker.mode.exchange_red) + folder = new/obj/item/folder/syndicate/red(mob.locs) + else + folder = new/obj/item/folder/syndicate/blue(mob.locs) + + var/list/slots = list ( + "backpack" = slot_in_backpack, + "left pocket" = slot_l_store, + "right pocket" = slot_r_store, + "left hand" = slot_l_hand, + "right hand" = slot_r_hand, + ) + + var/where = "At your feet" + var/equipped_slot = mob.equip_in_one_of_slots(folder, slots) + if(equipped_slot) + where = "In your [equipped_slot]" + to_chat(mob, "

      [where] is a folder containing secret documents that another Syndicate group wants. We have set up a meeting with one of their agents on station to make an exchange. Exercise extreme caution as they cannot be trusted and may be hostile.
      ") + mob.update_icons() + + +/datum/antagonist/traitor/roundend_report_footer() + var/phrases = jointext(GLOB.syndicate_code_phrase, ", ") + var/responses = jointext(GLOB.syndicate_code_response, ", ") + + var message = "
      The code phrases were: [phrases]
      \ + The code responses were: [responses]
      " + + return message diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 7b3162fdefb..2942ace8ee2 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -740,7 +740,7 @@ /obj/machinery/power/apc/proc/get_malf_status(mob/living/silicon/ai/malf) - if(istype(malf) && malf.malf_picker) + if(istype(malf) && malf.mind.has_antag_datum(/datum/antagonist/traitor)) if(malfai == (malf.parent || malf)) if(occupier == malf) return 3 // 3 = User is shunted in this APC diff --git a/paradise.dme b/paradise.dme index 70d97ffd787..55c92017702 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1237,6 +1237,8 @@ #include "code\modules\antagonists\_common\antag_spawner.dm" #include "code\modules\antagonists\_common\antag_team.dm" #include "code\modules\antagonists\survivalist\survivalist.dm" +#include "code\modules\antagonists\traitor\datum_mindslave.dm" +#include "code\modules\antagonists\traitor\datum_traitor.dm" #include "code\modules\antagonists\wishgranter\wishgranter.dm" #include "code\modules\arcade\arcade_base.dm" #include "code\modules\arcade\arcade_prize.dm" From 92db0fd32b8770d335c658d28ee3abe05941cf9a Mon Sep 17 00:00:00 2001 From: Kyep <16434066+Kyep@users.noreply.github.com> Date: Thu, 26 Sep 2019 04:37:04 +0000 Subject: [PATCH 38/57] Fixes space syndis being unable to navigate space (#12405) --- code/game/machinery/doors/airlock.dm | 4 ++-- .../living/simple_animal/hostile/syndicate.dm | 16 +++++++++++----- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 1284a9a485c..a80209dea65 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1191,8 +1191,8 @@ About the new airlock wires panel: return 1 /obj/machinery/door/airlock/CanAStarPass(obj/item/card/id/ID) -//Airlock is passable if it is open (!density), bot has access, and is not bolted shut) - return !density || (check_access(ID) && !locked && arePowerSystemsOn()) +//Airlock is passable if it is open (!density), bot has access, and is not bolted or welded shut) + return !density || (check_access(ID) && !locked && !welded && arePowerSystemsOn()) /obj/machinery/door/airlock/emag_act(mob/user) if(!operating && density && arePowerSystemsOn() && !emagged) diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index c9a0414fdf5..02d5ee5d14b 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -116,7 +116,9 @@ /mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/Aggro() . = ..() - if(target && istype(depotarea)) + if(!istype(depotarea)) + return + if(target) if(!seen_enemy) seen_enemy = TRUE if(!ranged) @@ -148,11 +150,13 @@ /mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/handle_automated_movement() . = ..() + if(!istype(depotarea)) + return if(seen_enemy) aggro_cycles++ if(alert_on_timeout && !raised_alert && aggro_cycles >= 60) raise_alert("[name] has reported contact with hostile entity: [seen_enemy_name]") - if(scan_cycles >= 15 && istype(depotarea)) + if(scan_cycles >= 15) scan_cycles = 0 if(!atoms_share_level(src, spawn_turf)) if(istype(loc, /obj/structure/closet)) @@ -187,6 +191,8 @@ depotarea.increase_alert(reason) /mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/death() + if(!istype(depotarea)) + return ..() if(alert_on_death) if(seen_enemy_name) raise_alert("[name] has died in combat with [seen_enemy_name].") @@ -288,7 +294,7 @@ alert_on_spacing = FALSE /mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/space/Process_Spacemove(var/movement_dir = 0) - return + return TRUE @@ -302,7 +308,7 @@ loot = list(/obj/effect/mob_spawn/human/corpse/syndicatecommando, /obj/item/melee/energy/sword/saber/red, /obj/item/shield/energy) /mob/living/simple_animal/hostile/syndicate/melee/space/Process_Spacemove(var/movement_dir = 0) - return + return TRUE /mob/living/simple_animal/hostile/syndicate/ranged @@ -326,7 +332,7 @@ loot = list(/obj/effect/mob_spawn/human/corpse/syndicatecommando, /obj/item/gun/projectile/automatic/c20r) /mob/living/simple_animal/hostile/syndicate/ranged/space/Process_Spacemove(var/movement_dir = 0) - return + return TRUE /mob/living/simple_animal/hostile/syndicate/ranged/space/autogib loot = list()//gonna gibe, no loot. From 40a4cd1b75a3be9395829bf2bb054eac700d473c Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 26 Sep 2019 00:37:06 -0400 Subject: [PATCH 39/57] Automatic changelog generation for PR #12405 [ci skip] --- html/changelogs/AutoChangeLog-pr-12405.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12405.yml diff --git a/html/changelogs/AutoChangeLog-pr-12405.yml b/html/changelogs/AutoChangeLog-pr-12405.yml new file mode 100644 index 00000000000..8a6b5355f41 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12405.yml @@ -0,0 +1,6 @@ +author: "Kyep" +delete-after: True +changes: + - bugfix: "Fixed NPC redsuited syndicates from being unable to move in space." + - bugfix: "Fixed NPC bots thinking that they can path through airlocks which are welded shut. +refactor: Refactors some safety checks so that its impossible for depot mobs to generate runtimes in rare cases (e.g: admins spawning them outside the depot for testing)" From 0e8ddb2afea063b5d26a0ca800c1aea927a6db26 Mon Sep 17 00:00:00 2001 From: farie82 Date: Thu, 26 Sep 2019 07:05:01 +0200 Subject: [PATCH 40/57] Refactors the examine proc to return a list of strings (#12280) --- .../components/unary_devices/vent_pump.dm | 4 +- .../components/unary_devices/vent_scrubber.dm | 4 +- code/__DEFINES/components.dm | 2 +- code/datums/components/decal.dm | 4 +- code/datums/components/ducttape.dm | 4 +- code/datums/components/material_container.dm | 4 +- code/game/atoms.dm | 23 +++++------ code/game/gamemodes/blob/theblob.dm | 4 +- code/game/gamemodes/cult/cult_items.dm | 4 +- code/game/gamemodes/cult/cult_structures.dm | 4 +- code/game/gamemodes/cult/ritual.dm | 8 ++-- code/game/gamemodes/cult/runes.dm | 18 ++++----- code/game/gamemodes/cult/talisman.dm | 9 +++-- .../gamemodes/devil/true_devil/_true_devil.dm | 2 +- .../miniantags/abduction/abduction_gear.dm | 10 ++--- .../gamemodes/miniantags/guardian/guardian.dm | 2 +- .../miniantags/guardian/types/bomb.dm | 6 +-- code/game/gamemodes/miniantags/morph/morph.dm | 19 ++++------ .../gamemodes/miniantags/revenant/revenant.dm | 6 +-- code/game/gamemodes/nuclear/pinpointer.dm | 21 ++++------ code/game/gamemodes/wizard/soulstone.dm | 14 +++---- code/game/machinery/alarm.dm | 6 +-- code/game/machinery/atmoalter/meter.dm | 2 +- .../atmoalter/portable_atmospherics.dm | 4 +- code/game/machinery/cell_charger.dm | 6 +-- code/game/machinery/chiller.dm | 8 ++-- code/game/machinery/cloning.dm | 10 ++--- code/game/machinery/computer/arcade.dm | 13 +++---- .../game/machinery/computer/buildandrepair.dm | 4 +- code/game/machinery/defib_mount.dm | 10 ++--- code/game/machinery/deployable.dm | 2 +- code/game/machinery/doors/airlock.dm | 28 +++++++------- code/game/machinery/doors/firedoor.dm | 22 +++++------ code/game/machinery/doors/windowdoor.dm | 4 +- code/game/machinery/guestpass.dm | 12 +++--- code/game/machinery/hologram.dm | 5 ++- code/game/machinery/iv_drip.dm | 4 +- code/game/machinery/lightswitch.dm | 4 +- code/game/machinery/machinery.dm | 18 ++++----- code/game/machinery/recharger.dm | 14 +++---- code/game/machinery/recycler.dm | 8 ++-- code/game/machinery/snow_machine.dm | 4 +- code/game/machinery/spaceheater.dm | 8 ++-- code/game/machinery/status_display.dm | 4 +- code/game/machinery/syndicatebomb.dm | 4 +- code/game/mecha/mecha.dm | 16 ++++---- .../effects/decals/Cleanable/humans.dm | 4 +- code/game/objects/effects/glowshroom.dm | 2 +- code/game/objects/items.dm | 6 +-- .../objects/items/devices/lightreplacer.dm | 4 +- .../objects/items/devices/pipe_painter.dm | 4 +- .../objects/items/devices/radio/headset.dm | 11 +++--- .../game/objects/items/devices/radio/radio.dm | 11 +++--- code/game/objects/items/devices/scanners.dm | 4 +- .../objects/items/devices/taperecorder.dm | 5 ++- .../objects/items/devices/traitordevices.dm | 6 +-- code/game/objects/items/stacks/stack.dm | 9 +++-- code/game/objects/items/toys.dm | 11 +++--- code/game/objects/items/weapons/RCD.dm | 4 +- code/game/objects/items/weapons/RCL.dm | 4 +- .../objects/items/weapons/bee_briefcase.dm | 6 +-- code/game/objects/items/weapons/cards_ids.dm | 18 ++++----- code/game/objects/items/weapons/defib.dm | 4 +- .../objects/items/weapons/extinguisher.dm | 2 +- .../objects/items/weapons/flamethrower.dm | 4 +- .../items/weapons/grenades/chem_grenade.dm | 2 +- .../items/weapons/grenades/ghettobomb.dm | 4 +- .../objects/items/weapons/grenades/grenade.dm | 6 +-- .../objects/items/weapons/holy_weapons.dm | 2 +- .../objects/items/weapons/melee/energy.dm | 6 +-- code/game/objects/items/weapons/mop.dm | 4 +- .../objects/items/weapons/pneumaticCannon.dm | 16 ++++---- code/game/objects/items/weapons/powerfist.dm | 9 ++--- .../objects/items/weapons/storage/backpack.dm | 28 +++++++------- .../objects/items/weapons/storage/fancy.dm | 18 ++++----- .../objects/items/weapons/storage/secure.dm | 5 ++- code/game/objects/items/weapons/stunbaton.dm | 8 ++-- .../objects/items/weapons/tanks/jetpack.dm | 19 ++++------ .../objects/items/weapons/tanks/tank_types.dm | 38 +++++++++---------- .../game/objects/items/weapons/tanks/tanks.dm | 9 ++--- code/game/objects/items/weapons/tools.dm | 5 ++- .../objects/items/weapons/vending_items.dm | 6 +-- code/game/objects/structures.dm | 8 ++-- code/game/objects/structures/bedsheet_bin.dm | 13 +++---- .../crates_lockers/closets/fireaxe.dm | 2 +- code/game/objects/structures/displaycase.dm | 8 ++-- code/game/objects/structures/door_assembly.dm | 18 ++++----- code/game/objects/structures/extinguisher.dm | 4 +- code/game/objects/structures/girders.dm | 10 ++--- code/game/objects/structures/grille.dm | 6 +-- code/game/objects/structures/guillotine.dm | 6 +-- code/game/objects/structures/lattice.dm | 6 +-- code/game/objects/structures/mop_bucket.dm | 5 ++- code/game/objects/structures/plasticflaps.dm | 4 +- code/game/objects/structures/safe.dm | 4 +- code/game/objects/structures/spirit_board.dm | 4 +- code/game/objects/structures/tables_racks.dm | 10 ++--- .../objects/structures/windoor_assembly.dm | 4 +- code/game/objects/structures/window.dm | 16 ++++---- code/game/turfs/simulated/floor/plating.dm | 2 +- code/game/turfs/simulated/walls.dm | 12 +++--- code/game/turfs/simulated/walls_reinforced.dm | 16 ++++---- code/modules/arcade/arcade_base.dm | 12 +++--- code/modules/assembly/assembly.dm | 6 +-- code/modules/assembly/bomb.dm | 4 +- code/modules/assembly/holder.dm | 6 +-- code/modules/assembly/infrared.dm | 4 +- code/modules/assembly/mousetrap.dm | 4 +- .../awaymissions/mission_code/spacehotel.dm | 4 +- code/modules/clothing/clothing.dm | 14 +++---- code/modules/clothing/gloves/rings.dm | 6 +-- code/modules/clothing/shoes/magboots.dm | 4 +- code/modules/clothing/spacesuits/alien.dm | 4 +- code/modules/clothing/spacesuits/breaches.dm | 4 +- code/modules/clothing/spacesuits/ert.dm | 5 ++- .../spacesuits/rig/modules/modules.dm | 10 ++--- code/modules/clothing/spacesuits/rig/rig.dm | 14 +++---- .../clothing/under/accessories/accessory.dm | 4 +- .../clothing/under/accessories/holster.dm | 6 +-- .../under/jobs/plasmamen/_plasmamen.dm | 4 +- code/modules/countdown/countdown.dm | 2 +- code/modules/events/spacevine.dm | 4 +- code/modules/fish/fishtank.dm | 5 +-- code/modules/food_and_drinks/drinks/drinks.dm | 24 ++++++------ .../food_and_drinks/food/customizables.dm | 4 +- code/modules/food_and_drinks/food/snacks.dm | 20 +++++----- code/modules/games/cards.dm | 10 ++--- code/modules/hydroponics/beekeeping/beebox.dm | 16 ++++---- code/modules/hydroponics/fermenting_barrel.dm | 2 +- code/modules/hydroponics/gene_modder.dm | 4 +- code/modules/hydroponics/grown.dm | 4 +- code/modules/hydroponics/hydroponics.dm | 26 ++++++------- .../mining/equipment/kinetic_crusher.dm | 12 +++--- .../mining/equipment/lazarus_injector.dm | 6 +-- .../mining/equipment/marker_beacons.dm | 10 ++--- code/modules/mining/equipment/survival_pod.dm | 4 +- code/modules/mining/fulton.dm | 4 +- .../mining/lavaland/loot/hierophant_loot.dm | 4 +- code/modules/mining/machine_vending.dm | 4 +- code/modules/mob/dead/observer/observer.dm | 4 +- .../living/carbon/alien/special/facehugger.dm | 19 +++++----- code/modules/mob/living/carbon/brain/MMI.dm | 2 +- .../mob/living/carbon/brain/brain_item.dm | 6 +-- .../mob/living/carbon/brain/robotic_brain.dm | 9 ++--- .../mob/living/carbon/human/examine.dm | 2 +- code/modules/mob/living/silicon/ai/examine.dm | 8 +--- code/modules/mob/living/silicon/pai/pai.dm | 5 +-- .../silicon/robot/drone/drone_manufacturer.dm | 4 +- .../mob/living/silicon/robot/examine.dm | 5 +-- .../mob/living/simple_animal/bot/bot.dm | 8 ++-- .../mob/living/simple_animal/constructs.dm | 5 +-- .../mob/living/simple_animal/hostile/bees.dm | 4 +- .../living/simple_animal/hostile/headslug.dm | 4 +- .../living/simple_animal/hostile/hellhound.dm | 2 +- .../living/simple_animal/hostile/illusion.dm | 4 +- .../living/simple_animal/hostile/mushroom.dm | 6 +-- .../simple_animal/hostile/netherworld.dm | 6 +-- .../hostile/terror_spiders/terror_spiders.dm | 4 +- .../living/simple_animal/posessed_object.dm | 6 +-- .../mob/living/simple_animal/simple_animal.dm | 2 +- .../mob/living/simple_animal/slime/slime.dm | 25 ++++++------ code/modules/mob/mob.dm | 3 +- .../computers/item/computer.dm | 6 +-- .../modular_computers/hardware/_hardware.dm | 6 +-- .../modular_computers/hardware/ai_slot.dm | 4 +- .../modular_computers/hardware/card_slot.dm | 4 +- .../modular_computers/hardware/hard_drive.dm | 4 +- .../modular_computers/hardware/printer.dm | 4 +- code/modules/paperwork/clipboard.dm | 5 ++- code/modules/paperwork/frames.dm | 12 +++--- code/modules/paperwork/paper.dm | 5 ++- code/modules/paperwork/paper_bundle.dm | 7 ++-- code/modules/paperwork/paperbin.dm | 7 ++-- code/modules/paperwork/photography.dm | 10 +++-- code/modules/power/apc.dm | 23 ++++++----- code/modules/power/cable.dm | 17 ++++----- code/modules/power/cell.dm | 6 +-- code/modules/power/lighting.dm | 22 ++++++----- code/modules/power/port_gen.dm | 22 +++++------ .../particle_accelerator.dm | 2 +- code/modules/power/tesla/energy_ball.dm | 7 ++-- code/modules/power/treadmill.dm | 4 +- .../projectiles/ammunition/magazines.dm | 8 ++-- code/modules/projectiles/gun.dm | 12 +++--- code/modules/projectiles/guns/dartgun.dm | 7 ++-- .../guns/energy/kinetic_accelerator.dm | 12 +++--- .../projectiles/guns/energy/special.dm | 4 +- .../projectiles/guns/grenade_launcher.dm | 5 ++- code/modules/projectiles/guns/magic/wand.dm | 4 +- code/modules/projectiles/guns/projectile.dm | 4 +- .../projectiles/guns/projectile/revolver.dm | 8 ++-- .../projectiles/guns/projectile/shotgun.dm | 8 ++-- code/modules/projectiles/guns/rocket.dm | 4 +- code/modules/projectiles/guns/syringe_gun.dm | 4 +- code/modules/projectiles/guns/throw.dm | 10 ++--- .../projectiles/guns/throw/crossbow.dm | 6 +-- .../projectiles/guns/throw/pielauncher.dm | 4 +- .../chemistry/machinery/chem_dispenser.dm | 6 +-- .../reagents/reagent_containers/borghydro.dm | 21 +++++----- .../reagent_containers/glass_containers.dm | 7 ++-- .../reagents/reagent_containers/hypospray.dm | 6 +-- .../reagents/reagent_containers/spray.dm | 5 ++- code/modules/reagents/reagent_dispenser.dm | 13 +++---- .../ruins/lavalandruin_code/dead_ratvar.dm | 2 +- code/modules/surgery/organs/augments_arms.dm | 4 +- code/modules/surgery/organs/organ.dm | 6 +-- code/modules/telesci/telepad.dm | 4 +- code/modules/telesci/telesci_computer.dm | 4 +- code/modules/vehicle/ambulance.dm | 2 +- code/modules/vehicle/janicart.dm | 4 +- 210 files changed, 808 insertions(+), 830 deletions(-) diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm index 8de40b636b6..736137e7b55 100644 --- a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm @@ -393,9 +393,9 @@ /obj/machinery/atmospherics/unary/vent_pump/examine(mob/user) - ..(user) + . = ..() if(welded) - to_chat(user, "It seems welded shut.") + . += "It seems welded shut." /obj/machinery/atmospherics/unary/vent_pump/power_change() var/old_stat = stat diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm index 20218f7f2d0..5844407e777 100644 --- a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm @@ -65,9 +65,9 @@ return ..() /obj/machinery/atmospherics/unary/vent_pump/examine(mob/user) - ..(user) + . = ..() if(welded) - to_chat(user, "It seems welded shut.") + . += "It seems welded shut." /obj/machinery/atmospherics/unary/vent_scrubber/auto_use_power() if(!powered(power_channel)) diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index b3b86ac13e1..df957eaa11e 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -40,7 +40,7 @@ #define COMSIG_PARENT_ATTACKBY "atom_attackby" //from base of atom/attackby(): (/obj/item, /mob/living, params) #define COMPONENT_NO_AFTERATTACK 1 //Return this in response if you don't want afterattack to be called #define COMSIG_ATOM_HULK_ATTACK "hulk_attack" //from base of atom/attack_hulk(): (/mob/living/carbon/human) -#define COMSIG_PARENT_EXAMINE "atom_examine" //from base of atom/examine(): (/mob) +#define COMSIG_PARENT_EXAMINE "atom_examine" //from base of atom/examine(): (/mob, result) #define COMSIG_ATOM_GET_EXAMINE_NAME "atom_examine_name" //from base of atom/get_examine_name(): (/mob, list/overrides) //Positions for overrides list #define EXAMINE_POSITION_ARTICLE 1 diff --git a/code/datums/components/decal.dm b/code/datums/components/decal.dm index bdc1d3a2f6f..26d4653b25a 100644 --- a/code/datums/components/decal.dm +++ b/code/datums/components/decal.dm @@ -71,5 +71,5 @@ if(strength >= cleanable) qdel(src) -/datum/component/decal/proc/examine(datum/source, mob/user) - to_chat(user, description) \ No newline at end of file +/datum/component/decal/proc/examine(datum/source, mob/user, var/list/examine_list) + examine_list += description \ No newline at end of file diff --git a/code/datums/components/ducttape.dm b/code/datums/components/ducttape.dm index 5bbf99198fd..85568f7a09c 100644 --- a/code/datums/components/ducttape.dm +++ b/code/datums/components/ducttape.dm @@ -17,8 +17,8 @@ if(I.loc == user) RT.Grant(user) -/datum/component/proc/add_tape_text(datum/source, mob/user) - to_chat(user, "There's some sticky tape attached to [source].") +/datum/component/proc/add_tape_text(datum/source, mob/user, list/examine_list) + examine_list += "There's some sticky tape attached to [source]." /datum/component/ducttape/proc/add_tape_overlay(obj/item/O) tape_overlay = new('icons/obj/bureaucracy.dmi', "tape") diff --git a/code/datums/components/material_container.dm b/code/datums/components/material_container.dm index 92c8c6b108d..8d44679fa4a 100644 --- a/code/datums/components/material_container.dm +++ b/code/datums/components/material_container.dm @@ -49,13 +49,13 @@ var/mat_path = possible_mats[id] materials[id] = new mat_path() -/datum/component/material_container/proc/OnExamine(datum/source, mob/user) +/datum/component/material_container/proc/OnExamine(datum/source, mob/user, list/examine_list) if(show_on_examine) for(var/I in materials) var/datum/material/M = materials[I] var/amt = amount(M.id) if(amt) - to_chat(user, "It has [amt] units of [lowertext(M.name)] stored.") + examine_list += "It has [amt] units of [lowertext(M.name)] stored." /datum/component/material_container/proc/OnAttackBy(datum/source, obj/item/I, mob/living/user) var/list/tc = allowed_typecache diff --git a/code/game/atoms.dm b/code/game/atoms.dm index dc84c1836dd..da1ce847e54 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -272,7 +272,7 @@ //All atoms -/atom/proc/examine(mob/user, var/distance = -1, var/infix = "", var/suffix = "") +/atom/proc/examine(mob/user, infix = "", suffix = "") //This reformat names to get a/an properly working on item descriptions when they are bloody var/f_name = "\a [src][infix]." if(src.blood_DNA && !istype(src, /obj/effect/decal)) @@ -284,33 +284,30 @@ f_name += "blood-stained [name][infix]!" else f_name += "oil-stained [name][infix]." - - to_chat(user, "[bicon(src)] That's [f_name] [suffix]") + . = list("[bicon(src)] That's [f_name] [suffix]") if(desc) - to_chat(user, desc) + . += desc if(reagents) if(container_type & TRANSPARENT) - to_chat(user, "It contains:") + . += "It contains:" if(reagents.reagent_list.len) if(user.can_see_reagents()) //Show each individual reagent for(var/I in reagents.reagent_list) var/datum/reagent/R = I - to_chat(user, "[R.volume] units of [R.name]") + . += "[R.volume] units of [R.name]" else //Otherwise, just show the total volume if(reagents && reagents.reagent_list.len) - to_chat(user, "[reagents.total_volume] units of various reagents.") + . += "[reagents.total_volume] units of various reagents." else - to_chat(user, "Nothing. ") + . += "Nothing." else if(container_type & AMOUNT_VISIBLE) if(reagents.total_volume) - to_chat(user, "It has [reagents.total_volume] unit\s left.") + . += "It has [reagents.total_volume] unit\s left." else - to_chat(user, "It's empty.") + . += "It's empty." - SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user) - - return distance == -1 || (get_dist(src, user) <= distance) || isobserver(user) //observers do not have a range limit + SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user, .) /atom/proc/relaymove() return diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm index ed06ec4086d..890728d9069 100644 --- a/code/game/gamemodes/blob/theblob.dm +++ b/code/game/gamemodes/blob/theblob.dm @@ -207,8 +207,8 @@ return /obj/structure/blob/examine(mob/user) - ..(user) - to_chat(user, "It looks like it's made of [get_chem_name()].") + . = ..() + . += "It looks like it's made of [get_chem_name()]." /obj/structure/blob/proc/get_chem_name() diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index 7ef5baced97..0d70822dd01 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -281,9 +281,9 @@ /obj/item/cult_shift/examine(mob/user) . = ..() if(uses) - to_chat(user, "It has [uses] uses remaining.") + . += "It has [uses] uses remaining." else - to_chat(user, "It seems drained.") + . += "It seems drained." /obj/item/cult_shift/proc/handle_teleport_grab(turf/T, mob/user) var/mob/living/carbon/C = user diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm index c6a6a3b7490..0620b97718a 100644 --- a/code/game/gamemodes/cult/cult_structures.dm +++ b/code/game/gamemodes/cult/cult_structures.dm @@ -50,8 +50,8 @@ /obj/structure/cult/functional/examine(mob/user) . = ..() if(iscultist(user) && cooldowntime > world.time) - to_chat(user, "The magic in [src] is weak, it will be ready to use again in [getETA()].") - to_chat(user, "\The [src] is [anchored ? "":"not "]secured to the floor.") + . += "The magic in [src] is weak, it will be ready to use again in [getETA()]." + . += "\The [src] is [anchored ? "":"not "]secured to the floor." /obj/structure/cult/functional/attackby(obj/I, mob/user, params) if(HULK in user.mutations) diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index fb6bb95a4a8..24db67c952b 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -46,11 +46,11 @@ ..() /obj/item/tome/examine(mob/user) - ..() + . = ..() if(iscultist(user) || user.stat == DEAD) - to_chat(user, "The scriptures of [SSticker.cultdat.entity_title3]. Allows the scribing of runes and access to the knowledge archives of the cult of [SSticker.cultdat.entity_name].") - to_chat(user, "Striking another cultist with it will purge holy water from them.") - to_chat(user, "Striking a noncultist, however, will sear their flesh.") + . += "The scriptures of [SSticker.cultdat.entity_title3]. Allows the scribing of runes and access to the knowledge archives of the cult of [SSticker.cultdat.entity_name]." + . += "Striking another cultist with it will purge holy water from them." + . += "Striking a noncultist, however, will sear their flesh." /obj/item/tome/attack(mob/living/M, mob/living/user) if(!istype(M)) diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 56f07d52826..4f647e2d576 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -50,13 +50,13 @@ To draw a rune, use an arcane tome. AI.client.images += blood /obj/effect/rune/examine(mob/user) - ..() + . = ..() if(iscultist(user) || user.stat == DEAD) //If they're a cultist or a ghost, tell them the effects - to_chat(user, "Name: [cultist_name]") - to_chat(user, "Effects: [capitalize(cultist_desc)]") - to_chat(user, "Required Acolytes: [req_cultists]") + . += "Name: [cultist_name]" + . += "Effects: [capitalize(cultist_desc)]" + . += "Required Acolytes: [req_cultists]" if(req_keyword && keyword) - to_chat(user, "Keyword: [keyword]") + . += "Keyword: [keyword]" /obj/effect/rune/attackby(obj/I, mob/user, params) if(istype(I, /obj/item/tome) && iscultist(user)) @@ -754,9 +754,9 @@ var/list/teleport_runes = list() var/mob/living/affecting = null /obj/effect/rune/astral/examine(mob/user) - ..() + . = ..() if(affecting) - to_chat(user, "A translucent field encases [user] above the rune!") + . += "A translucent field encases [user] above the rune!" /obj/effect/rune/astral/can_invoke(mob/living/user) if(rune_in_use) @@ -826,9 +826,9 @@ var/list/teleport_runes = list() invoke_damage = 2 /obj/effect/rune/wall/examine(mob/user) - ..() + . = ..() if(density) - to_chat(user, "There is a barely perceptible shimmering of the air above [src].") + . += "There is a barely perceptible shimmering of the air above [src]." /obj/effect/rune/wall/invoke(var/list/invokers) var/mob/living/user = invokers[1] diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm index 179425d320d..f7aaf2c1ebd 100644 --- a/code/game/gamemodes/cult/talisman.dm +++ b/code/game/gamemodes/cult/talisman.dm @@ -12,12 +12,13 @@ SEND_SIGNAL(src, COMSIG_OBJ_UPDATE_ICON) /obj/item/paper/talisman/examine(mob/user) + . = ..() if(iscultist(user) || user.stat == DEAD) - to_chat(user, "Name: [cultist_name]") - to_chat(user, "Effect: [cultist_desc]") - to_chat(user, "Uses Remaining: [uses]") + . += "Name: [cultist_name]" + . += "Effect: [cultist_desc]" + . += "Uses Remaining: [uses]" else - to_chat(user, "You see strange symbols on the paper. Are they supposed to mean something?") + . += "You see strange symbols on the paper. Are they supposed to mean something?" /obj/item/paper/talisman/attack_self(mob/living/user) if(!iscultist(user)) diff --git a/code/game/gamemodes/devil/true_devil/_true_devil.dm b/code/game/gamemodes/devil/true_devil/_true_devil.dm index 93b307f0105..197524c0e38 100644 --- a/code/game/gamemodes/devil/true_devil/_true_devil.dm +++ b/code/game/gamemodes/devil/true_devil/_true_devil.dm @@ -93,7 +93,7 @@ else if(health < (maxHealth/2)) msg += "You can see hellfire inside of it's wounds.\n" msg += "*---------*" - to_chat(user, msg) + . = list(msg) /mob/living/carbon/true_devil/IsAdvancedToolUser() diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm index 232396d951a..539df377b71 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm @@ -563,16 +563,16 @@ Congratulations! You are now trained for invasive xenobiology research!"} . = ..() /obj/item/abductor_baton/examine(mob/user) - ..() + . = ..() switch(mode) if(BATON_STUN) - to_chat(user, "The baton is in stun mode.") + . += "The baton is in stun mode." if(BATON_SLEEP) - to_chat(user, "The baton is in sleep inducement mode.") + . += "The baton is in sleep inducement mode." if(BATON_CUFF) - to_chat(user, "The baton is in restraining mode.") + . += "The baton is in restraining mode." if(BATON_PROBE) - to_chat(user, "The baton is in probing mode.") + . += "The baton is in probing mode." /obj/item/radio/headset/abductor name = "alien headset" diff --git a/code/game/gamemodes/miniantags/guardian/guardian.dm b/code/game/gamemodes/miniantags/guardian/guardian.dm index fc7fcce72e0..a527f055466 100644 --- a/code/game/gamemodes/miniantags/guardian/guardian.dm +++ b/code/game/gamemodes/miniantags/guardian/guardian.dm @@ -309,7 +309,7 @@ /obj/item/guardiancreator/examine(mob/user, distance) . = ..() if(used) - to_chat(user, "[used_message]") + . += "[used_message]" /obj/item/guardiancreator/proc/spawn_guardian(mob/living/user, key) var/guardian_type = "Standard" diff --git a/code/game/gamemodes/miniantags/guardian/types/bomb.dm b/code/game/gamemodes/miniantags/guardian/types/bomb.dm index fbe4458693f..b69487644f0 100644 --- a/code/game/gamemodes/miniantags/guardian/types/bomb.dm +++ b/code/game/gamemodes/miniantags/guardian/types/bomb.dm @@ -82,6 +82,6 @@ return FALSE // Disarm or blow up. No picking up /obj/item/guardian_bomb/examine(mob/user) - stored_obj.examine(user) - if(get_dist(user,src) <= 2) - to_chat(user, "Looks odd!") + . = stored_obj.examine(user) + if(get_dist(user, src) <= 2) + . += "Looks odd!" diff --git a/code/game/gamemodes/miniantags/morph/morph.dm b/code/game/gamemodes/miniantags/morph/morph.dm index 1da936b64ee..ef90f44f4a0 100644 --- a/code/game/gamemodes/miniantags/morph/morph.dm +++ b/code/game/gamemodes/miniantags/morph/morph.dm @@ -38,6 +38,8 @@ var/atom/movable/form = null var/morph_time = 0 + var/list/examine_text_list + var/playstyle_string = "You are a morph.
      As an abomination created primarily with changeling cells, \ you may take the form of anything nearby by shift-clicking it. This process will alert any nearby \ observers, and can only be performed once every five seconds.
      While morphed, you move faster, but do \ @@ -57,16 +59,11 @@ /mob/living/simple_animal/hostile/morph/examine(mob/user) if(morphed) - if(form) - form.examine(user) // Refactor examine to return desc so it's static? Not sure if worth it - // If the object you've disguised as has been deleted, your cover's probably blown - else - ..() - if(get_dist(user,src)<=3) - to_chat(user, "It doesn't look quite right...") + . = examine_text_list.Copy() + if(get_dist(user, src) <= 3) + . += "It doesn't look quite right..." else - ..() - return + . = ..() /mob/living/simple_animal/hostile/morph/proc/allowed(atom/movable/A) // make it into property/proc ? not sure if worth it if(istype(A,/obj/screen)) @@ -109,7 +106,7 @@ melee_damage_lower = 5 melee_damage_upper = 5 speed = 0 - + examine_text_list = form.examine(src) morph_time = world.time + MORPH_COOLDOWN return @@ -118,7 +115,7 @@ return morphed = 0 form = null - + examine_text_list = null // Free that memory visible_message("[src] suddenly collapses in on itself, dissolving into a pile of green flesh!", \ "You reform to your normal body.") name = initial(name) diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm index f0d8ede6634..e363c849eb9 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant.dm @@ -374,11 +374,11 @@ qdel(src) /obj/item/ectoplasm/revenant/examine(mob/user) - ..(user) + . = ..() if(inert) - to_chat(user, "It seems inert.") + . += "It seems inert." else if(reforming) - to_chat(user, "It is shifting and distorted. It would be wise to destroy this.") + . += "It is shifting and distorted. It would be wise to destroy this." /obj/item/ectoplasm/revenant/proc/reform() if(inert || !src) diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm index 07ee2219157..57be7349aa7 100644 --- a/code/game/gamemodes/nuclear/pinpointer.dm +++ b/code/game/gamemodes/nuclear/pinpointer.dm @@ -77,13 +77,11 @@ .() /obj/item/pinpointer/examine(mob/user) - ..(user) - if(!shows_nuke_timer) - return - - for(var/obj/machinery/nuclearbomb/bomb in GLOB.machines) - if(bomb.timing) - to_chat(user, "Extreme danger. Arming signal detected. Time remaining: [bomb.timeleft]") + . = ..() + if(shows_nuke_timer) + for(var/obj/machinery/nuclearbomb/bomb in GLOB.machines) + if(bomb.timing) + . += "Extreme danger. Arming signal detected. Time remaining: [bomb.timeleft]" /obj/item/pinpointer/advpinpointer name = "advanced pinpointer" @@ -310,12 +308,12 @@ return 0 /obj/item/pinpointer/operative/examine(mob/user) - ..() + . = ..() if(active) if(nearest_op) - to_chat(user, "Nearest operative detected is [nearest_op.real_name].") + . += "Nearest operative detected is [nearest_op.real_name]." else - to_chat(user, "No operatives detected within scanning range.") + . += "No operatives detected within scanning range." /obj/item/pinpointer/crew name = "crew pinpointer" @@ -395,9 +393,6 @@ spawn(5) .() -/obj/item/pinpointer/crew/examine(mob/user) - ..(user) - /obj/item/pinpointer/crew/centcom name = "centcom pinpointer" desc = "A handheld tracking device that tracks crew based on remote centcom sensors." diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm index a71b51c58f0..f67a8f28a5d 100644 --- a/code/game/gamemodes/wizard/soulstone.dm +++ b/code/game/gamemodes/wizard/soulstone.dm @@ -181,13 +181,13 @@ desc = "A wicked machine used by those skilled in magical arts. It is inactive" /obj/structure/constructshell/examine(mob/user) - if(..(user, 0)) - if(iscultist(user) || iswizard(user) || user.stat == DEAD) - to_chat(user, "A construct shell, used to house bound souls from a soulstone.") - to_chat(user, "Placing a soulstone with a soul into this shell allows you to produce your choice of the following:") - to_chat(user, "An Artificer, which can produce more shells and soulstones, as well as fortifications.") - to_chat(user, "A Wraith, which does high damage and can jaunt through walls, though it is quite fragile.") - to_chat(user, "A Juggernaut, which is very hard to kill and can produce temporary walls, but is slow.") + . = ..() + if(in_range(user, src) && (iscultist(user) || iswizard(user) || user.stat == DEAD)) + . += "A construct shell, used to house bound souls from a soulstone." + . += "Placing a soulstone with a soul into this shell allows you to produce your choice of the following:" + . += "An Artificer, which can produce more shells and soulstones, as well as fortifications." + . += "A Wraith, which does high damage and can jaunt through walls, though it is quite fragile." + . += "A Juggernaut, which is very hard to kill and can produce temporary walls, but is slow." /obj/structure/constructshell/attackby(obj/item/O as obj, mob/user as mob, params) if(istype(O, /obj/item/soulstone)) diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index 0fc8581cd2d..8a445814ca2 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -1033,11 +1033,11 @@ update_icon() /obj/machinery/alarm/examine(mob/user) - ..(user) + . = ..() if(buildstage < 2) - to_chat(user, "It is not wired.") + . += "It is not wired." if(buildstage < 1) - to_chat(user, "The circuit is missing.") + . += "The circuit is missing." /obj/machinery/alarm/all_access name = "all-access air alarm" diff --git a/code/game/machinery/atmoalter/meter.dm b/code/game/machinery/atmoalter/meter.dm index 4777cdcc5f2..f7e1dc15240 100644 --- a/code/game/machinery/atmoalter/meter.dm +++ b/code/game/machinery/atmoalter/meter.dm @@ -113,7 +113,7 @@ else t += "The connect error light is blinking." - to_chat(user, t) + . = list(t) /obj/machinery/meter/Click() if(istype(usr, /mob/living/silicon/ai)) // ghosts can call ..() for examine diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm index 71e1310f96b..eabd81c8e04 100644 --- a/code/game/machinery/atmoalter/portable_atmospherics.dm +++ b/code/game/machinery/atmoalter/portable_atmospherics.dm @@ -95,9 +95,9 @@ replace_tank(user, TRUE) /obj/machinery/portable_atmospherics/examine(mob/user) - ..() + . = ..() if(holding) - to_chat(user, "\The [src] contains [holding]. Alt-click [src] to remove it.") + . += "\The [src] contains [holding]. Alt-click [src] to remove it." /obj/machinery/portable_atmospherics/proc/replace_tank(mob/living/user, close_valve, obj/item/tank/new_tank) if(holding) diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index 0d4455399b0..813120b7c42 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -32,10 +32,10 @@ overlays.Cut() /obj/machinery/cell_charger/examine(mob/user) - ..() - to_chat(user, "There's [charging ? "a" : "no"] cell in the charger.") + . = ..() + . += "There's [charging ? "a" : "no"] cell in the charger." if(charging) - to_chat(user, "Current charge: [round(charging.percent(), 1)]%") + . += "Current charge: [round(charging.percent(), 1)]%" /obj/machinery/cell_charger/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/stock_parts/cell)) diff --git a/code/game/machinery/chiller.dm b/code/game/machinery/chiller.dm index d2f76a7c42a..afb17f3c90a 100644 --- a/code/game/machinery/chiller.dm +++ b/code/game/machinery/chiller.dm @@ -25,12 +25,12 @@ return /obj/machinery/space_heater/air_conditioner/examine(mob/user) - ..(user) - to_chat(user, "The air conditioner is [on ? "on" : "off"] and the hatch is [open ? "open" : "closed"].") + . = ..() + . += "The air conditioner is [on ? "on" : "off"] and the hatch is [open ? "open" : "closed"]." if(open) - to_chat(user, "The power cell is [cell ? "installed" : "missing"].") + . += "The power cell is [cell ? "installed" : "missing"]." else - to_chat(user, "The charge meter reads [cell ? round(cell.percent(),1) : 0]%") + . += "The charge meter reads [cell ? round(cell.percent(),1) : 0]%" /obj/machinery/space_heater/air_conditioner/emp_act(severity) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index ca0eff0aa95..26e6b8f4d7f 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -164,19 +164,19 @@ to_chat(user, "You flip the write-protect tab to [read_only ? "protected" : "unprotected"].") /obj/item/disk/data/examine(mob/user) - ..(user) - to_chat(user, "The write-protect tab is set to [read_only ? "protected" : "unprotected"].") + . = ..() + . += "The write-protect tab is set to [read_only ? "protected" : "unprotected"]." //Clonepod /obj/machinery/clonepod/examine(mob/user) - ..() + . = ..() if(mess) - to_chat(user, "It's filled with blood and viscera. You swear you can see it moving...") + . += "It's filled with blood and viscera. You swear you can see it moving..." if(!occupant || stat & (NOPOWER|BROKEN)) return if(occupant && occupant.stat != DEAD) - to_chat(user, "Current clone cycle is [round(get_completion())]% complete.") + . += "Current clone cycle is [round(get_completion())]% complete." /obj/machinery/clonepod/return_air() //non-reactive air var/datum/gas_mixture/GM = new diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 695e01103ea..a56d5c40236 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -980,13 +980,12 @@ var/active = 0 //if the ship is on /obj/item/orion_ship/examine(mob/user) - ..() - if(!(in_range(user, src))) - return - if(!active) - to_chat(user, "There's a little switch on the bottom. It's flipped down.") - else - to_chat(user, "There's a little switch on the bottom. It's flipped up.") + . = ..() + if(in_range(user, src)) + if(!active) + . += "There's a little switch on the bottom. It's flipped down." + else + . += "There's a little switch on the bottom. It's flipped up." /obj/item/orion_ship/attack_self(mob/user) //Minibomb-level explosion. Should probably be more because of how hard it is to survive the machine! Also, just over a 5-second fuse if(active) diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index a34a49ca051..c0384e63b94 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -57,7 +57,7 @@ board_type = "machine" /obj/item/circuitboard/examine(mob/user) - ..() + . = ..() if(LAZYLEN(req_components)) var/list/nice_list = list() for(var/B in req_components) @@ -65,7 +65,7 @@ if(!ispath(A)) continue nice_list += list("[req_components[A]] [initial(A.name)]") - to_chat(user,"Required components: [english_list(nice_list)].") + . += "Required components: [english_list(nice_list)]." /obj/item/circuitboard/message_monitor name = "Circuit board (Message Monitor)" diff --git a/code/game/machinery/defib_mount.dm b/code/game/machinery/defib_mount.dm index 77d68590efa..4f27dfa4be5 100644 --- a/code/game/machinery/defib_mount.dm +++ b/code/game/machinery/defib_mount.dm @@ -42,15 +42,15 @@ return ..() /obj/machinery/defibrillator_mount/examine(mob/user) - ..() + . = ..() if(defib) - to_chat(user, "There is a defib unit hooked up. Alt-click to remove it.") + . += "There is a defib unit hooked up. Alt-click to remove it." if(security_level >= SEC_LEVEL_RED) - to_chat(user, "Due to a security situation, its locking clamps can be toggled by swiping any ID.") + . += "Due to a security situation, its locking clamps can be toggled by swiping any ID." else - to_chat(user, "Its locking clamps can be [clamps_locked ? "dis" : ""]engaged by swiping an ID with access.") + . += "Its locking clamps can be [clamps_locked ? "dis" : ""]engaged by swiping an ID with access." else - to_chat(user, "There are a pair of bolts in the defib unit housing securing the [src] to the wall.") + . += "There are a pair of bolts in the defib unit housing securing the [src] to the wall." /obj/machinery/defibrillator_mount/process() if(defib && defib.bcell && defib.bcell.charge < defib.bcell.maxcharge && is_operational()) diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index 6785c5ed8ff..4d8b3280599 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -183,7 +183,7 @@ /obj/item/grenade/barrier/examine(mob/user) . = ..() - to_chat(user, "Alt-click to toggle modes.") + . += "Alt-click to toggle modes." /obj/item/grenade/barrier/AltClick(mob/living/carbon/user) if(!istype(user) || !user.Adjacent(src) || user.incapacitated()) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index a80209dea65..5b4742de317 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -501,38 +501,38 @@ About the new airlock wires panel: update_icon(AIRLOCK_CLOSED) /obj/machinery/door/airlock/examine(mob/user) - ..() + . = ..() if(emagged) - to_chat(user, "Its access panel is smoking slightly.") + . += "Its access panel is smoking slightly." if(note) if(!in_range(user, src)) - to_chat(user, "There's a [note.name] pinned to the front. You can't [note_type() == "note" ? "read" : "see"] it from here.") + . += "There's a [note.name] pinned to the front. You can't [note_type() == "note" ? "read" : "see"] it from here." else - to_chat(user, "There's a [note.name] pinned to the front...") + . += "There's a [note.name] pinned to the front..." note.examine(user) - to_chat(user, "Use an empty hand on the airlock on grab mode to remove [note.name].") + . += "Use an empty hand on the airlock on grab mode to remove [note.name]." if(panel_open) switch(security_level) if(AIRLOCK_SECURITY_NONE) - to_chat(user, "Its wires are exposed!") + . += "Its wires are exposed!" if(AIRLOCK_SECURITY_METAL) - to_chat(user, "Its wires are hidden behind a welded metal cover.") + . += "Its wires are hidden behind a welded metal cover." if(AIRLOCK_SECURITY_PLASTEEL_I_S) - to_chat(user, "There is some shredded plasteel inside.") + . += "There is some shredded plasteel inside." if(AIRLOCK_SECURITY_PLASTEEL_I) - to_chat(user, "Its wires are behind an inner layer of plasteel.") + . += "Its wires are behind an inner layer of plasteel." if(AIRLOCK_SECURITY_PLASTEEL_O_S) - to_chat(user, "There is some shredded plasteel inside.") + . += "There is some shredded plasteel inside." if(AIRLOCK_SECURITY_PLASTEEL_O) - to_chat(user, "There is a welded plasteel cover hiding its wires.") + . += "There is a welded plasteel cover hiding its wires." if(AIRLOCK_SECURITY_PLASTEEL) - to_chat(user, "There is a protective grille over its panel.") + . += "There is a protective grille over its panel." else if(security_level) if(security_level == AIRLOCK_SECURITY_METAL) - to_chat(user, "It looks a bit stronger.") + . += "It looks a bit stronger." else - to_chat(user, "It looks very robust.") + . += "It looks very robust." /obj/machinery/door/airlock/attack_ghost(mob/user) if(panel_open) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 773c54d2808..ee304b8eca1 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -33,15 +33,15 @@ var/active_alarm = FALSE /obj/machinery/door/firedoor/examine(mob/user) - ..() + . = ..() if(!density) - to_chat(user, "It is open, but could be pried closed.") + . += "It is open, but could be pried closed." else if(!welded) - to_chat(user, "It is closed, but could be pried open. Deconstruction would require it to be welded shut.") + . += "It is closed, but could be pried open. Deconstruction would require it to be welded shut." else if(boltslocked) - to_chat(user, "It is welded shut. The floor bolts have been locked by screws.") + . += "It is welded shut. The floor bolts have been locked by screws." else - to_chat(user, "The bolt locks have been unscrewed, but the bolts themselves are still wrenched to the floor.") + . += "The bolt locks have been unscrewed, but the bolts themselves are still wrenched to the floor." /obj/machinery/door/firedoor/closed icon_state = "door_closed" @@ -289,18 +289,18 @@ var/reinforced = 0 /obj/structure/firelock_frame/examine(mob/user) - ..() + . = ..() switch(constructionStep) if(CONSTRUCTION_PANEL_OPEN) - to_chat(user, "It is unbolted from the floor. A small loosely connected metal plate is covering the wires.") + . += "It is unbolted from the floor. A small loosely connected metal plate is covering the wires." if(!reinforced) - to_chat(user, "It could be reinforced with plasteel.") + . += "It could be reinforced with plasteel." if(CONSTRUCTION_WIRES_EXPOSED) - to_chat(user, "The maintenance plate has been pried away, and wires are trailing.") + . += "The maintenance plate has been pried away, and wires are trailing." if(CONSTRUCTION_GUTTED) - to_chat(user, "The maintenance panel is missing wires and the circuit board is loosely connected.") + . += "The maintenance panel is missing wires and the circuit board is loosely connected." if(CONSTRUCTION_NOCIRCUIT) - to_chat(user, "There are no firelock electronics in the frame. The frame could be cut apart.") + . += "There are no firelock electronics in the frame. The frame could be cut apart." /obj/structure/firelock_frame/update_icon() ..() diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 549b5be3929..84a3fba6632 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -54,9 +54,9 @@ icon_state = "[base_state]open" /obj/machinery/door/window/examine(mob/user) - ..() + . = ..() if(emagged) - to_chat(user, "Its access panel is smoking slightly.") + . += "Its access panel is smoking slightly." /obj/machinery/door/window/proc/open_and_close() open() diff --git a/code/game/machinery/guestpass.dm b/code/game/machinery/guestpass.dm index 450260f5f79..4bc080fca67 100644 --- a/code/game/machinery/guestpass.dm +++ b/code/game/machinery/guestpass.dm @@ -17,15 +17,15 @@ return temp_access /obj/item/card/id/guest/examine(mob/user) - ..(user) + . = ..() if(world.time < expiration_time) - to_chat(user, "This pass expires at [station_time_timestamp("hh:mm:ss", expiration_time)].") + . += "This pass expires at [station_time_timestamp("hh:mm:ss", expiration_time)]." else - to_chat(user, "It expired at [station_time_timestamp("hh:mm:ss", expiration_time)].") - to_chat(user, "It grants access to following areas:") + . += "It expired at [station_time_timestamp("hh:mm:ss", expiration_time)]." + . += "It grants access to following areas:" for(var/A in temp_access) - to_chat(user, "[get_access_desc(A)].") - to_chat(user, "Issuing reason: [reason].") + . += "[get_access_desc(A)]." + . += "Issuing reason: [reason]." ///////////////////////////////////////////// //Guest pass terminal//////////////////////// diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index e6d967c8eb4..fc23507d73b 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -479,8 +479,9 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ /obj/effect/overlay/holo_pad_hologram/examine(mob/user) if(Impersonation) - return Impersonation.examine(user) - return ..() + . = Impersonation.examine(user) + else + . = ..() /obj/effect/overlay/holoray diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index f3be556a184..144b441d2de 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -56,9 +56,9 @@ return ..() /obj/machinery/iv_drip/examine(mob/user) - ..(user) + . = ..() if(bag) - bag.examine(user) + . += bag.examine(user) /obj/machinery/iv_drip/Move(NewLoc, direct) . = ..() diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index ee6bd060c16..b1e335c1ce9 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -70,8 +70,8 @@ icon_state = "light0" /obj/machinery/light_switch/examine(mob/user) - if(..(user, 1)) - to_chat(user, "A light switch. It is [on? "on" : "off"].") + . = ..() + . += "A light switch. It is [on? "on" : "off"]." /obj/machinery/light_switch/attack_ghost(mob/user) if(user.can_advanced_admin_interact()) diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index fad3f21c3fc..4129af82a5d 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -490,27 +490,27 @@ Class Procs: return 0 /obj/machinery/proc/display_parts(mob/user) - to_chat(user, "Following parts detected in the machine:") + . = list("Following parts detected in the machine:") for(var/obj/item/C in component_parts) - to_chat(user, "[bicon(C)] [C.name]") + . += "[bicon(C)] [C.name]" /obj/machinery/examine(mob/user) - ..() + . = ..() if(stat & BROKEN) - to_chat(user, "It looks broken and non-functional.") + . += "It looks broken and non-functional." if(!(resistance_flags & INDESTRUCTIBLE)) if(burn_state == ON_FIRE) - to_chat(user, "It's on fire!") + . += "It's on fire!" var/healthpercent = (obj_integrity/max_integrity) * 100 switch(healthpercent) if(50 to 99) - to_chat(user, "It looks slightly damaged.") + . += "It looks slightly damaged." if(25 to 50) - to_chat(user, "It appears heavily damaged.") + . += "It appears heavily damaged." if(0 to 25) - to_chat(user, "It's falling apart!") + . += "It's falling apart!" if(user.research_scanner && component_parts) - display_parts(user) + . += display_parts(user) /obj/machinery/proc/on_assess_perp(mob/living/carbon/human/perp) return 0 diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index 5abfc313047..ff5410f6953 100644 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -177,21 +177,21 @@ icon_state = icon_state_idle /obj/machinery/recharger/examine(mob/user) - ..() + . = ..() if(charging && (!in_range(user, src) && !issilicon(user) && !isobserver(user))) - to_chat(user, "You're too far away to examine [src]'s contents and display!") + . += "You're too far away to examine [src]'s contents and display!" return if(charging) - to_chat(user, "\The [src] contains:") - to_chat(user, "- \A [charging].") + . += "\The [src] contains:" + . += "- \A [charging]." if(!(stat & (NOPOWER|BROKEN))) var/obj/item/stock_parts/cell/C = charging.get_cell() - to_chat(user, "The status display reads:") + . += "The status display reads:" if(using_power) - to_chat(user, "- Recharging [(C.chargerate/C.maxcharge)*100]% cell charge per cycle.") + . += "- Recharging [(C.chargerate/C.maxcharge)*100]% cell charge per cycle." if(charging) - to_chat(user, "- \The [charging]'s cell is at [C.percent()]%.") + . += "- \The [charging]'s cell is at [C.percent()]%." // Atlantis: No need for that copy-pasta code, just use var to store icon_states instead. /obj/machinery/recharger/wallcharger diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index 99d3b135a08..eb3052dd909 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -41,10 +41,10 @@ var/const/SAFETY_COOLDOWN = 100 amount_produced = min(100, amt_made) /obj/machinery/recycler/examine(mob/user) - ..(user) - to_chat(user, "The power light is [(stat & NOPOWER) ? "off" : "on"].") - to_chat(user, "The safety-mode light is [safety_mode ? "on" : "off"].") - to_chat(user, "The safety-sensors status light is [emagged ? "off" : "on"].") + . = ..() + . += "The power light is [(stat & NOPOWER) ? "off" : "on"]." + . += "The safety-mode light is [safety_mode ? "on" : "off"]." + . += "The safety-sensors status light is [emagged ? "off" : "on"]." /obj/machinery/recycler/power_change() ..() diff --git a/code/game/machinery/snow_machine.dm b/code/game/machinery/snow_machine.dm index 2ae3bf22977..cc59f0a3017 100644 --- a/code/game/machinery/snow_machine.dm +++ b/code/game/machinery/snow_machine.dm @@ -25,8 +25,8 @@ RefreshParts() /obj/machinery/snow_machine/examine(mob/user) - ..() - to_chat(user, "The internal reservoir indicates it is [infinite_snow ? "100" : round(reagents.total_volume / reagents.maximum_volume * 100)]% full.") + . = ..() + . += "The internal reservoir indicates it is [infinite_snow ? "100" : round(reagents.total_volume / reagents.maximum_volume * 100)]% full." /obj/machinery/snow_machine/RefreshParts() power_efficiency = 0 diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index ccba902b058..3fde4116fa3 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -35,12 +35,12 @@ return /obj/machinery/space_heater/examine(mob/user) - ..(user) - to_chat(user, "The heater is [on ? "on" : "off"] and the hatch is [open ? "open" : "closed"].") + . = ..() + . += "The heater is [on ? "on" : "off"] and the hatch is [open ? "open" : "closed"]." if(open) - to_chat(user, "The power cell is [cell ? "installed" : "missing"].") + . += "The power cell is [cell ? "installed" : "missing"]." else - to_chat(user, "The charge meter reads [cell ? round(cell.percent(),1) : 0]%") + . += "The charge meter reads [cell ? round(cell.percent(),1) : 0]%" /obj/machinery/space_heater/emp_act(severity) if(stat & (BROKEN|NOPOWER)) diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index 642676c6eff..94d1162349f 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -136,9 +136,9 @@ return 0 /obj/machinery/status_display/examine(mob/user) - . = ..(user) + . = ..() if(mode != STATUS_DISPLAY_BLANK && mode != STATUS_DISPLAY_ALERT) - to_chat(user, "The display says:
      \t[sanitize(message1)]
      \t[sanitize(message2)]") + . += "The display says:
      \t[sanitize(message1)]
      \t[sanitize(message2)]" /obj/machinery/status_display/proc/set_message(m1, m2) if(m1) diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index 3630beb1f6c..b2692b6621b 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -90,8 +90,8 @@ return ..() /obj/machinery/syndicatebomb/examine(mob/user) - ..(user) - to_chat(user, "A digital display on it reads \"[seconds_remaining()]\".") + . = ..() + . += "A digital display on it reads \"[seconds_remaining()]\"." /obj/machinery/syndicatebomb/update_icon() icon_state = "[initial(icon_state)][active ? "-active" : "-inactive"][open_panel ? "-wires" : ""]" diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 517d6dd4019..8e6afaf0a20 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -169,23 +169,23 @@ radio.subspace_transmission = 1 /obj/mecha/examine(mob/user) - ..(user) + . = ..() var/integrity = health/initial(health)*100 switch(integrity) if(85 to 100) - to_chat(user, "It's fully intact.") + . += "It's fully intact." if(65 to 85) - to_chat(user, "It's slightly damaged.") + . += "It's slightly damaged." if(45 to 65) - to_chat(user, "It's badly damaged.") + . += "It's badly damaged." if(25 to 45) - to_chat(user, "It's heavily damaged.") + . += "It's heavily damaged." else - to_chat(user, "It's falling apart.") + . += "It's falling apart." if(equipment && equipment.len) - to_chat(user, "It's equipped with:") + . += "It's equipped with:" for(var/obj/item/mecha_parts/mecha_equipment/ME in equipment) - to_chat(user, "[bicon(ME)] [ME]") + . += "[bicon(ME)] [ME]" /obj/mecha/hear_talk(mob/M, list/message_pieces) if(M == occupant && radio.broadcasting) diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index c5e3417d89d..3308acffcd8 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -142,8 +142,8 @@ var/global/list/image/splatter_cache = list() icon_state = "writing1" /obj/effect/decal/cleanable/blood/writing/examine(mob/user) - ..(user) - to_chat(user, "It reads: \"[message]\"") + . = ..() + . += "It reads: \"[message]\"" /obj/effect/decal/cleanable/blood/gibs name = "gibs" diff --git a/code/game/objects/effects/glowshroom.dm b/code/game/objects/effects/glowshroom.dm index 464d5c277fd..fa64bedd2ac 100644 --- a/code/game/objects/effects/glowshroom.dm +++ b/code/game/objects/effects/glowshroom.dm @@ -33,7 +33,7 @@ /obj/structure/glowshroom/examine(mob/user) . = ..() - to_chat(user, "This is a [generation]\th generation [name]!") + . += "This is a [generation]\th generation [name]!" /obj/structure/glowshroom/Destroy() QDEL_NULL(myseed) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 25c39c3e9f1..a618a57076f 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -168,7 +168,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d src.loc = T -/obj/item/examine(mob/user, var/distance = -1) +/obj/item/examine(mob/user) var/size switch(src.w_class) if(WEIGHT_CLASS_TINY) @@ -184,7 +184,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d if(WEIGHT_CLASS_GIGANTIC) size = "gigantic" - . = ..(user, distance, "", "It is a [size] item.") + . = ..(user, "", "It is a [size] item.") if(user.research_scanner) //Mob has a research scanner active. var/msg = "*--------*
      " @@ -205,7 +205,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d else msg += "No extractable materials detected.
      " msg += "*--------*" - to_chat(user, msg) + . += msg /obj/item/afterattack(atom/target, mob/user, proximity, params) SEND_SIGNAL(src, COMSIG_ITEM_AFTERATTACK, target, user, proximity, params) diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index f331ff72f94..e9cb80f398c 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -68,8 +68,8 @@ /obj/item/lightreplacer/examine(mob/user) - ..() - to_chat(user, status_string()) + . = ..() + . += status_string() /obj/item/lightreplacer/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/stack/sheet/glass)) diff --git a/code/game/objects/items/devices/pipe_painter.dm b/code/game/objects/items/devices/pipe_painter.dm index 35074718862..69beb04f67c 100644 --- a/code/game/objects/items/devices/pipe_painter.dm +++ b/code/game/objects/items/devices/pipe_painter.dm @@ -29,5 +29,5 @@ mode = input("Which colour do you want to use?", "Pipe Painter", mode) in modes /obj/item/pipe_painter/examine(mob/user) - ..(user) - to_chat(user, "It is in [mode] mode.") + . = ..() + . += "It is in [mode] mode." diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index bf7ee23eed0..0ef3b0b0728 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -48,12 +48,11 @@ /obj/item/radio/headset/list_channels(var/mob/user) return list_secure_channels() -/obj/item/radio/headset/examine(mob/user, var/distance = -1) - if(!(..(user, 1) && radio_desc)) - return - - to_chat(user, "The following channels are available:") - to_chat(user, radio_desc) +/obj/item/radio/headset/examine(mob/user) + . = ..() + if(in_range(src, user) && radio_desc) + . += "The following channels are available:" + . += radio_desc /obj/item/radio/headset/handle_message_mode(mob/living/M as mob, list/message_pieces, channel) if(channel == "special") diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 73c5dc8b41f..aab926f768e 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -595,14 +595,13 @@ var/global/list/default_medbay_channels = list( return null -/obj/item/radio/examine(mob/user, var/distance = -1) - . = ..(user, distance) - if((in_range(src, user) || loc == user)) +/obj/item/radio/examine(mob/user) + . = ..() + if(in_range(src, user) || loc == user) if(b_stat) - user.show_message("\the [src] can be attached and modified!") + . += "\the [src] can be attached and modified!" else - user.show_message("\the [src] can not be modified or attached!") - return . + . += "\the [src] can not be modified or attached!" /obj/item/radio/attackby(obj/item/W as obj, mob/user as mob, params) ..() diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 6c5b9cae2d6..dbe22162b57 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -339,8 +339,8 @@ proc/healthscan(mob/user, mob/living/M, mode = 1, upgraded = FALSE) var/accuracy // 0 is the best accuracy. /obj/item/analyzer/examine(mob/user) - .=..() - to_chat(user, "Alt-click [src] to activate the barometer function.") + . = ..() + . += "Alt-click [src] to activate the barometer function." /obj/item/analyzer/attack_self(mob/user as mob) diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index d3d0a2fe6bb..ed8dfebba23 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -26,8 +26,9 @@ return ..() /obj/item/taperecorder/examine(mob/user) - if(..(user, 1)) - to_chat(user, "The wire panel is [open_panel ? "opened" : "closed"].") + . = ..() + if(in_range(user, src)) + . += "The wire panel is [open_panel ? "opened" : "closed"]." /obj/item/taperecorder/attackby(obj/item/I, mob/user) diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index a738b6f03d4..61561131219 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -31,11 +31,11 @@ effective or pretty fucking useless. var/max_uses = 5 /obj/item/batterer/examine(mob/user) - ..(user) + . = ..() if(times_used >= max_uses) - to_chat(user, "[src] is out of charge.") + . += "[src] is out of charge." if(times_used < max_uses) - to_chat(user, "[src] has [max_uses-times_used] charges left.") + . += "[src] has [max_uses-times_used] charges left." /obj/item/batterer/attack_self(mob/living/carbon/user, flag = 0, emp = 0) if(!user) diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index f0830f34c40..20b1c64f61d 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -49,12 +49,13 @@ return ..() /obj/item/stack/examine(mob/user) - if(..(user, 1)) + . = ..() + if(in_range(user, src)) if(singular_name) - to_chat(user, "There are [amount] [singular_name]\s in the stack.") + . += "There are [amount] [singular_name]\s in the stack." else - to_chat(user, "There are [amount] [name]\s in the stack.") - to_chat(user,"Alt-click to take a custom amount.") + . += "There are [amount] [name]\s in the stack." + . +="Alt-click to take a custom amount." /obj/item/stack/proc/add(newamount) amount += newamount diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index edc7b855c99..41476b9453c 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -641,13 +641,14 @@ obj/item/toy/cards/singlecard obj/item/toy/cards/singlecard/examine(mob/user) - if(..(user, 0)) + . = ..() + if(get_dist(user, src) <= 0) if(ishuman(user)) var/mob/living/carbon/human/cardUser = user if(cardUser.get_item_by_slot(slot_l_hand) == src || cardUser.get_item_by_slot(slot_r_hand) == src) cardUser.visible_message("[cardUser] checks [cardUser.p_their()] card.", "The card reads: [src.cardname]") else - to_chat(cardUser, "You need to have the card in your hand to check it.") + . += "You need to have the card in your hand to check it." obj/item/toy/cards/singlecard/verb/Flip() @@ -1470,9 +1471,9 @@ obj/item/toy/cards/deck/syndicate/black fake_bullets = rand(2, 7) /obj/item/toy/russian_revolver/trick_revolver/examine(mob/user) //Sneaky sneaky - ..() - to_chat(user, "Has [fake_bullets] round\s remaining.") - to_chat(user, "[fake_bullets] of those are live rounds.") + . = ..() + . += "Has [fake_bullets] round\s remaining." + . += "[fake_bullets] of those are live rounds." /obj/item/toy/russian_revolver/trick_revolver/post_shot(user) to_chat(user, "[src] did look pretty dodgey!") diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm index ec916a4a228..c386e4feba0 100644 --- a/code/game/objects/items/weapons/RCD.dm +++ b/code/game/objects/items/weapons/RCD.dm @@ -82,8 +82,8 @@ GLOBAL_LIST_INIT(rcd_door_types, list( /obj/item/rcd/examine(mob/user) . = ..() - to_chat(user, "MATTER: [matter]/[max_matter] matter-units.") - to_chat(user, "MODE: [mode].") + . += "MATTER: [matter]/[max_matter] matter-units." + . += "MODE: [mode]." /obj/item/rcd/Destroy() QDEL_NULL(spark_system) diff --git a/code/game/objects/items/weapons/RCL.dm b/code/game/objects/items/weapons/RCL.dm index befe979078c..10e52fc716a 100644 --- a/code/game/objects/items/weapons/RCL.dm +++ b/code/game/objects/items/weapons/RCL.dm @@ -57,9 +57,9 @@ ..() /obj/item/twohanded/rcl/examine(mob/user) - ..() + . = ..() if(loaded) - to_chat(user, "It contains [loaded.amount]/[max_amount] cables.") + . += "It contains [loaded.amount]/[max_amount] cables." /obj/item/twohanded/rcl/Destroy() QDEL_NULL(loaded) diff --git a/code/game/objects/items/weapons/bee_briefcase.dm b/code/game/objects/items/weapons/bee_briefcase.dm index f370e186bcf..157868e3db4 100644 --- a/code/game/objects/items/weapons/bee_briefcase.dm +++ b/code/game/objects/items/weapons/bee_briefcase.dm @@ -23,12 +23,12 @@ return ..() /obj/item/bee_briefcase/examine(mob/user) - ..() + . = ..() if(loc == user) if(bees_left) - to_chat(user, "There are [bees_left] bees still inside in briefcase!") + . += "There are [bees_left] bees still inside in briefcase!" else - to_chat(user, "The bees are gone... Colony collapse disorder?") + . += "The bees are gone... Colony collapse disorder?" /obj/item/bee_briefcase/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/reagent_containers/syringe)) diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 917bf7f032c..055986dff30 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -118,20 +118,21 @@ SetOwnerInfo(H) /obj/item/card/id/examine(mob/user) - if(..(user, 1)) + . = ..() + if(in_range(user, src)) show(usr) else - to_chat(user, "It is too far away.") + . += "It is too far away." if(guest_pass) - to_chat(user, "There is a guest pass attached to this ID card") + . += "There is a guest pass attached to this ID card" if(world.time < guest_pass.expiration_time) - to_chat(user, "It expires at [station_time_timestamp("hh:mm:ss", guest_pass.expiration_time)].") + . += "It expires at [station_time_timestamp("hh:mm:ss", guest_pass.expiration_time)]." else - to_chat(user, "It expired at [station_time_timestamp("hh:mm:ss", guest_pass.expiration_time)].") - to_chat(user, "It grants access to following areas:") + . += "It expired at [station_time_timestamp("hh:mm:ss", guest_pass.expiration_time)]." + . += "It grants access to following areas:" for(var/A in guest_pass.temp_access) - to_chat(user, "[get_access_desc(A)].") - to_chat(user, "Issuing reason: [guest_pass.reason].") + . += "[get_access_desc(A)]." + . += "Issuing reason: [guest_pass.reason]." /obj/item/card/id/proc/show(mob/user as mob) var/datum/asset/assets = get_asset_datum(/datum/asset/simple/paper) @@ -141,7 +142,6 @@ popup.set_content(dat) popup.set_title_image(usr.browse_rsc_icon(src.icon, src.icon_state)) popup.open() - return /obj/item/card/id/attack_self(mob/user as mob) user.visible_message("[user] shows you: [bicon(src)] [src.name]. The assignment on the card: [src.assignment]",\ diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index 45309b381c0..4eeee2c81c9 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -44,8 +44,8 @@ update_charge() /obj/item/defibrillator/examine(mob/user) - ..(user) - to_chat(user, "Ctrl-click to remove the paddles from the defibrillator.") + . = ..() + . += "Ctrl-click to remove the paddles from the defibrillator." /obj/item/defibrillator/proc/update_power() if(bcell) diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index 674329abacb..f0f8af4e0d3 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -40,7 +40,7 @@ /obj/item/extinguisher/examine(mob/user) . = ..() - to_chat(user, "The safety is [safety ? "on" : "off"].") + . += "The safety is [safety ? "on" : "off"]." /obj/item/extinguisher/New() diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index d7038fcd752..701b72c1821 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -141,9 +141,9 @@ update_icon() /obj/item/flamethrower/examine(mob/user) - ..() + . = ..() if(ptank) - to_chat(user, "[src] has \a [ptank] attached. Alt-click to remove it.") + . += "[src] has \a [ptank] attached. Alt-click to remove it." /obj/item/flamethrower/proc/toggle_igniter(mob/user) if(!ptank) diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index 10bbb7c7cb5..91c6252d9b2 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -37,7 +37,7 @@ return ..() /obj/item/grenade/chem_grenade/examine(mob/user) - ..(user) + . = ..() display_timer = (stage == READY && !nadeassembly) //show/hide the timer based on assembly state diff --git a/code/game/objects/items/weapons/grenades/ghettobomb.dm b/code/game/objects/items/weapons/grenades/ghettobomb.dm index ca6177c04fa..b58330a248b 100644 --- a/code/game/objects/items/weapons/grenades/ghettobomb.dm +++ b/code/game/objects/items/weapons/grenades/ghettobomb.dm @@ -62,5 +62,5 @@ qdel(src) /obj/item/grenade/iedcasing/examine(mob/user) - ..() - to_chat(user, "You can't tell when it will explode!") + . = ..() + . += "You can't tell when it will explode!" diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm index 09fdfe5a27f..b8372f18a1e 100644 --- a/code/game/objects/items/weapons/grenades/grenade.dm +++ b/code/game/objects/items/weapons/grenades/grenade.dm @@ -48,12 +48,12 @@ /obj/item/grenade/examine(mob/user) - ..(user) + . = ..() if(display_timer) if(det_time > 1) - to_chat(user, "The timer is set to [det_time/10] second\s.") + . += "The timer is set to [det_time/10] second\s." else - to_chat(user, "\The [src] is set for instant detonation.") + . += "\The [src] is set for instant detonation." /obj/item/grenade/attack_self(mob/user as mob) if(!active) diff --git a/code/game/objects/items/weapons/holy_weapons.dm b/code/game/objects/items/weapons/holy_weapons.dm index d496d7a9f01..33d72c1ebb5 100644 --- a/code/game/objects/items/weapons/holy_weapons.dm +++ b/code/game/objects/items/weapons/holy_weapons.dm @@ -47,7 +47,7 @@ /obj/item/nullrod/examine(mob/living/user) . = ..() if(sanctify_force) - to_chat(user, "It bears the inscription: 'Sanctified weapon of the inquisitors. Only the worthy may wield. Nobody shall expect us.'") + . += "It bears the inscription: 'Sanctified weapon of the inquisitors. Only the worthy may wield. Nobody shall expect us.'" /obj/item/nullrod/proc/reskin_holy_weapon(mob/M) var/list/holy_weapons_list = typesof(/obj/item/nullrod) diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index 52e0b24ec4d..a2e5791851d 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -330,10 +330,10 @@ add_fingerprint(user) /obj/item/melee/energy/cleaving_saw/examine(mob/user) - ..() - to_chat(user, "It is [active ? "open, will cleave enemies in a wide arc and deal additional damage to fauna":"closed, and can be used for rapid consecutive attacks that cause fauna to bleed"].
      \ + . = ..() + . += "It is [active ? "open, will cleave enemies in a wide arc and deal additional damage to fauna":"closed, and can be used for rapid consecutive attacks that cause fauna to bleed"].
      \ Both modes will build up existing bleed effects, doing a burst of high damage if the bleed is built up high enough.
      \ - Transforming it immediately after an attack causes the next attack to come out faster.
      ") + Transforming it immediately after an attack causes the next attack to come out faster.
      " /obj/item/melee/energy/cleaving_saw/suicide_act(mob/user) user.visible_message("[user] is [active ? "closing [src] on [user.p_their()] neck" : "opening [src] into [user.p_their()] chest"]! It looks like [user.p_theyre()] trying to commit suicide!") diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm index 7c5c6f9421f..a98ebed84da 100644 --- a/code/game/objects/items/weapons/mop.dm +++ b/code/game/objects/items/weapons/mop.dm @@ -106,8 +106,8 @@ reagents.add_reagent(refill_reagent, refill_rate) /obj/item/mop/advanced/examine(mob/user) - ..() - to_chat(user, "The condenser switch is set to [refill_enabled ? "ON" : "OFF"].") + . = ..() + . += "The condenser switch is set to [refill_enabled ? "ON" : "OFF"]." /obj/item/mop/advanced/Destroy() if(refill_enabled) diff --git a/code/game/objects/items/weapons/pneumaticCannon.dm b/code/game/objects/items/weapons/pneumaticCannon.dm index 503228e58d7..a73bb3249d4 100644 --- a/code/game/objects/items/weapons/pneumaticCannon.dm +++ b/code/game/objects/items/weapons/pneumaticCannon.dm @@ -22,16 +22,14 @@ return ..() /obj/item/pneumatic_cannon/examine(mob/user) - ..() + . = ..() if(!in_range(user, src)) - to_chat(user, "You'll need to get closer to see any more.") - return - for(var/obj/item/I in loadedItems) - spawn(0) - to_chat(user, "[bicon(I)] It has \the [I] loaded.") - if(tank) - to_chat(user, "[bicon(tank)] It has \the [tank] mounted onto it.") - + . += "You'll need to get closer to see any more." + else + if(tank) + . += "[bicon(tank)] It has \the [tank] mounted onto it." + for(var/obj/item/I in loadedItems) + . += "[bicon(I)] It has \the [I] loaded." /obj/item/pneumatic_cannon/attackby(obj/item/W, mob/user, params) ..() diff --git a/code/game/objects/items/weapons/powerfist.dm b/code/game/objects/items/weapons/powerfist.dm index a2315544d35..7dbe16a668a 100644 --- a/code/game/objects/items/weapons/powerfist.dm +++ b/code/game/objects/items/weapons/powerfist.dm @@ -21,12 +21,11 @@ return ..() /obj/item/melee/powerfist/examine(mob/user) - ..() + . = ..() if(!in_range(user, src)) - to_chat(user, "You'll need to get closer to see any more.") - return - if(tank) - to_chat(user, "[bicon(tank)] It has [tank] mounted onto it.") + . += "You'll need to get closer to see any more." + else if(tank) + . += "[bicon(tank)] It has [tank] mounted onto it." /obj/item/melee/powerfist/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/tank)) diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 0fefed4323a..32d8c4d14fa 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -29,20 +29,20 @@ /obj/item/storage/backpack/examine(mob/user) var/space_used = 0 - if(!..(user, 1)) - return - for(var/obj/item/I in contents) - space_used += I.w_class - if(!space_used) - to_chat(user, " [src] is empty.") - else if(space_used <= max_combined_w_class*0.6) - to_chat(user, " [src] still has plenty of remaining space.") - else if(space_used <= max_combined_w_class*0.8) - to_chat(user, " [src] is beginning to run out of space.") - else if(space_used < max_combined_w_class) - to_chat(user, " [src] doesn't have much space left.") - else - to_chat(user, " [src] is full.") + . = ..() + if(in_range(user, src)) + for(var/obj/item/I in contents) + space_used += I.w_class + if(!space_used) + . += " [src] is empty." + else if(space_used <= max_combined_w_class*0.6) + . += " [src] still has plenty of remaining space." + else if(space_used <= max_combined_w_class*0.8) + . += " [src] is beginning to run out of space." + else if(space_used < max_combined_w_class) + . += " [src] doesn't have much space left." + else + . += " [src] is full." /* * Backpack Types diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index 603a86b072b..027910ebcb4 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -26,15 +26,15 @@ return /obj/item/storage/fancy/examine(mob/user) - if(!..(user, 1)) - return - - if(contents.len <= 0) - to_chat(user, "There are no [src.icon_type]s left in the box.") - else if(contents.len == 1) - to_chat(user, "There is one [src.icon_type] left in the box.") - else - to_chat(user, "There are [src.contents.len] [src.icon_type]s in the box.") + . = ..() + if(in_range(user, src)) + var/len = LAZYLEN(contents) + if(len <= 0) + . += "There are no [src.icon_type]s left in the box." + else if(len == 1) + . += "There is one [src.icon_type] left in the box." + else + . += "There are [src.contents.len] [src.icon_type]s in the box." diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm index aeaa7991420..a91d1e10f62 100644 --- a/code/game/objects/items/weapons/storage/secure.dm +++ b/code/game/objects/items/weapons/storage/secure.dm @@ -28,8 +28,9 @@ max_combined_w_class = 14 /obj/item/storage/secure/examine(mob/user) - if(..(user, 1)) - to_chat(user, text("The service panel is [open ? "open" : "closed"].")) + . = ..() + if(in_range(user, src)) + . += "The service panel is [open ? "open" : "closed"]." /obj/item/storage/secure/attackby(obj/item/W as obj, mob/user as mob, params) if(locked) diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index 6d81cdd2dac..6fba277ec35 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -73,13 +73,13 @@ icon_state = "[base_icon]" /obj/item/melee/baton/examine(mob/user) - ..(user) + . = ..() if(isrobot(loc)) - to_chat(user, "This baton is drawing power directly from your own internal charge.") + . += "This baton is drawing power directly from your own internal charge." if(bcell) - to_chat(user, "The baton is [round(bcell.percent())]% charged.") + . += "The baton is [round(bcell.percent())]% charged." if(!bcell) - to_chat(user, "The baton does not have a power source installed.") + . += "The baton does not have a power source installed." /obj/item/melee/baton/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/stock_parts/cell)) diff --git a/code/game/objects/items/weapons/tanks/jetpack.dm b/code/game/objects/items/weapons/tanks/jetpack.dm index 21f43073b73..d7da7044d7c 100644 --- a/code/game/objects/items/weapons/tanks/jetpack.dm +++ b/code/game/objects/items/weapons/tanks/jetpack.dm @@ -35,11 +35,9 @@ /obj/item/tank/jetpack/examine(mob/user) - if(!..(user, 0)) - return - - if(air_contents.oxygen < 10) - to_chat(user, "The meter on [src] indicates you are almost out of air!") + . = ..() + if(get_dist(user, src) <= 0 && air_contents.oxygen < 10) + . += "The meter on [src] indicates you are almost out of air!" playsound(user, 'sound/effects/alert.ogg', 50, 1) @@ -156,11 +154,9 @@ air_contents.carbon_dioxide = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) /obj/item/tank/jetpack/carbondioxide/examine(mob/user) - if(!..(user, 0)) - return - - if(air_contents.carbon_dioxide < 10) - to_chat(user, "The meter on [src] indicates you are almost out of air!") + . = ..() + if(get_dist(user, src) <= 0 && air_contents.carbon_dioxide < 10) + . += "The meter on [src] indicates you are almost out of air!" playsound(user, 'sound/effects/alert.ogg', 50, 1) /obj/item/tank/jetpack/suit @@ -229,8 +225,7 @@ actions_types = list(/datum/action/item_action/toggle_jetpack, /datum/action/item_action/jetpack_stabilization) /obj/item/tank/jetpack/rig/examine() - to_chat(usr, "It's a jetpack. If you can see this, report it on the bug tracker.") - return 0 + . = list("It's a jetpack. If you can see this, report it on the bug tracker.") /obj/item/tank/jetpack/rig/allow_thrust(num, mob/living/user) if(!on) diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm index fc4f3438aa1..55b0225bc2d 100644 --- a/code/game/objects/items/weapons/tanks/tank_types.dm +++ b/code/game/objects/items/weapons/tanks/tank_types.dm @@ -23,10 +23,9 @@ air_contents.oxygen = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) /obj/item/tank/oxygen/examine(mob/user) - if(..(user, 0)) - if(air_contents.oxygen < 10) - to_chat(user, text("The meter on the [src.name] indicates you are almost out of air!")) - //playsound(usr, 'sound/effects/alert.ogg', 50, 1) + . = ..() + if(get_dist(user, src) <= 0 && air_contents.oxygen < 10) + . += "The meter on [src] indicates you are almost out of air!" obj/item/tank/oxygen/empty/New() ..() @@ -72,10 +71,10 @@ obj/item/tank/oxygen/empty/New() item_state = "air" /obj/item/tank/air/examine(mob/user) - if(..(user, 0)) - if(air_contents.oxygen < 1 && loc==usr) - to_chat(user, "The meter on the [src.name] indicates you are almost out of air!") - user << sound('sound/effects/alert.ogg') + . = ..() + if(get_dist(user, src) <= 0 && air_contents.oxygen < 1) + . += "The meter on [src] indicates you are almost out of air!" + playsound(user, 'sound/effects/alert.ogg', 50, 1) /obj/item/tank/air/New() ..() @@ -121,10 +120,10 @@ obj/item/tank/oxygen/empty/New() distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE /obj/item/tank/plasma/plasmaman/examine(mob/user) - if(..(user, 0)) - if(air_contents.toxins < 0.2 && loc==usr) - to_chat(user, text("The meter on the [src.name] indicates you are almost out of plasma!")) - user << sound('sound/effects/alert.ogg') + . = ..() + if(get_dist(user, src) <= 0 && air_contents.toxins < 0.2) + . += "The meter on [src] indicates you are almost out of plasma!" + playsound(user, 'sound/effects/alert.ogg', 50, 1) /obj/item/tank/plasma/plasmaman/belt @@ -159,10 +158,10 @@ obj/item/tank/oxygen/empty/New() air_contents.oxygen = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) /obj/item/tank/emergency_oxygen/examine(mob/user) - if(..(user, 0)) - if(air_contents.oxygen < 0.2 && loc==usr) - to_chat(user, text("The meter on the [src.name] indicates you are almost out of air!")) - user << sound('sound/effects/alert.ogg') + . = ..() + if(get_dist(user, src) <= 0 && air_contents.oxygen < 0.2) + . += "The meter on [src] indicates you are almost out of air!" + playsound(user, 'sound/effects/alert.ogg', 50, 1) obj/item/tank/emergency_oxygen/empty/New() ..() @@ -215,10 +214,9 @@ obj/item/tank/emergency_oxygen/double/empty/New() air_contents.nitrogen = (3*ONE_ATMOSPHERE)*70/(R_IDEAL_GAS_EQUATION*T20C) /obj/item/tank/nitrogen/examine(mob/user) - if(..(user, 0)) - if(air_contents.nitrogen < 10) - to_chat(user, text("The meter on the [src.name] indicates you are almost out of air!")) - //playsound(usr, 'sound/effects/alert.ogg', 50, 1) + . = ..() + if(get_dist(user, src) <= 0 && air_contents.nitrogen < 10) + . += "The meter on the [src.name] indicates you are almost out of air!" /obj/item/tank/emergency_oxygen/vox name = "vox specialized nitrogen tank" diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index a155cd5c053..bf69b8e8804 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -76,8 +76,7 @@ /obj/item/tank/examine(mob/user) - if(!..(user, 0)) - return + . = ..() var/obj/icon = src if(istype(loc, /obj/item/assembly)) @@ -85,7 +84,7 @@ if(!in_range(src, user)) if(icon == src) - to_chat(user, "It's \a [bicon(icon)][src]! If you want any more information you'll need to get closer.") + . += "It's \a [bicon(icon)][src]! If you want any more information you'll need to get closer." return var/celsius_temperature = air_contents.temperature-T0C @@ -104,9 +103,7 @@ else descriptive = "furiously hot" - to_chat(user, "\The [bicon(icon)][src] feels [descriptive]") - - return + . += "\The [bicon(icon)][src] feels [descriptive]" /obj/item/tank/blob_act() if(prob(50)) diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 7afb1885ea2..ec821a753a9 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -344,8 +344,9 @@ update_icon() /obj/item/weldingtool/examine(mob/user) - if(..(user, 0)) - to_chat(user, "It contains [get_fuel()] unit\s of fuel out of [max_fuel].") + . = ..() + if(get_dist(user, src) <= 0) + . += "It contains [get_fuel()] unit\s of fuel out of [max_fuel]." /obj/item/weldingtool/suicide_act(mob/user) user.visible_message("[user] welds [user.p_their()] every orifice closed! It looks like [user.p_theyre()] trying to commit suicide!") diff --git a/code/game/objects/items/weapons/vending_items.dm b/code/game/objects/items/weapons/vending_items.dm index c3773ccf5ed..46d43320f92 100644 --- a/code/game/objects/items/weapons/vending_items.dm +++ b/code/game/objects/items/weapons/vending_items.dm @@ -28,11 +28,11 @@ . = ..() var/num = get_part_rating() if (num == INFINITY) - to_chat(user, "It's sealed tight, completely full of supplies.") + . += "It's sealed tight, completely full of supplies." else if (num == 0) - to_chat(user, "It's empty!") + . += "It's empty!" else - to_chat(user, "It can restock [num] item\s.") + . += "It can restock [num] item\s." /obj/item/vending_refill/get_part_rating() if (!products || !contraband || !premium) diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 58a2d0464fc..54cdda2a80b 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -160,15 +160,15 @@ return 1 /obj/structure/examine(mob/user) - ..() + . = ..() if(!(resistance_flags & INDESTRUCTIBLE)) if(burn_state == ON_FIRE) - to_chat(user, "It's on fire!") + . += "It's on fire!" if(broken) - to_chat(user, "It appears to be broken.") + . += "It appears to be broken." var/examine_status = examine_status(user) if(examine_status) - to_chat(user, examine_status) + . += examine_status /obj/structure/proc/examine_status(mob/user) //An overridable proc, mostly for falsewalls. var/healthpercent = (obj_integrity/max_integrity) * 100 diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index af57fb360f3..e942215b6cd 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -244,14 +244,13 @@ LINEN BINS /obj/structure/bedsheetbin/examine(mob/user) - ..(user) + . = ..() if(amount < 1) - to_chat(user, "There are no bed sheets in the bin.") - return - if(amount == 1) - to_chat(user, "There is one bed sheet in the bin.") - return - to_chat(user, "There are [amount] bed sheets in the bin.") + . += "There are no bed sheets in the bin." + else if(amount == 1) + . += "There is one bed sheet in the bin." + else + . += "There are [amount] bed sheets in the bin." /obj/structure/bedsheetbin/update_icon() diff --git a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm index d22f0a59a61..affc44cc09d 100644 --- a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm +++ b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm @@ -17,7 +17,7 @@ /obj/structure/closet/fireaxecabinet/examine(mob/user) . = ..() - to_chat(user, "Use a multitool to lock/unlock it.") + . += "Use a multitool to lock/unlock it." /obj/structure/closet/fireaxecabinet/attackby(var/obj/item/O as obj, var/mob/living/user as mob) //Marker -Agouri if(isrobot(user) || locked) diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 497644a1926..623ead7bc62 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -148,12 +148,12 @@ GLOBAL_LIST_INIT(captain_display_cases, list()) start_showpiece_type = /obj/item/gun/projectile/automatic/pistol /obj/structure/displaycase/examine(mob/user) - ..(user) - to_chat(user, "Peering through the glass, you see that it contains:") + . = ..() + . += "Peering through the glass, you see that it contains:" if(occupant) - to_chat(user, "[bicon(occupant)] \A [occupant].") + . += "[bicon(occupant)] \A [occupant]." else - to_chat(user, "Nothing.") + . += "Nothing." /obj/structure/displaycase/proc/dump() if(occupant) diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index b21754cae96..c2c11356d60 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -30,28 +30,28 @@ return ..() /obj/structure/door_assembly/examine(mob/user) - ..() + . = ..() var/doorname = "" if(created_name) doorname = ", written on it is '[created_name]'" switch(state) if(AIRLOCK_ASSEMBLY_NEEDS_WIRES) if(anchored) - to_chat(user, "The anchoring bolts are wrenched in place, but the maintenance panel lacks wiring.") + . += "The anchoring bolts are wrenched in place, but the maintenance panel lacks wiring." else - to_chat(user, "The assembly is welded together, but the anchoring bolts are unwrenched.") + . += "The assembly is welded together, but the anchoring bolts are unwrenched." if(AIRLOCK_ASSEMBLY_NEEDS_ELECTRONICS) - to_chat(user, "The maintenance panel is wired, but the circuit slot is empty.") + . += "The maintenance panel is wired, but the circuit slot is empty." if(AIRLOCK_ASSEMBLY_NEEDS_SCREWDRIVER) - to_chat(user, "The circuit is connected loosely to its slot, but the maintenance panel is unscrewed and open.") + . += "The circuit is connected loosely to its slot, but the maintenance panel is unscrewed and open." if(!mineral && !glass && !noglass) - to_chat(user, "There is a small paper placard on the assembly[doorname]. There are empty slots for glass windows and mineral covers.") + . += "There is a small paper placard on the assembly[doorname]. There are empty slots for glass windows and mineral covers." else if(!mineral && glass && !noglass) - to_chat(user, "There is a small paper placard on the assembly[doorname]. There are empty slots for mineral covers.") + . += "There is a small paper placard on the assembly[doorname]. There are empty slots for mineral covers." else if(mineral && !glass && !noglass) - to_chat(user, "There is a small paper placard on the assembly[doorname]. There are empty slots for glass windows.") + . += "There is a small paper placard on the assembly[doorname]. There are empty slots for glass windows." else - to_chat(user, "There is a small paper placard on the assembly[doorname].") + . += "There is a small paper placard on the assembly[doorname]." /obj/structure/door_assembly/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/pen)) diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index 303862ff66f..1bd5ef9546d 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -29,8 +29,8 @@ has_extinguisher = new/obj/item/extinguisher /obj/structure/extinguisher_cabinet/examine(mob/user) - ..() - to_chat(user, "Alt-click to [opened ? "close":"open"] it.") + . = ..() + . += "Alt-click to [opened ? "close":"open"] it." /obj/structure/extinguisher_cabinet/AltClick(mob/living/user) if(!istype(user) || user.incapacitated()) diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index b3468668f5a..11c0038632f 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -14,16 +14,16 @@ . = ..() switch(state) if(GIRDER_REINF) - to_chat(user, "The support struts are screwed in place.") + . += "The support struts are screwed in place." if(GIRDER_REINF_STRUTS) - to_chat(user, "The support struts are unscrewed and the inner grille is intact.") + . += "The support struts are unscrewed and the inner grille is intact." if(GIRDER_NORMAL) if(can_displace) - to_chat(user, "The bolts are lodged in place.") + . += "The bolts are lodged in place." if(GIRDER_DISPLACED) - to_chat(user, "The bolts are loosened, but the screws are holding [src] together.") + . += "The bolts are loosened, but the screws are holding [src] together." if(GIRDER_DISASSEMBLED) - to_chat(user, "[src] is disassembled! You probably shouldn't be able to see this examine message.") + . += "[src] is disassembled! You probably shouldn't be able to see this examine message." /obj/structure/girder/proc/refundMetal(metalAmount) //refunds metal used in construction when deconstructed for(var/i=0;i < metalAmount;i++) diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 1e3cb331cd1..7635ee49598 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -54,11 +54,11 @@ obj_break() /obj/structure/grille/examine(mob/user) - ..() + . = ..() if(anchored) - to_chat(user, "It's secured in place with screws. The rods look like they could be cut through.") + . += "It's secured in place with screws. The rods look like they could be cut through." if(!anchored) - to_chat(user, "The anchoring screws are unscrewed. The rods look like they could be cut through.") + . += "The anchoring screws are unscrewed. The rods look like they could be cut through." /obj/structure/grille/ratvar_act() if(broken) diff --git a/code/game/objects/structures/guillotine.dm b/code/game/objects/structures/guillotine.dm index 6d32aec248e..eba923d5ea4 100644 --- a/code/game/objects/structures/guillotine.dm +++ b/code/game/objects/structures/guillotine.dm @@ -33,7 +33,7 @@ return ..() /obj/structure/guillotine/examine(mob/user) - ..() + . = ..() var/msg = "" @@ -53,9 +53,7 @@ msg += "
      " msg += "Someone appears to be strapped in. You can help them out, or you can harm them by activating the guillotine." - to_chat(user, msg) - - return msg + . += msg /obj/structure/guillotine/attack_hand(mob/user) add_fingerprint(user) diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index c1233aaee0c..5aab6610f8c 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -22,11 +22,11 @@ QDEL_IN(LAT, 0) /obj/structure/lattice/examine(mob/user) - ..() - deconstruction_hints(user) + . = ..() + . += deconstruction_hints(user) /obj/structure/lattice/proc/deconstruction_hints(mob/user) - to_chat(user, "The rods look like they could be cut. There's space for more rods or a tile.") + return "The rods look like they could be cut. There's space for more rods or a tile." /obj/structure/lattice/attackby(obj/item/C, mob/user, params) if(resistance_flags & INDESTRUCTIBLE) diff --git a/code/game/objects/structures/mop_bucket.dm b/code/game/objects/structures/mop_bucket.dm index f01cc8c41ca..948a39ba93e 100644 --- a/code/game/objects/structures/mop_bucket.dm +++ b/code/game/objects/structures/mop_bucket.dm @@ -21,8 +21,9 @@ return ..() /obj/structure/mopbucket/examine(mob/user) - if(..(user, 1)) - to_chat(usr, "[bicon(src)] [src] contains [reagents.total_volume] units of water left!") + . = ..() + if(in_range(user, src)) + . += "[bicon(src)] [src] contains [reagents.total_volume] units of water left!" /obj/structure/mopbucket/attackby(obj/item/W as obj, mob/user as mob, params) if(istype(W, /obj/item/mop)) diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm index c175dca567b..12586dc742c 100644 --- a/code/game/objects/structures/plasticflaps.dm +++ b/code/game/objects/structures/plasticflaps.dm @@ -13,9 +13,9 @@ . = ..() switch(state) if(PLASTIC_FLAPS_NORMAL) - to_chat(user, "[src] are screwed to the floor.") + . += "[src] are screwed to the floor." if(PLASTIC_FLAPS_DETACHED) - to_chat(user, "[src] are no longer screwed to the floor, and the flaps can be sliced apart.") + . += "[src] are no longer screwed to the floor, and the flaps can be sliced apart." /obj/structure/plasticflaps/attackby(obj/item/W, mob/user, params) add_fingerprint(user) diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm index 68a3081fc22..d847601de18 100644 --- a/code/game/objects/structures/safe.dm +++ b/code/game/objects/structures/safe.dm @@ -79,9 +79,9 @@ GLOBAL_LIST_EMPTY(safes) /obj/structure/safe/examine(mob/user) . = ..() - to_chat(user, "This model appears to have [number_of_tumblers] tumblers.") + . += "This model appears to have [number_of_tumblers] tumblers." if(open) - to_chat(user, "The inside of the the door has numbers written on it: [get_combination()]") + . += "The inside of the the door has numbers written on it: [get_combination()]" /obj/structure/safe/blob_act() return diff --git a/code/game/objects/structures/spirit_board.dm b/code/game/objects/structures/spirit_board.dm index b6f66350f1f..dc82b824e34 100644 --- a/code/game/objects/structures/spirit_board.dm +++ b/code/game/objects/structures/spirit_board.dm @@ -11,8 +11,8 @@ var/lastuser = null /obj/structure/spirit_board/examine(mob/user) - ..(user) - to_chat(user, "[initial(desc)] The planchette is sitting at \"[planchette]\".") + . = ..() + . += "[initial(desc)] The planchette is sitting at \"[planchette]\"." /obj/structure/spirit_board/attack_hand(mob/user as mob) if(..()) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index d4296e1df2f..ba2a80b945f 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -41,11 +41,11 @@ update_icon() /obj/structure/table/examine(mob/user) - ..() - deconstruction_hints(user) + . = ..() + . += deconstruction_hints(user) /obj/structure/table/proc/deconstruction_hints(mob/user) - to_chat(user, "The top is screwed on, but the main bolts are also visible.") + return "The top is screwed on, but the main bolts are also visible." /obj/structure/table/update_icon() if(smooth && !flipped) @@ -648,8 +648,8 @@ max_integrity = 20 /obj/structure/rack/examine(mob/user) - ..() - to_chat(user, "It's held together by a couple of bolts.") + . = ..() + . += "It's held together by a couple of bolts." /obj/structure/rack/CanPass(atom/movable/mover, turf/target, height=0) if(height==0) diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 1124745d8b3..0eee91ee068 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -28,8 +28,8 @@ var/state = "01" //How far the door assembly has progressed /obj/structure/windoor_assembly/examine(mob/user) - ..() - to_chat(user, "Alt-click to rotate it clockwise.") + . = ..() + . += "Alt-click to rotate it clockwise." obj/structure/windoor_assembly/New(loc, set_dir) ..() diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 4090420525d..a083ec96af0 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -49,23 +49,23 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f var/hitsound = 'sound/effects/Glasshit.ogg' /obj/structure/window/examine(mob/user) - ..() + . = ..() if(reinf) if(anchored && state == WINDOW_SCREWED_TO_FRAME) - to_chat(user, "The window is screwed to the frame.") + . += "The window is screwed to the frame." else if(anchored && state == WINDOW_IN_FRAME) - to_chat(user, "The window is unscrewed but pried into the frame.") + . += "The window is unscrewed but pried into the frame." else if(anchored && state == WINDOW_OUT_OF_FRAME) - to_chat(user, "The window is out of the frame, but could be pried in. It is screwed to the floor.") + . += "The window is out of the frame, but could be pried in. It is screwed to the floor." else if(!anchored) - to_chat(user, "The window is unscrewed from the floor, and could be deconstructed by wrenching.") + . += "The window is unscrewed from the floor, and could be deconstructed by wrenching." else if(anchored) - to_chat(user, "The window is screwed to the floor.") + . += "The window is screwed to the floor." else - to_chat(user, "The window is unscrewed from the floor, and could be deconstructed by wrenching.") + . += "The window is unscrewed from the floor, and could be deconstructed by wrenching." if(!anchored && !fulltile) - to_chat(user, "Alt-click to rotate it.") + . += "Alt-click to rotate it." /obj/structure/window/New(Loc, direct) ..() diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm index 7fabcb0b957..b446625a9e9 100644 --- a/code/game/turfs/simulated/floor/plating.dm +++ b/code/game/turfs/simulated/floor/plating.dm @@ -37,7 +37,7 @@ . = ..() if(unfastened) - to_chat(user, "It has been unfastened.") + . += "It has been unfastened." /turf/simulated/floor/plating/attackby(obj/item/C, mob/user, params) if(..()) diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index c0a4aa928d2..ed72fb88993 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -56,21 +56,21 @@ //Appearance /turf/simulated/wall/examine(mob/user) - . = ..(user) + . = ..() if(!damage) - to_chat(user, "It looks fully intact.") + . += "It looks fully intact." else var/dam = damage / damage_cap if(dam <= 0.3) - to_chat(user, "It looks slightly damaged.") + . += "It looks slightly damaged." else if(dam <= 0.6) - to_chat(user, "It looks moderately damaged.") + . += "It looks moderately damaged." else - to_chat(user, "It looks heavily damaged.") + . += "It looks heavily damaged." if(rotting) - to_chat(user, "There is fungus growing on [src].") + . += "There is fungus growing on [src]." /turf/simulated/wall/proc/update_icon() if(!damage_overlays[1]) //list hasn't been populated diff --git a/code/game/turfs/simulated/walls_reinforced.dm b/code/game/turfs/simulated/walls_reinforced.dm index 1ae3332e9b3..ae4d7588b97 100644 --- a/code/game/turfs/simulated/walls_reinforced.dm +++ b/code/game/turfs/simulated/walls_reinforced.dm @@ -17,22 +17,22 @@ var/can_be_reinforced = 1 /turf/simulated/wall/r_wall/examine(mob/user) - ..() + . = ..() switch(d_state) if(RWALL_INTACT) - to_chat(user, "The outer grille is fully intact.") + . += "The outer grille is fully intact." if(RWALL_SUPPORT_LINES) - to_chat(user, "The outer grille has been cut, and the support lines are screwed securely to the outer cover.") + . += "The outer grille has been cut, and the support lines are screwed securely to the outer cover." if(RWALL_COVER) - to_chat(user, "The support lines have been unscrewed, and the metal cover is welded firmly in place.") + . += "The support lines have been unscrewed, and the metal cover is welded firmly in place." if(RWALL_CUT_COVER) - to_chat(user, "The metal cover has been sliced through, and is connected loosely to the girder.") + . += "The metal cover has been sliced through, and is connected loosely to the girder." if(RWALL_BOLTS) - to_chat(user, "The outer cover has been pried away, and the bolts anchoring the support rods are wrenched in place.") + . += "The outer cover has been pried away, and the bolts anchoring the support rods are wrenched in place." if(RWALL_SUPPORT_RODS) - to_chat(user, "The bolts anchoring the support rods have been loosened, but are still welded firmly to the girder.") + . += "The bolts anchoring the support rods have been loosened, but are still welded firmly to the girder." if(RWALL_SHEATH) - to_chat(user, "The support rods have been sliced through, and the outer sheath is connected loosely to the girder.") + . += "The support rods have been sliced through, and the outer sheath is connected loosely to the girder." /turf/simulated/wall/r_wall/attackby(obj/item/I, mob/user, params) if(try_repair(I, user, params)) diff --git a/code/modules/arcade/arcade_base.dm b/code/modules/arcade/arcade_base.dm index c3158e9ccba..38c034927bc 100644 --- a/code/modules/arcade/arcade_base.dm +++ b/code/modules/arcade/arcade_base.dm @@ -22,18 +22,18 @@ qdel(src) /obj/machinery/arcade/examine(mob/user) - ..(user) + . = ..() if(freeplay) - to_chat(user, "Someone enabled freeplay on this machine!") + . += "Someone enabled freeplay on this machine!" else if(token_price) - to_chat(user, "\The [src.name] costs [token_price] credits per play.") + . += "\The [src.name] costs [token_price] credits per play." if(!tokens) - to_chat(user, "\The [src.name] has no available play credits. Better feed the machine!") + . += "\The [src.name] has no available play credits. Better feed the machine!" else if(tokens == 1) - to_chat(user, "\The [src.name] has only 1 play credit left!") + . += "\The [src.name] has only 1 play credit left!" else - to_chat(user, "\The [src.name] has [tokens] play credits!") + . += "\The [src.name] has [tokens] play credits!" /obj/machinery/arcade/attack_hand(mob/user as mob) if(..()) diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm index 5e0b463af30..d8ee727f2f8 100644 --- a/code/modules/assembly/assembly.dm +++ b/code/modules/assembly/assembly.dm @@ -128,12 +128,12 @@ STOP_PROCESSING(SSobj, src) /obj/item/assembly/examine(mob/user) - ..() + . = ..() if(in_range(src, user) || loc == user) if(secured) - to_chat(user, "[src] is ready!") + . += "[src] is ready!" else - to_chat(user, "[src] can be attached!") + . += "[src] can be attached!" /obj/item/assembly/attack_self(mob/user) if(!user) diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm index 058dd4cd0f2..e0454d5f5ea 100644 --- a/code/modules/assembly/bomb.dm +++ b/code/modules/assembly/bomb.dm @@ -13,8 +13,8 @@ origin_tech = "materials=1;engineering=1" /obj/item/onetankbomb/examine(mob/user) - ..(user) - user.examinate(bombtank) + . = ..() + . += bombtank.examine(user) /obj/item/onetankbomb/update_icon() if(bombtank) diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index d19682d1eb9..ac4613575e8 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -70,12 +70,12 @@ /obj/item/assembly_holder/examine(mob/user) - ..(user) + . = ..() if(in_range(src, user) || loc == user) if(secured) - to_chat(user, "[src] is ready!") + . += "[src] is ready!" else - to_chat(user, "[src] can be attached!") + . += "[src] can be attached!" /obj/item/assembly_holder/HasProximity(atom/movable/AM) diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index 37f5916d535..b9d3ee2afc1 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -29,8 +29,8 @@ return "The assembly is [secured ? "secure" : "not secure"]. The infrared trigger is [on ? "on" : "off"]." /obj/item/assembly/infra/examine(mob/user) - ..() - to_chat(user, describe()) + . = ..() + . += describe() /obj/item/assembly/infra/activate() if(!..()) diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index 3610ec8b451..912eff95981 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -9,9 +9,9 @@ bomb_name = "contact mine" /obj/item/assembly/mousetrap/examine(mob/user) - ..(user) + . = ..() if(armed) - to_chat(user, "It looks like it's armed.") + . += "It looks like it's armed." /obj/item/assembly/mousetrap/activate() if(..()) diff --git a/code/modules/awaymissions/mission_code/spacehotel.dm b/code/modules/awaymissions/mission_code/spacehotel.dm index d2fda046d7e..e9c74d73ea9 100644 --- a/code/modules/awaymissions/mission_code/spacehotel.dm +++ b/code/modules/awaymissions/mission_code/spacehotel.dm @@ -121,8 +121,8 @@ return ..() /obj/machinery/door/unpowered/hotel_door/examine(mob/user) - ..() - to_chat(user, "This room is currently [occupant ? "" : "un"]occupied.") + . = ..() + . += "This room is currently [occupant ? "" : "un"]occupied." /obj/machinery/door/unpowered/hotel_door/allowed(mob/living/carbon/user) for(var/obj/item/card/hotel_card/C in user.get_all_slots()) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index d37c6fe9807..a65f6819d81 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -710,19 +710,19 @@ BLIND // can't see anything return FALSE /obj/item/clothing/under/examine(mob/user) - ..(user) - switch(src.sensor_mode) + . = ..() + switch(sensor_mode) if(0) - to_chat(user, "Its sensors appear to be disabled.") + . += "Its sensors appear to be disabled." if(1) - to_chat(user, "Its binary life sensors appear to be enabled.") + . += "Its binary life sensors appear to be enabled." if(2) - to_chat(user, "Its vital tracker appears to be enabled.") + . += "Its vital tracker appears to be enabled." if(3) - to_chat(user, "Its vital tracker and tracking beacon appear to be enabled.") + . += "Its vital tracker and tracking beacon appear to be enabled." if(accessories.len) for(var/obj/item/clothing/accessory/A in accessories) - to_chat(user, "\A [A] is attached to it.") + . += "\A [A] is attached to it." /obj/item/clothing/under/verb/rollsuit() diff --git a/code/modules/clothing/gloves/rings.dm b/code/modules/clothing/gloves/rings.dm index 9a512ca2cd5..6bef80bfe6d 100644 --- a/code/modules/clothing/gloves/rings.dm +++ b/code/modules/clothing/gloves/rings.dm @@ -21,11 +21,11 @@ icon_state = initial(icon_state) /obj/item/clothing/gloves/ring/examine(mob/user) - ..(user) + . = ..() if(!fluff_material) - to_chat(user, "This one is made of [material].") + . += "This one is made of [material]." if(stud) - to_chat(user, "It is adorned with a single gem.") + . += "It is adorned with a single gem." /obj/item/clothing/gloves/ring/attackby(obj/item/I as obj, mob/user as mob, params) if(istype(I, /obj/item/stack/sheet/mineral/diamond)) diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index 7a5bd2255da..b029f180fa7 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -33,8 +33,8 @@ return flags & NOSLIP /obj/item/clothing/shoes/magboots/examine(mob/user) - ..(user) - to_chat(user, "Its [magpulse_name] appears to be [magpulse ? "enabled" : "disabled"].") + . = ..() + . += "Its [magpulse_name] appears to be [magpulse ? "enabled" : "disabled"]." /obj/item/clothing/shoes/magboots/advance diff --git a/code/modules/clothing/spacesuits/alien.dm b/code/modules/clothing/spacesuits/alien.dm index 620ed257a09..c52fe271966 100644 --- a/code/modules/clothing/spacesuits/alien.dm +++ b/code/modules/clothing/spacesuits/alien.dm @@ -233,6 +233,6 @@ flags &= ~NODROP /obj/item/clothing/shoes/magboots/vox/examine(mob/user) - ..(user) + . = ..() if(magpulse) - to_chat(user, "It would be hard to take these off without relaxing your grip first.")//theoretically this message should only be seen by the wearer when the claws are equipped. + . += "It would be hard to take these off without relaxing your grip first."//theoretically this message should only be seen by the wearer when the claws are equipped. diff --git a/code/modules/clothing/spacesuits/breaches.dm b/code/modules/clothing/spacesuits/breaches.dm index d47f06b125b..c8891fde00d 100644 --- a/code/modules/clothing/spacesuits/breaches.dm +++ b/code/modules/clothing/spacesuits/breaches.dm @@ -215,7 +215,7 @@ var/global/list/breach_burn_descriptors = list( ..() /obj/item/clothing/suit/space/examine(mob/user) - ..(user) + . = ..() if(can_breach && breaches && breaches.len) for(var/datum/breach/B in breaches) - to_chat(user, "It has \a [B.descriptor].") + . += "It has \a [B.descriptor]." diff --git a/code/modules/clothing/spacesuits/ert.dm b/code/modules/clothing/spacesuits/ert.dm index 416aaace5a3..9f4590038be 100644 --- a/code/modules/clothing/spacesuits/ert.dm +++ b/code/modules/clothing/spacesuits/ert.dm @@ -26,8 +26,9 @@ to_chat(user, "User scanned as [camera.c_tag]. Camera activated.") /obj/item/clothing/head/helmet/space/hardsuit/ert/examine(mob/user) - if(..(user, 1) && has_camera) - to_chat(user, "This helmet has a built-in camera. It's [camera ? "" : "in"]active.") + . = ..() + if(in_range(user, src) && has_camera) + . += "This helmet has a built-in camera. It's [camera ? "" : "in"]active." /obj/item/clothing/suit/space/hardsuit/ert name = "emergency response team suit" diff --git a/code/modules/clothing/spacesuits/rig/modules/modules.dm b/code/modules/clothing/spacesuits/rig/modules/modules.dm index 12df59f70d7..19c10a31c58 100644 --- a/code/modules/clothing/spacesuits/rig/modules/modules.dm +++ b/code/modules/clothing/spacesuits/rig/modules/modules.dm @@ -55,15 +55,15 @@ var/list/stat_rig_module/stat_modules = new() -/obj/item/rig_module/examine() - ..() +/obj/item/rig_module/examine(mob/user) + . = ..() switch(damage) if(0) - to_chat(usr, "It is undamaged.") + . += "It is undamaged." if(1) - to_chat(usr, "It is badly damaged.") + . += "It is badly damaged." if(2) - to_chat(usr, "It is almost completely destroyed.") + . += "It is almost completely destroyed." /obj/item/rig_module/attackby(obj/item/W as obj, mob/user as mob) diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index b463a513764..dd1a6a895c3 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -84,18 +84,18 @@ var/datum/wires/rig/wires var/datum/effect_system/spark_spread/spark_system -/obj/item/rig/examine() - to_chat(usr, "This is [bicon(src)][src.name].") - to_chat(usr, "[src.desc]") +/obj/item/rig/examine(mob/user) + . = list("This is [src].") + . += "[desc]" if(wearer) for(var/obj/item/piece in list(helmet,gloves,chest,boots)) if(!piece || piece.loc != wearer) continue - to_chat(usr, "[bicon(piece)] \The [piece] [piece.gender == PLURAL ? "are" : "is"] deployed.") + . += "[bicon(piece)] \The [piece] [piece.gender == PLURAL ? "are" : "is"] deployed." - if(src.loc == usr) - to_chat(usr, "The maintenance panel is [open ? "open" : "closed"].") - to_chat(usr, "Hardsuit systems are [offline ? "offline" : "online"].") + if(loc == usr) + . += "The maintenance panel is [open ? "open" : "closed"]." + . += "Hardsuit systems are [offline ? "offline" : "online"]." /obj/item/rig/get_cell() return cell diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm index 9b1a0dbc146..216ac78f450 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -665,9 +665,9 @@ return access_id ? access_id.GetAccess() : ..() /obj/item/clothing/accessory/petcollar/examine(mob/user) - ..() + . = ..() if(access_id) - to_chat(user, "There is [bicon(access_id)] \a [access_id] clipped onto it.") + . += "There is [bicon(access_id)] \a [access_id] clipped onto it." /obj/item/clothing/accessory/petcollar/equipped(mob/living/simple_animal/user) if(istype(user)) diff --git a/code/modules/clothing/under/accessories/holster.dm b/code/modules/clothing/under/accessories/holster.dm index 29b89e8418d..9da7223be0c 100644 --- a/code/modules/clothing/under/accessories/holster.dm +++ b/code/modules/clothing/under/accessories/holster.dm @@ -87,11 +87,11 @@ ..() /obj/item/clothing/accessory/holster/examine(mob/user) - ..(user) + . = ..() if(holstered) - to_chat(user, "A [holstered] is holstered here.") + . += "A [holstered] is holstered here." else - to_chat(user, "It is empty.") + . += "It is empty." /obj/item/clothing/accessory/holster/on_attached(obj/item/clothing/under/S, mob/user as mob) ..() diff --git a/code/modules/clothing/under/jobs/plasmamen/_plasmamen.dm b/code/modules/clothing/under/jobs/plasmamen/_plasmamen.dm index 5c38361e0b2..617e0284848 100644 --- a/code/modules/clothing/under/jobs/plasmamen/_plasmamen.dm +++ b/code/modules/clothing/under/jobs/plasmamen/_plasmamen.dm @@ -15,8 +15,8 @@ item_color = "plasmaman" /obj/item/clothing/under/plasmaman/examine(mob/user) - ..() - to_chat(user, "There are [extinguishes_left] extinguisher charges left in this suit.") + . = ..() + . += "There are [extinguishes_left] extinguisher charges left in this suit." /obj/item/clothing/under/plasmaman/proc/Extinguish(mob/living/carbon/human/H) if(!istype(H)) diff --git a/code/modules/countdown/countdown.dm b/code/modules/countdown/countdown.dm index 8769e5e321a..d8094f5bdf3 100644 --- a/code/modules/countdown/countdown.dm +++ b/code/modules/countdown/countdown.dm @@ -20,7 +20,7 @@ /obj/effect/countdown/examine(mob/user) . = ..() - to_chat(user, "This countdown is displaying: [displayed_text]") + . += "This countdown is displaying: [displayed_text]" /obj/effect/countdown/proc/attach(atom/A) attached_to = A diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index c7330151b00..ef02ce39b1a 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -423,7 +423,7 @@ color = "#ffffff" /obj/structure/spacevine/examine(mob/user) - ..() + . = ..() var/text = "This one is a" if(mutations.len) for(var/A in mutations) @@ -432,7 +432,7 @@ else text += " normal" text += " vine." - to_chat(user, text) + . += text /obj/structure/spacevine/proc/wither() for(var/datum/spacevine_mutation/SM in mutations) diff --git a/code/modules/fish/fishtank.dm b/code/modules/fish/fishtank.dm index 33acde9861d..f827b061b93 100644 --- a/code/modules/fish/fishtank.dm +++ b/code/modules/fish/fishtank.dm @@ -369,7 +369,7 @@ ////////////////////////////// Feel free to try cleaning it up if you think of a better way to do it. /obj/machinery/fishtank/examine(mob/user) - ..(user) + . = ..() var/examine_message = "" //Approximate water level @@ -474,8 +474,7 @@ //Finally, report the full examine_message constructed from the above reports - to_chat(user, "[examine_message]") - return examine_message + . += "[examine_message]" ////////////////////////////// // ATACK PROCS // diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm index d85b882e7db..57a4e4e9bcc 100644 --- a/code/modules/food_and_drinks/drinks/drinks.dm +++ b/code/modules/food_and_drinks/drinks/drinks.dm @@ -108,19 +108,19 @@ return FALSE /obj/item/reagent_containers/food/drinks/examine(mob/user) - if(!..(user, 1)) - return - if(!reagents || reagents.total_volume == 0) - to_chat(user, " \The [src] is empty!") - else if(reagents.total_volume <= volume/4) - to_chat(user, " \The [src] is almost empty!") - else if(reagents.total_volume <= volume*0.66) - to_chat(user, " \The [src] is half full!")// We're all optimistic, right?! + . = ..() + if(in_range(user, src)) + if(!reagents || reagents.total_volume == 0) + . += " \The [src] is empty!" + else if(reagents.total_volume <= volume/4) + . += " \The [src] is almost empty!" + else if(reagents.total_volume <= volume*0.66) + . += " \The [src] is half full!"// We're all optimistic, right?! - else if(reagents.total_volume <= volume*0.90) - to_chat(user, " \The [src] is almost full!") - else - to_chat(user, " \The [src] is full!") + else if(reagents.total_volume <= volume*0.90) + . += " \The [src] is almost full!" + else + . += " \The [src] is full!" //////////////////////////////////////////////////////////////////////////////// /// Drinks. END diff --git a/code/modules/food_and_drinks/food/customizables.dm b/code/modules/food_and_drinks/food/customizables.dm index bebef085297..ef2ad5f777b 100644 --- a/code/modules/food_and_drinks/food/customizables.dm +++ b/code/modules/food_and_drinks/food/customizables.dm @@ -387,10 +387,10 @@ return ..() /obj/item/reagent_containers/food/snacks/customizable/examine(mob/user) - ..(user) + . = ..() if(LAZYLEN(ingredients)) var/whatsinside = pick(ingredients) - to_chat(user, " You think you can see [whatsinside] in there.") + . += " You think you can see [whatsinside] in there." /obj/item/reagent_containers/food/snacks/customizable/proc/newname() diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm index 672285b84d3..b2f0f5eb690 100644 --- a/code/modules/food_and_drinks/food/snacks.dm +++ b/code/modules/food_and_drinks/food/snacks.dm @@ -71,15 +71,15 @@ return /obj/item/reagent_containers/food/snacks/examine(mob/user) - if(..(user, 0)) - if(bitecount==0) - return - else if(bitecount==1) - to_chat(user, "[src] was bitten by someone!") - else if(bitecount<=3) - to_chat(user, "[src] was bitten [bitecount] times!") - else - to_chat(user, "[src] was bitten multiple times!") + . = ..() + if(in_range(user, src)) + if(bitecount > 0) + if(bitecount==1) + . += "[src] was bitten by someone!" + else if(bitecount<=3) + . += "[src] was bitten [bitecount] times!" + else + . += "[src] was bitten multiple times!" /obj/item/reagent_containers/food/snacks/attackby(obj/item/W, mob/user, params) @@ -180,7 +180,7 @@ /obj/item/reagent_containers/food/snacks/sliceable/examine(mob/user) . = ..() - to_chat(user, "Alt-click to put something small inside.") + . += "Alt-click to put something small inside." /obj/item/reagent_containers/food/snacks/sliceable/AltClick(mob/user) var/obj/item/I = user.get_active_hand() diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm index 872bdc8e327..7be44052729 100644 --- a/code/modules/games/cards.dm +++ b/code/modules/games/cards.dm @@ -39,8 +39,8 @@ ..() /obj/item/deck/examine(mob/user) - ..() - to_chat(user,"It contains [cards.len ? cards.len : "no"] cards") + . = ..() + . +="It contains [cards.len ? cards.len : "no"] cards" /obj/item/deck/attack_hand(mob/user as mob) draw_card(user) @@ -313,11 +313,11 @@ user.visible_message("[user] [concealed ? "conceals" : "reveals"] their hand.") /obj/item/cardhand/examine(mob/user) - ..(user) + . = ..() if((!concealed) && cards.len) - to_chat(user,"It contains:") + . +="It contains:" for(var/datum/playingcard/P in cards) - to_chat(user,"the [P.name].") + . +="the [P.name]." // Datum action here diff --git a/code/modules/hydroponics/beekeeping/beebox.dm b/code/modules/hydroponics/beekeeping/beebox.dm index 21ba7cb89e2..ef1a10cd85f 100644 --- a/code/modules/hydroponics/beekeeping/beebox.dm +++ b/code/modules/hydroponics/beekeeping/beebox.dm @@ -127,25 +127,25 @@ /obj/structure/beebox/examine(mob/user) - ..() + . = ..() if(!queen_bee) - to_chat(user, "There is no queen bee! There won't bee any honeycomb without a queen!") + . += "There is no queen bee! There won't bee any honeycomb without a queen!" var/half_bee = get_max_bees()*0.5 if(half_bee && (bees.len >= half_bee)) - to_chat(user, "This place is a BUZZ with activity... there are lots of bees!") + . += "This place is a BUZZ with activity... there are lots of bees!" - to_chat(user, "[bee_resources]/100 resource supply.") - to_chat(user, "[bee_resources]% towards a new honeycomb.") - to_chat(user, "[bee_resources*2]% towards a new bee.") + . += "[bee_resources]/100 resource supply." + . += "[bee_resources]% towards a new honeycomb." + . += "[bee_resources*2]% towards a new bee." if(honeycombs.len) var/plural = honeycombs.len > 1 - to_chat(user, "There [plural? "are" : "is"] [honeycombs.len] uncollected honeycomb[plural ? "s":""] in the apiary.") + . += "There [plural? "are" : "is"] [honeycombs.len] uncollected honeycomb[plural ? "s":""] in the apiary." if(honeycombs.len >= get_max_honeycomb()) - to_chat(user, "there's no room for more honeycomb!") + . += "there's no room for more honeycomb!" /obj/structure/beebox/attackby(obj/item/I, mob/user, params) diff --git a/code/modules/hydroponics/fermenting_barrel.dm b/code/modules/hydroponics/fermenting_barrel.dm index e701406897c..f194c48e019 100644 --- a/code/modules/hydroponics/fermenting_barrel.dm +++ b/code/modules/hydroponics/fermenting_barrel.dm @@ -17,7 +17,7 @@ /obj/structure/fermenting_barrel/examine(mob/user) . = ..() - to_chat(user, "It is currently [open ? "open, letting you pour liquids in." : "closed, letting you draw liquids from the tap."] ") + . += "It is currently [open ? "open, letting you pour liquids in." : "closed, letting you draw liquids from the tap."] " /obj/structure/fermenting_barrel/proc/makeWine(obj/item/reagent_containers/food/snacks/grown/G) if(G.reagents) diff --git a/code/modules/hydroponics/gene_modder.dm b/code/modules/hydroponics/gene_modder.dm index 87c98f211f6..17246d6cba1 100644 --- a/code/modules/hydroponics/gene_modder.dm +++ b/code/modules/hydroponics/gene_modder.dm @@ -479,8 +479,8 @@ to_chat(user, "You flip the write-protect tab to [read_only ? "protected" : "unprotected"].") /obj/item/disk/plantgene/examine(mob/user) - ..() - to_chat(user, "The write-protect tab is set to [read_only ? "protected" : "unprotected"].") + . = ..() + . += "The write-protect tab is set to [read_only ? "protected" : "unprotected"]." /* diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 63d21bced03..c64faba07ad 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -55,11 +55,11 @@ return 0 /obj/item/reagent_containers/food/snacks/grown/examine(user) - ..() + . = ..() if(seed) for(var/datum/plant_gene/trait/T in seed.genes) if(T.examine_line) - to_chat(user, T.examine_line) + . += T.examine_line /obj/item/reagent_containers/food/snacks/grown/attackby(obj/item/O, mob/user, params) ..() diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 2d3adacefbf..7e31c1a7b7e 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -339,32 +339,32 @@ /obj/machinery/hydroponics/examine(user) - ..() + . = ..() if(myseed) - to_chat(user, "It has [myseed.plantname] planted.") + . += "It has [myseed.plantname] planted." if (dead) - to_chat(user, "It's dead!") + . += "It's dead!" else if (harvest) - to_chat(user, "It's ready to harvest.") + . += "It's ready to harvest." else if (plant_health <= (myseed.endurance / 2)) - to_chat(user, "It looks unhealthy.") + . += "It looks unhealthy." else - to_chat(user, "[src] is empty.") + . += "[src] is empty." if(!self_sustaining) - to_chat(user, "Water: [waterlevel]/[maxwater]") - to_chat(user, "Nutrient: [nutrilevel]/[maxnutri]") + . += "Water: [waterlevel]/[maxwater]" + . += "Nutrient: [nutrilevel]/[maxnutri]" if(self_sufficiency_progress > 0) var/percent_progress = round(self_sufficiency_progress * 100 / self_sufficiency_req) - to_chat(user, "Treatment for self-sustenance are [percent_progress]% complete.") + . += "Treatment for self-sustenance are [percent_progress]% complete." else - to_chat(user, "It doesn't require any water or nutrients.") + . += "It doesn't require any water or nutrients." if(weedlevel >= 5) - to_chat(user, "[src] is filled with weeds!") + . += "[src] is filled with weeds!" if(pestlevel >= 5) - to_chat(user, "[src] is filled with tiny worms!") - to_chat(user, "") // Empty line for readability. + . += "[src] is filled with tiny worms!" + . += "" // Empty line for readability. /obj/machinery/hydroponics/proc/weedinvasion() // If a weed growth is sufficient, this happens. diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index d340e6069cc..df943d6f30d 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -32,12 +32,12 @@ return ..() /obj/item/twohanded/kinetic_crusher/examine(mob/living/user) - ..() - to_chat(user, "Mark a large creature with the destabilizing force, then hit them in melee to do [force + detonation_damage] damage.") - to_chat(user, "Does [force + detonation_damage + backstab_bonus] damage if the target is backstabbed, instead of [force + detonation_damage].") + . = ..() + . += "Mark a large creature with the destabilizing force, then hit them in melee to do [force + detonation_damage] damage." + . += "Does [force + detonation_damage + backstab_bonus] damage if the target is backstabbed, instead of [force + detonation_damage]." for(var/t in trophies) var/obj/item/crusher_trophy/T = t - to_chat(user, "It has \a [T] attached, which causes [T.effect_desc()].") + . += "It has \a [T] attached, which causes [T.effect_desc()]." /obj/item/twohanded/kinetic_crusher/attackby(obj/item/I, mob/living/user) if(iscrowbar(I)) @@ -191,8 +191,8 @@ var/denied_type = /obj/item/crusher_trophy /obj/item/crusher_trophy/examine(mob/living/user) - ..() - to_chat(user, "Causes [effect_desc()] when attached to a kinetic crusher.") + . = ..() + . += "Causes [effect_desc()] when attached to a kinetic crusher." /obj/item/crusher_trophy/proc/effect_desc() return "errors" diff --git a/code/modules/mining/equipment/lazarus_injector.dm b/code/modules/mining/equipment/lazarus_injector.dm index 0f174ff748f..e2a7c192153 100644 --- a/code/modules/mining/equipment/lazarus_injector.dm +++ b/code/modules/mining/equipment/lazarus_injector.dm @@ -59,11 +59,11 @@ malfunctioning = 1 /obj/item/lazarus_injector/examine(mob/user) - ..(user) + . = ..() if(!loaded) - to_chat(user, "[src] is empty.") + . += "[src] is empty." if(malfunctioning) - to_chat(user, "The display on [src] seems to be flickering.") + . += "The display on [src] seems to be flickering." /*********************Mob Capsule*************************/ diff --git a/code/modules/mining/equipment/marker_beacons.dm b/code/modules/mining/equipment/marker_beacons.dm index 3a31e59cd55..9ae6bb19fa0 100644 --- a/code/modules/mining/equipment/marker_beacons.dm +++ b/code/modules/mining/equipment/marker_beacons.dm @@ -35,9 +35,9 @@ GLOBAL_LIST_INIT(marker_beacon_colors, list( update_icon() /obj/item/stack/marker_beacon/examine(mob/user) - ..() - to_chat(user, "Use in-hand to place a [singular_name].") - to_chat(user, "Alt-click to select a color. Current color is [picked_color].") + . = ..() + . += "Use in-hand to place a [singular_name]." + . += "Alt-click to select a color. Current color is [picked_color]." /obj/item/stack/marker_beacon/update_icon() icon_state = "[initial(icon_state)][lowertext(picked_color)]" @@ -92,8 +92,8 @@ GLOBAL_LIST_INIT(marker_beacon_colors, list( qdel(src) /obj/structure/marker_beacon/examine(mob/user) - ..() - to_chat(user, "Alt-click to select a color. Current color is [picked_color].") + . = ..() + . += "Alt-click to select a color. Current color is [picked_color]." /obj/structure/marker_beacon/update_icon() while(!picked_color || !GLOB.marker_beacon_colors[picked_color]) diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm index 972ca9af868..5e71a4438b2 100644 --- a/code/modules/mining/equipment/survival_pod.dm +++ b/code/modules/mining/equipment/survival_pod.dm @@ -27,8 +27,8 @@ /obj/item/survivalcapsule/examine(mob/user) . = ..() get_template() - to_chat(user, "This capsule has the [template.name] stored.") - to_chat(user, template.description) + . += "This capsule has the [template.name] stored." + . += template.description /obj/item/survivalcapsule/attack_self() // Can't grab when capsule is New() because templates aren't loaded then diff --git a/code/modules/mining/fulton.dm b/code/modules/mining/fulton.dm index 2d09c6a8e7a..06f543c5907 100644 --- a/code/modules/mining/fulton.dm +++ b/code/modules/mining/fulton.dm @@ -14,8 +14,8 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) var/max_force_fulton = MOVE_FORCE_STRONG /obj/item/extraction_pack/examine(mob/user) - ..() - to_chat(user, "It has [uses_left] use\s remaining.") + . = ..() + . += "It has [uses_left] use\s remaining." /obj/item/extraction_pack/attack_self(mob/user) var/list/possible_beacons = list() diff --git a/code/modules/mining/lavaland/loot/hierophant_loot.dm b/code/modules/mining/lavaland/loot/hierophant_loot.dm index d86226943a2..a25d822af8c 100644 --- a/code/modules/mining/lavaland/loot/hierophant_loot.dm +++ b/code/modules/mining/lavaland/loot/hierophant_loot.dm @@ -27,8 +27,8 @@ var/friendly_fire_check = FALSE //if the blasts we make will consider our faction against the faction of hit targets /obj/item/hierophant_club/examine(mob/user) - ..() - to_chat(user, "The[beacon ? " beacon is not currently":"re is a beacon"] attached.") + . = ..() + . += "The[beacon ? " beacon is not currently":"re is a beacon"] attached." /obj/item/hierophant_club/suicide_act(mob/living/user) atom_say("Xverwpsgexmrk...") diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index 8f85908a995..b20bcb347de 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -275,8 +275,8 @@ ..() /obj/item/card/mining_point_card/examine(mob/user) - ..(user) - to_chat(user, "There's [points] points on the card.") + . = ..() + . += "There's [points] points on the card." /**********************Conscription Kit**********************/ diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index fc4a14c6e6d..b00883c4cdd 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -97,9 +97,9 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) return ..() /mob/dead/observer/examine(mob/user) - ..() + . = ..() if(!invisibility) - to_chat(user, "It seems extremely obvious.") + . += "It seems extremely obvious." // This seems stupid, but it's the easiest way to avoid absolutely ridiculous shit from happening // Copying an appearance directly from a mob includes it's verb list, it's invisibility, it's alpha, and it's density diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index e5bea0357eb..1d39eb03c88 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -43,16 +43,15 @@ var/const/MAX_ACTIVE_TIME = 400 Attach(M) /obj/item/clothing/mask/facehugger/examine(mob/user) - ..(user) - if(!real)//So that giant red text about probisci doesn't show up. - return - switch(stat) - if(DEAD,UNCONSCIOUS) - to_chat(user, "[src] is not moving.") - if(CONSCIOUS) - to_chat(user, "[src] seems to be active!") - if(sterile) - to_chat(user, "It looks like the proboscis has been removed.") + . = ..() + if(real)//So that giant red text about probisci doesn't show up for fake ones + switch(stat) + if(DEAD,UNCONSCIOUS) + . += "[src] is not moving." + if(CONSCIOUS) + . += "[src] seems to be active!" + if(sterile) + . += "It looks like the proboscis has been removed." /obj/item/clothing/mask/facehugger/attackby(obj/item/O,mob/m, params) if(O.force) diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index 6b194315f1d..ffe70211a37 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -169,7 +169,7 @@ /obj/item/mmi/examine(mob/user) . = ..() if(radio) - to_chat(user, "A radio is installed on [src].") + . += "A radio is installed on [src]." /obj/item/mmi/proc/install_radio() radio = new(src) diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm index af1d7680aca..3017257069a 100644 --- a/code/modules/mob/living/carbon/brain/brain_item.dm +++ b/code/modules/mob/living/carbon/brain/brain_item.dm @@ -50,11 +50,11 @@ to_chat(brainmob, "You feel slightly disoriented. That's normal when you're just a [initial(src.name)].") /obj/item/organ/internal/brain/examine(mob/user) // -- TLE - ..(user) + . = ..() if(brainmob && brainmob.client)//if thar be a brain inside... the brain. - to_chat(user, "You can feel the small spark of life still left in this one.") + . += "You can feel the small spark of life still left in this one." else - to_chat(user, "This one seems particularly lifeless. Perhaps it will regain some of its luster later..") + . += "This one seems particularly lifeless. Perhaps it will regain some of its luster later.." /obj/item/organ/internal/brain/remove(var/mob/living/user,special = 0) if(dna) diff --git a/code/modules/mob/living/carbon/brain/robotic_brain.dm b/code/modules/mob/living/carbon/brain/robotic_brain.dm index 6528d9c252e..320152a7bee 100644 --- a/code/modules/mob/living/carbon/brain/robotic_brain.dm +++ b/code/modules/mob/living/carbon/brain/robotic_brain.dm @@ -166,12 +166,9 @@ /obj/item/mmi/robotic_brain/examine(mob/user) - to_chat(user, "Its speaker is turned [silenced ? "off" : "on"].") - to_chat(user, "*---------*") + . += "Its speaker is turned [silenced ? "off" : "on"]." + . += "*---------*" . = ..() - if(!.) - to_chat(user, "*---------*") - return var/list/msg = list("") @@ -187,7 +184,7 @@ else msg += "It appears to be completely inactive.\n" msg += "*---------*" - to_chat(user, msg.Join("")) + . += msg.Join("") /obj/item/mmi/robotic_brain/emp_act(severity) if(!brainmob) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 1862fe5cffa..7a18e881eb6 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -374,7 +374,7 @@ pose = addtext(pose,".") //Makes sure all emotes end with a period. msg += "\n[p_they(TRUE)] [p_are()] [pose]" - to_chat(user, msg) + . = list(msg) //Helper procedure. Called by /mob/living/carbon/human/examine() and /mob/living/carbon/human/Topic() to determine HUD access to security and medical records. /proc/hasHUD(mob/M as mob, hudtype) diff --git a/code/modules/mob/living/silicon/ai/examine.dm b/code/modules/mob/living/silicon/ai/examine.dm index c519ba0846a..1b8a4fa43c3 100644 --- a/code/modules/mob/living/silicon/ai/examine.dm +++ b/code/modules/mob/living/silicon/ai/examine.dm @@ -1,9 +1,5 @@ /mob/living/silicon/ai/examine(mob/user) - to_chat(user, "*---------*") - if(!..(user)) - to_chat(user, "*---------*") - return - + . = ..() var/msg = "" if(src.stat == DEAD) msg += "It appears to be powered-down.\n" @@ -26,7 +22,7 @@ msg += "" msg += "*---------*
      " - to_chat(user, msg) + . += msg user.showLaws(src) diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index d2e52c39197..cb6b3eaa104 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -525,8 +525,7 @@ density = 0 //this is reset every canmove update otherwise /mob/living/silicon/pai/examine(mob/user) - to_chat(user, "*---------*") - ..(user) + . = ..() var/msg = "" @@ -544,7 +543,7 @@ msg += "\nIt is [pose]" msg += "\n*---------*" - to_chat(user, msg) + . += msg /mob/living/silicon/pai/bullet_act(var/obj/item/projectile/Proj) ..(Proj) diff --git a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm index 35bbad68b6a..50463b17bec 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm @@ -46,9 +46,9 @@ visible_message("\The [src] voices a strident beep, indicating a drone chassis is prepared.") /obj/machinery/drone_fabricator/examine(mob/user) - ..(user) + . = ..() if(produce_drones && drone_progress >= 100 && istype(user,/mob/dead) && config.allow_drone_spawn && count_drones() < config.max_maint_drones) - to_chat(user, "
      A drone is prepared. Select 'Join As Drone' from the Ghost tab to spawn as a maintenance drone.") + . += "
      A drone is prepared. Select 'Join As Drone' from the Ghost tab to spawn as a maintenance drone." /obj/machinery/drone_fabricator/proc/count_drones() var/drones = 0 diff --git a/code/modules/mob/living/silicon/robot/examine.dm b/code/modules/mob/living/silicon/robot/examine.dm index 98b540347ac..56d01fea839 100644 --- a/code/modules/mob/living/silicon/robot/examine.dm +++ b/code/modules/mob/living/silicon/robot/examine.dm @@ -1,6 +1,5 @@ /mob/living/silicon/robot/examine(mob/user) - to_chat(user, "*---------*") - ..(user) + . = ..() var/msg = "" if(module) @@ -55,5 +54,5 @@ pose = addtext(pose,".") //Makes sure all emotes end with a period. msg += "\nIt is [pose]" - to_chat(user, msg) + . += msg user.showLaws(src) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 76f88220eda..1fba341fd59 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -232,14 +232,14 @@ to_chat(user, "You need to open maintenance panel first!") /mob/living/simple_animal/bot/examine(mob/user) - ..() + . = ..() if(health < maxHealth) if(health > maxHealth/3) - to_chat(user, "[src]'s parts look loose.") + . += "[src]'s parts look loose." else - to_chat(user, "[src]'s parts look very loose!") + . += "[src]'s parts look very loose!" else - to_chat(user, "[src] is in pristine condition.") + . += "[src] is in pristine condition." /mob/living/simple_animal/bot/adjustHealth(amount, updating_health = TRUE) if(amount > 0 && prob(10)) diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 218693b7dc3..35fde25b202 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -48,8 +48,7 @@ updateglow() /mob/living/simple_animal/hostile/construct/examine(mob/user) - to_chat(user, "*---------*") - ..(user) + . = ..() var/msg = "" if(src.health < src.maxHealth) @@ -61,7 +60,7 @@ msg += "" msg += "*---------*
      " - to_chat(user, msg) + . += msg /mob/living/simple_animal/hostile/construct/attack_animal(mob/living/simple_animal/M) if(istype(M, /mob/living/simple_animal/hostile/construct/builder)) diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm index 540e4bbf28e..6349c50851d 100644 --- a/code/modules/mob/living/simple_animal/hostile/bees.dm +++ b/code/modules/mob/living/simple_animal/hostile/bees.dm @@ -79,9 +79,9 @@ beehome = null /mob/living/simple_animal/hostile/poison/bees/examine(mob/user) - ..() + . = ..() if(!bee_syndicate && !beehome) - to_chat(user, "This bee is homeless!") + . += "This bee is homeless!" /mob/living/simple_animal/hostile/poison/bees/proc/generate_bee_visuals() overlays.Cut() diff --git a/code/modules/mob/living/simple_animal/hostile/headslug.dm b/code/modules/mob/living/simple_animal/hostile/headslug.dm index 99c11431695..d2329162da7 100644 --- a/code/modules/mob/living/simple_animal/hostile/headslug.dm +++ b/code/modules/mob/living/simple_animal/hostile/headslug.dm @@ -24,9 +24,9 @@ var/egg_lain = 0 /mob/living/simple_animal/hostile/headslug/examine(mob/user) - ..() + . = ..() if(stat == DEAD) - to_chat(desc = "It appears to be dead.") + . += "It appears to be dead." /mob/living/simple_animal/hostile/headslug/proc/Infect(mob/living/carbon/victim) var/obj/item/organ/internal/body_egg/changeling_egg/egg = new(victim) diff --git a/code/modules/mob/living/simple_animal/hostile/hellhound.dm b/code/modules/mob/living/simple_animal/hostile/hellhound.dm index 2f149fbf3ee..d83ca04d6c4 100644 --- a/code/modules/mob/living/simple_animal/hostile/hellhound.dm +++ b/code/modules/mob/living/simple_animal/hostile/hellhound.dm @@ -72,7 +72,7 @@ msgs += "It is currently licking its wounds, regenerating the damage to its body!" else msgs += "It is currently resting." - to_chat(usr,msgs.Join("
      ")) + . += msgs.Join("
      ") /mob/living/simple_animal/hostile/hellhound/Life(seconds, times_fired) . = ..() diff --git a/code/modules/mob/living/simple_animal/hostile/illusion.dm b/code/modules/mob/living/simple_animal/hostile/illusion.dm index 29739a9d867..3756fabf522 100644 --- a/code/modules/mob/living/simple_animal/hostile/illusion.dm +++ b/code/modules/mob/living/simple_animal/hostile/illusion.dm @@ -40,9 +40,9 @@ /mob/living/simple_animal/hostile/illusion/examine(mob/user) if(parent_mob) - parent_mob.examine(user) + . = parent_mob.examine(user) else - return ..() + . = ..() /mob/living/simple_animal/hostile/illusion/AttackingTarget() diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm index 99689bf5040..927056c29db 100644 --- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm +++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm @@ -36,11 +36,11 @@ var/image/cap_dead = null /mob/living/simple_animal/hostile/mushroom/examine(mob/user) - ..(user) + . = ..() if(health >= maxHealth) - to_chat(user, "It looks healthy.") + . += "It looks healthy." else - to_chat(user, "It looks like it's been roughed up.") + . += "It looks like it's been roughed up." /mob/living/simple_animal/hostile/mushroom/Life(seconds, times_fired) ..() diff --git a/code/modules/mob/living/simple_animal/hostile/netherworld.dm b/code/modules/mob/living/simple_animal/hostile/netherworld.dm index 8f4ef5c7810..92c01d7d72b 100644 --- a/code/modules/mob/living/simple_animal/hostile/netherworld.dm +++ b/code/modules/mob/living/simple_animal/hostile/netherworld.dm @@ -81,11 +81,11 @@ START_PROCESSING(SSprocessing, src) /obj/structure/spawner/nether/examine(mob/user) - ..() + . = ..() if(isskeleton(user) || iszombie(user)) - to_chat(user, "A direct link to another dimension full of creatures very happy to see you. You can see your house from here!") + . += "A direct link to another dimension full of creatures very happy to see you. You can see your house from here!" else - to_chat(user, "A direct link to another dimension full of creatures not very happy to see you. Entering the link would be a very bad idea.") + . += "A direct link to another dimension full of creatures not very happy to see you. Entering the link would be a very bad idea." /obj/structure/spawner/nether/attack_hand(mob/user) . = ..() diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm index 23d7b30691b..d6d64096ff1 100644 --- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm +++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm @@ -220,7 +220,7 @@ var/global/list/ts_spiderling_list = list() // -------------------------------------------------------------------------------- /mob/living/simple_animal/hostile/poison/terror_spider/examine(mob/user) - ..() + . = ..() var/list/msgs = list() if(stat == DEAD) msgs += "It appears to be dead.\n" @@ -241,7 +241,7 @@ var/global/list/ts_spiderling_list = list() msgs += "It appears to be regenerating quickly." if(killcount >= 1) msgs += "It has blood dribbling from its mouth." - to_chat(usr,msgs.Join("
      ")) + . += msgs.Join("
      ") /mob/living/simple_animal/hostile/poison/terror_spider/New() ..() diff --git a/code/modules/mob/living/simple_animal/posessed_object.dm b/code/modules/mob/living/simple_animal/posessed_object.dm index f290dd7f2ef..acd71fdcaff 100644 --- a/code/modules/mob/living/simple_animal/posessed_object.dm +++ b/code/modules/mob/living/simple_animal/posessed_object.dm @@ -20,11 +20,11 @@ var/obj/item/possessed_item /mob/living/simple_animal/possessed_object/examine(mob/user) - possessed_item.examine(user) + . = possessed_item.examine(user) if(health > (maxHealth / 30)) - to_chat(usr, "[src] appears to be floating without any support!") + . += "[src] appears to be floating without any support!" else - to_chat(usr, "[src] appears to be having trouble staying afloat!") + . += "[src] appears to be having trouble staying afloat!" /mob/living/simple_animal/possessed_object/do_attack_animation(atom/A, visual_effect_icon, used_item, no_effect, end_pixel_y) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 502adb937e3..da08f257268 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -140,7 +140,7 @@ /mob/living/simple_animal/examine(mob/user) . = ..() if(stat == DEAD) - to_chat(user, "Upon closer examination, [p_they()] appear[p_s()] to be dead.") + . += "Upon closer examination, [p_they()] appear[p_s()] to be dead." /mob/living/simple_animal/updatehealth(reason = "none given") ..(reason) diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index a325ecfdefe..d9326b78ab3 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -427,34 +427,35 @@ ++Discipline /mob/living/simple_animal/slime/examine(mob/user) - to_chat(user, "*---------*\nThis is [bicon(src)] \a [src]!") + . = ..() + . += "*---------*\nThis is [bicon(src)] \a [src]!" if(stat == DEAD) - to_chat(user, "It is limp and unresponsive.") + . += "It is limp and unresponsive." else if(stat == UNCONSCIOUS) // Slime stasis - to_chat(user, "It appears to be alive but unresponsive.") + . += "It appears to be alive but unresponsive." if(getBruteLoss()) - to_chat(user, "") + . += "" if (getBruteLoss() < 40) - to_chat(user, "It has some punctures in its flesh!") + . += "It has some punctures in its flesh!" else - to_chat(user, "It has severe punctures and tears in its flesh!") - to_chat(user, "\n") + . += "It has severe punctures and tears in its flesh!" + . += "\n" switch(powerlevel) if(2 to 3) - to_chat(user, "It is flickering gently with a little electrical activity.") + . += "It is flickering gently with a little electrical activity." if(4 to 5) - to_chat(user, "It is glowing gently with moderate levels of electrical activity.") + . += "It is glowing gently with moderate levels of electrical activity." if(6 to 9) - to_chat(user, "It is glowing brightly with high levels of electrical activity.") + . += "It is glowing brightly with high levels of electrical activity." if(10) - to_chat(user, "It is radiating with massive levels of electrical activity!") + . += "It is radiating with massive levels of electrical activity!" - to_chat(user, "*---------*") + . += "*---------*" /mob/living/simple_animal/slime/proc/discipline_slime(mob/user) if(stat) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 8e35233be06..c9e77e294d2 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -580,7 +580,8 @@ var/list/slot_equipment_priority = list( \ client.update_description_holders(A, is_antag) face_atom(A) - A.examine(src) + var/list/result = A.examine(src) + to_chat(src, result.Join("\n")) //same as above //note: ghosts can point, this is intended diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index 75aa563dd86..bed0533e2d8 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -178,11 +178,11 @@ return 1 /obj/item/modular_computer/examine(mob/user) - ..() + . = ..() if(obj_integrity <= integrity_failure) - to_chat(user, "It is heavily damaged!") + . += "It is heavily damaged!" else if(obj_integrity < max_integrity) - to_chat(user, "It is damaged.") + . += "It is damaged." /obj/item/modular_computer/update_icon() overlays.Cut() diff --git a/code/modules/modular_computers/hardware/_hardware.dm b/code/modules/modular_computers/hardware/_hardware.dm index fd75987c948..9752cbf3149 100644 --- a/code/modules/modular_computers/hardware/_hardware.dm +++ b/code/modules/modular_computers/hardware/_hardware.dm @@ -82,11 +82,11 @@ /obj/item/computer_hardware/examine(var/mob/user) . = ..() if(damage > damage_failure) - to_chat(user, "It seems to be severely damaged!") + . += "It seems to be severely damaged!" else if(damage > damage_malfunction) - to_chat(user, "It seems to be damaged!") + . += "It seems to be damaged!" else if(damage) - to_chat(user, "It seems to be slightly damaged.") + . += "It seems to be slightly damaged." // Component-side compatibility check. /obj/item/computer_hardware/proc/can_install(obj/item/modular_computer/M, mob/living/user = null) diff --git a/code/modules/modular_computers/hardware/ai_slot.dm b/code/modules/modular_computers/hardware/ai_slot.dm index 0c9abdf352f..1a112b248a5 100644 --- a/code/modules/modular_computers/hardware/ai_slot.dm +++ b/code/modules/modular_computers/hardware/ai_slot.dm @@ -16,9 +16,9 @@ /obj/item/computer_hardware/ai_slot/examine(mob/user) - ..() + . = ..() if(stored_card) - to_chat(user, "There appears to be an intelliCard loaded. There appears to be a pinhole protecting a manual eject button. A screwdriver could probably press it") + . += "There appears to be an intelliCard loaded. There appears to be a pinhole protecting a manual eject button. A screwdriver could probably press it" /obj/item/computer_hardware/ai_slot/on_install(obj/item/modular_computer/M, mob/living/user = null) M.add_verb(device_type) diff --git a/code/modules/modular_computers/hardware/card_slot.dm b/code/modules/modular_computers/hardware/card_slot.dm index 2872007b998..fc1abc207a5 100644 --- a/code/modules/modular_computers/hardware/card_slot.dm +++ b/code/modules/modular_computers/hardware/card_slot.dm @@ -107,6 +107,6 @@ return /obj/item/computer_hardware/card_slot/examine(mob/user) - ..() + . = ..() if(stored_card || stored_card2) - to_chat(user, "There appears to be something loaded in the card slots.") + . += "There appears to be something loaded in the card slots." diff --git a/code/modules/modular_computers/hardware/hard_drive.dm b/code/modules/modular_computers/hardware/hard_drive.dm index 172092fd2e2..82c4aa5f62c 100644 --- a/code/modules/modular_computers/hardware/hard_drive.dm +++ b/code/modules/modular_computers/hardware/hard_drive.dm @@ -20,8 +20,8 @@ store_file(new/datum/computer_file/program/filemanager(src)) // File manager, allows text editor functions and basic file manipulation. /obj/item/computer_hardware/hard_drive/examine(user) - ..() - to_chat(user, "It has [max_capacity] GQ of storage capacity.") + . = ..() + . += "It has [max_capacity] GQ of storage capacity." /obj/item/computer_hardware/hard_drive/diagnostics(var/mob/user) ..() diff --git a/code/modules/modular_computers/hardware/printer.dm b/code/modules/modular_computers/hardware/printer.dm index 60f711ad960..0db45f33e6e 100644 --- a/code/modules/modular_computers/hardware/printer.dm +++ b/code/modules/modular_computers/hardware/printer.dm @@ -14,8 +14,8 @@ to_chat(user, "Paper level: [stored_paper]/[max_paper]") /obj/item/computer_hardware/printer/examine(mob/user) - ..() - to_chat(user, "Paper level: [stored_paper]/[max_paper]") + . = ..() + . += "Paper level: [stored_paper]/[max_paper]" /obj/item/computer_hardware/printer/proc/print_text(var/text_to_print, var/paper_title = "") diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index dc16101eac7..efd1df29a5d 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -38,8 +38,9 @@ toppaper = locate(/obj/item/paper_bundle) in src /obj/item/clipboard/examine(mob/user) - if(..(user, 1) && toppaper) - toppaper.examine(user) + . = ..() + if(in_range(user, src) && toppaper) + . += toppaper.examine(user) obj/item/clipboard/proc/penPlacement(mob/user, obj/item/pen/P, placing) if(placing) diff --git a/code/modules/paperwork/frames.dm b/code/modules/paperwork/frames.dm index 3aa4cc3d148..5270da810be 100644 --- a/code/modules/paperwork/frames.dm +++ b/code/modules/paperwork/frames.dm @@ -137,10 +137,10 @@ playsound(PF.loc, usesound, 100, 1) -/obj/item/picture_frame/examine(mob/user, var/distance = -1, var/infix = "", var/suffix = "") - ..() +/obj/item/picture_frame/examine(mob/user, var/infix = "", var/suffix = "") + . = ..() if(displayed) - displayed.examine(user, distance, infix, suffix) + . += displayed.examine(user, infix, suffix) /obj/item/picture_frame/attack_self(mob/user) if(displayed) @@ -245,11 +245,11 @@ else return ..() -/obj/structure/sign/picture_frame/examine(mob/user, var/distance = -1, var/infix = "", var/suffix = "") +/obj/structure/sign/picture_frame/examine(mob/user, var/infix = "", var/suffix = "") if(frame) - frame.examine(user, distance, infix, suffix) + . += frame.examine(user, infix, suffix) else - ..() + . = ..() /obj/structure/sign/picture_frame/attack_hand(mob/user) if(frame) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index d7ea9db01ea..1586870013e 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -60,13 +60,14 @@ icon_state = "paper" /obj/item/paper/examine(mob/user) + . = ..() if(user.is_literate()) if(in_range(user, src) || istype(user, /mob/dead/observer)) show_content(user) else - to_chat(user, "You have to go closer if you want to read it.") + . += "You have to go closer if you want to read it." else - to_chat(user, "You don't know how to read.") + . += "You don't know how to read." /obj/item/paper/proc/show_content(var/mob/user, var/forceshow = 0, var/forcestars = 0, var/infolinks = 0, var/view = 1) var/datum/asset/assets = get_asset_datum(/datum/asset/simple/paper) diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm index 704ec5b5819..ecc26ba0cff 100644 --- a/code/modules/paperwork/paper_bundle.dm +++ b/code/modules/paperwork/paper_bundle.dm @@ -100,10 +100,11 @@ to_chat(user, "You must hold \the [P] steady to burn \the [src].") /obj/item/paper_bundle/examine(mob/user) - if(..(user, 1)) - src.show_content(user) + . = ..() + if(in_range(user, src)) + show_content(user) else - to_chat(user, "It is too far away.") + . += "It is too far away." /obj/item/paper_bundle/proc/show_content(mob/user as mob) var/dat diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index c9169a09757..4ee6974f076 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -100,11 +100,12 @@ /obj/item/paper_bin/examine(mob/user) - if(..(user, 1)) + . = ..() + if(in_range(user, src)) if(amount) - to_chat(usr, "There " + (amount > 1 ? "are [amount] papers" : "is one paper") + " in the bin.") + . += "There " + (amount > 1 ? "are [amount] papers" : "is one paper") + " in the bin." else - to_chat(usr, "There are no papers in the bin.") + . += "There are no papers in the bin." /obj/item/paper_bin/update_icon() diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index de3f2ad52d6..c7d79655870 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -74,10 +74,11 @@ to_chat(user, "You must hold \the [P] steady to burn \the [src].") /obj/item/photo/examine(mob/user) - if(..(user, 1) || isobserver(user)) + . = ..() + if(in_range(user, src) || isobserver(user)) show(user) else - to_chat(user, "It is too far away.") + . += "It is too far away." /obj/item/photo/proc/show(mob/user as mob) usr << browse_rsc(img, "tmp_photo.png") @@ -539,8 +540,9 @@ var/list/SpookyGhosts = list("ghost","shade","shade2","ghost-narsie","horror","s to_chat(user, "You switch the camera [on ? "on" : "off"].") /obj/item/videocam/examine(mob/user) - if(..(user, 1)) - to_chat(user, "This video camera can send live feeds to the entertainment network. It's [camera ? "" : "in"]active.") + . = ..() + if(in_range(user, src)) + . += "This video camera can send live feeds to the entertainment network. It's [camera ? "" : "in"]active." /obj/item/videocam/hear_talk(mob/M as mob, list/message_pieces) var/msg = multilingual_to_message(message_pieces) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 2942ace8ee2..12e8ba163f2 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -229,27 +229,26 @@ addtimer(CALLBACK(src, .proc/update), 5) /obj/machinery/power/apc/examine(mob/user) - if(..(user, 1)) + . = ..() + if(in_range(user, src)) if(stat & BROKEN) - to_chat(user, "Looks broken.") - return - if(opened) + . += "Looks broken." + else if(opened) if(has_electronics && terminal) - to_chat(user, "The cover is [opened==2?"removed":"open"] and the power cell is [ cell ? "installed" : "missing"].") + . += "The cover is [opened==2?"removed":"open"] and the power cell is [ cell ? "installed" : "missing"]." else if(!has_electronics && terminal) - to_chat(user, "There are some wires but no electronics.") + . += "There are some wires but no electronics." else if(has_electronics && !terminal) - to_chat(user, "Electronics installed but not wired.") + . += "Electronics installed but not wired." else /* if(!has_electronics && !terminal) */ - to_chat(user, "There is no electronics nor connected wires.") - + . += "There is no electronics nor connected wires." else if(stat & MAINT) - to_chat(user, "The cover is closed. Something wrong with it: it doesn't work.") + . += "The cover is closed. Something wrong with it: it doesn't work." else if(malfhack) - to_chat(user, "The cover is broken. It may be hard to force it open.") + . += "The cover is broken. It may be hard to force it open." else - to_chat(user, "The cover is closed.") + . += "The cover is closed." // update the APC icon to show the three base states // also add overlays for indicator lights diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 68eaec16040..198c5f64356 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -595,15 +595,14 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list (new/datum/stack_recipe("cable restrai w_class = WEIGHT_CLASS_SMALL /obj/item/stack/cable_coil/examine(mob/user) - if(!..(user, 1)) - return - - if(get_amount() == 1) - to_chat(user, "A short piece of power cable.") - else if(get_amount() == 2) - to_chat(user, "A piece of power cable.") - else - to_chat(user, "A coil of power cable. There are [get_amount()] lengths of cable in the coil.") + . = ..() + if(in_range(user, src)) + if(get_amount() == 1) + . += "A short piece of power cable." + else if(get_amount() == 2) + . += "A piece of power cable." + else + . += "A coil of power cable. There are [get_amount()] lengths of cable in the coil." // Items usable on a cable coil : // - Wirecutters : cut them duh ! diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 33b423c6360..c1429ebdee9 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -85,11 +85,11 @@ return power_used /obj/item/stock_parts/cell/examine(mob/user) - ..() + . = ..() if(rigged) - to_chat(user, "This power cell seems to be faulty!") + . += "This power cell seems to be faulty!" else - to_chat(user, "The charge meter reads [round(percent() )]%.") + . += "The charge meter reads [round(percent() )]%." /obj/item/stock_parts/cell/suicide_act(mob/user) to_chat(viewers(user), "[user] is licking the electrodes of the [src]! It looks like [user.p_theyre()] trying to commit suicide.") diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 7aa21b1974a..3e272f43091 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -28,14 +28,15 @@ icon_state = "bulb-construct-stage1" /obj/machinery/light_construct/examine(mob/user) - if(..(user, 2)) - switch(src.stage) + . = ..() + if(get_dist(user, src) <= 2) + switch(stage) if(1) - to_chat(usr, "It's an empty frame.") + . += "It's an empty frame." if(2) - to_chat(usr, "It's wired.") + . += "It's wired." if(3) - to_chat(usr, "The casing is closed.") + . += "The casing is closed." /obj/machinery/light_construct/attackby(obj/item/W as obj, mob/living/user as mob, params) src.add_fingerprint(user) @@ -284,16 +285,17 @@ // examine verb /obj/machinery/light/examine(mob/user) - if(..(user, 1)) + . = ..() + if(in_range(user, src)) switch(status) if(LIGHT_OK) - to_chat(user, "[desc] It is turned [on? "on" : "off"].") + . += "[desc] It is turned [on? "on" : "off"]." if(LIGHT_EMPTY) - to_chat(user, "[desc] The [fitting] has been removed.") + . += "[desc] The [fitting] has been removed." if(LIGHT_BURNED) - to_chat(user, "[desc] The [fitting] is burnt out.") + . += "[desc] The [fitting] is burnt out." if(LIGHT_BROKEN) - to_chat(user, "[desc] The [fitting] has been smashed.") + . += "[desc] The [fitting] has been smashed." diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index bf2563fe310..203fbd9b734 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -52,12 +52,12 @@ return /obj/machinery/power/port_gen/examine(mob/user) - if(!..(user,1 )) - return - if(active) - to_chat(usr, "The generator is on.") - else - to_chat(usr, "The generator is off.") + . = ..() + if(!in_range(user, src)) + if(active) + . += "The generator is on." + else + . += "The generator is off." /obj/machinery/power/port_gen/emp_act(severity) var/duration = 6000 //ten minutes @@ -154,13 +154,13 @@ power_gen = round(initial(power_gen) * (max(2, temp_rating) / 2)) /obj/machinery/power/port_gen/pacman/examine(mob/user) - ..(user) - to_chat(user, "\The [src] appears to be producing [power_gen*power_output] W.") - to_chat(user, "There [sheets == 1 ? "is" : "are"] [sheets] sheet\s left in the hopper.") + . = ..() + . += "\The [src] appears to be producing [power_gen*power_output] W." + . += "There [sheets == 1 ? "is" : "are"] [sheets] sheet\s left in the hopper." if(IsBroken()) - to_chat(user, "\The [src] seems to have broken down.") + . += "\The [src] seems to have broken down." if(overheating) - to_chat(user, "\The [src] is overheating!") + . += "\The [src] is overheating!" /obj/machinery/power/port_gen/pacman/HasFuel() var/needed_sheets = power_output / time_per_sheet diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm index 62d52c587c9..d58d800b77e 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm @@ -133,7 +133,7 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin desc = text("The [name] is assembled") if(powered) desc = desc_holder - ..(user) + . = ..() /obj/structure/particle_accelerator/attackby(obj/item/W, mob/user, params) if(istool(W)) diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index 19948c94a36..754479a69ca 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -57,9 +57,10 @@ energy = 0 // ensure we dont have miniballs of miniballs /obj/singularity/energy_ball/examine(mob/user) - ..() - if(orbiting_balls.len) - to_chat(user, "The amount of orbiting mini-balls is [orbiting_balls.len].") + . = ..() + var/len = LAZYLEN(orbiting_balls) + if(len) + . += "The amount of orbiting mini-balls is [len]." /obj/singularity/energy_ball/proc/move_the_basket_ball(var/move_amount) diff --git a/code/modules/power/treadmill.dm b/code/modules/power/treadmill.dm index 36f3ac15df4..5a1cc12c701 100644 --- a/code/modules/power/treadmill.dm +++ b/code/modules/power/treadmill.dm @@ -168,8 +168,8 @@ update_icon() /obj/machinery/treadmill_monitor/examine(mob/user) - ..() - to_chat(user, "The display reads:
      [line1]
      [line2]
      ") + . = ..() + . += "The display reads:
      [line1]
      [line2]
      " /obj/machinery/treadmill_monitor/update_icon() overlays.Cut() diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm index bf6df41006a..2f422e227b3 100644 --- a/code/modules/projectiles/ammunition/magazines.dm +++ b/code/modules/projectiles/ammunition/magazines.dm @@ -236,10 +236,10 @@ if(ammo && is_rubber()) overlays += image('icons/obj/ammo.dmi', icon_state = "enforcer-r") -/obj/item/ammo_box/magazine/enforcer/examine(mob/user, var/distance) - ..() - if(distance <= 2) - to_chat(user, "It seems to be loaded with [is_rubber() ? "rubber" : "lethal"] bullets.")//only can see the topmost one. +/obj/item/ammo_box/magazine/enforcer/examine(mob/user) + . = ..() + if(get_dist(user, src) <= 2) + . += "It seems to be loaded with [is_rubber() ? "rubber" : "lethal"] bullets."//only can see the topmost one. /obj/item/ammo_box/magazine/enforcer/proc/is_rubber()//if the topmost bullet is a rubber one var/ammo = ammo_count() diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index fbc29da0391..510e8f60264 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -85,17 +85,17 @@ return ..() /obj/item/gun/examine(mob/user) - ..() + . = ..() if(unique_reskin && !current_skin) - to_chat(user, "Alt-click it to reskin it.") + . += "Alt-click it to reskin it." if(unique_rename) - to_chat(user, "Use a pen on it to rename it.") + . += "Use a pen on it to rename it." if(bayonet) - to_chat(user, "It has \a [bayonet] [can_bayonet ? "" : "permanently "]affixed to it.") + . += "It has \a [bayonet] [can_bayonet ? "" : "permanently "]affixed to it." if(can_bayonet) //if it has a bayonet and this is false, the bayonet is permanent. - to_chat(user, "[bayonet] looks like it can be unscrewed from [src].") + . += "[bayonet] looks like it can be unscrewed from [src]." else if(can_bayonet) - to_chat(user, "It has a bayonet lug on it.") + . += "It has a bayonet lug on it." /obj/item/gun/proc/process_chamber() return 0 diff --git a/code/modules/projectiles/guns/dartgun.dm b/code/modules/projectiles/guns/dartgun.dm index 97f4eaebf1c..0a50b844f4a 100644 --- a/code/modules/projectiles/guns/dartgun.dm +++ b/code/modules/projectiles/guns/dartgun.dm @@ -56,13 +56,14 @@ update_icon() /obj/item/gun/dartgun/examine(mob/user) - if(..(user, 2)) + . = ..() + if(get_dist(user, src) <= 2) if(beakers.len) - to_chat(user, "[src] contains:") + . += "[src] contains:" for(var/obj/item/reagent_containers/glass/beaker/B in beakers) if(B.reagents && B.reagents.reagent_list.len) for(var/datum/reagent/R in B.reagents.reagent_list) - to_chat(user, "[R.volume] units of [R.name]") + . += "[R.volume] units of [R.name]" /obj/item/gun/dartgun/attackby(obj/item/I as obj, mob/user as mob, params) if(istype(I, /obj/item/dart_cartridge)) diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index 9c1ea1a7a9f..f64cba9632c 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -28,12 +28,13 @@ var/empty_state = "kineticgun_empty" /obj/item/gun/energy/kinetic_accelerator/examine(mob/user) - if(..(user, 1)) + . = ..() + if(in_range(user, src)) if(max_mod_capacity) - to_chat(user, "[get_remaining_mod_capacity()]% mod capacity remaining.") + . += "[get_remaining_mod_capacity()]% mod capacity remaining." for(var/A in get_modkits()) var/obj/item/borg/upgrade/modkit/M = A - to_chat(user, "There is a [M.name] mod installed, using [M.cost]% capacity.") + . += "There is a [M.name] mod installed, using [M.cost]% capacity." /obj/item/gun/energy/kinetic_accelerator/attackby(obj/item/I, mob/user) if(iscrowbar(I)) @@ -257,8 +258,9 @@ var/minebot_exclusive = FALSE /obj/item/borg/upgrade/modkit/examine(mob/user) - if(..(user, 1)) - to_chat(user, "Occupies [cost]% of mod capacity.") + . = ..() + if(in_range(user, src)) + . += "Occupies [cost]% of mod capacity." /obj/item/borg/upgrade/modkit/attackby(obj/item/A, mob/user) if(istype(A, /obj/item/gun/energy/kinetic_accelerator) && !issilicon(user)) diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index d51f9446b49..5a9e87aa119 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -159,9 +159,9 @@ can_charge = 0 /obj/item/gun/energy/plasmacutter/examine(mob/user) - ..() + . = ..() if(power_supply) - to_chat(user, "[src] is [round(power_supply.percent())]% charged.") + . += "[src] is [round(power_supply.percent())]% charged." /obj/item/gun/energy/plasmacutter/attackby(obj/item/A, mob/user) if(istype(A, /obj/item/stack/sheet/mineral/plasma)) diff --git a/code/modules/projectiles/guns/grenade_launcher.dm b/code/modules/projectiles/guns/grenade_launcher.dm index 81b8451eb77..af7cffbe7c8 100644 --- a/code/modules/projectiles/guns/grenade_launcher.dm +++ b/code/modules/projectiles/guns/grenade_launcher.dm @@ -14,8 +14,9 @@ materials = list(MAT_METAL=2000) /obj/item/gun/grenadelauncher/examine(mob/user) - if(..(user, 2)) - to_chat(user, "[grenades.len] / [max_grenades] grenades.") + . = ..() + if(get_dist(user, src) <= 2) + . += "[grenades.len] / [max_grenades] grenades." /obj/item/gun/grenadelauncher/attackby(obj/item/I as obj, mob/user as mob, params) if((istype(I, /obj/item/grenade))) diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm index 1a5ecc178d1..544ca67a361 100644 --- a/code/modules/projectiles/guns/magic/wand.dm +++ b/code/modules/projectiles/guns/magic/wand.dm @@ -18,8 +18,8 @@ ..() /obj/item/gun/magic/wand/examine(mob/user) - ..() - to_chat(user, "Has [charges] charge\s remaining.") + . = ..() + . += "Has [charges] charge\s remaining." /obj/item/gun/magic/wand/update_icon() icon_state = "[initial(icon_state)][charges ? "" : "-drained"]" diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm index 15efee700d2..133331f8e44 100644 --- a/code/modules/projectiles/guns/projectile.dm +++ b/code/modules/projectiles/guns/projectile.dm @@ -149,8 +149,8 @@ return /obj/item/gun/projectile/examine(mob/user) - ..() - to_chat(user, "Has [get_ammo()] round\s remaining.") + . = ..() + . += "Has [get_ammo()] round\s remaining." /obj/item/gun/projectile/proc/get_ammo(countchambered = 1) var/boolets = 0 //mature var names for mature people diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm index 6f977f2e024..99ec51f9fdd 100644 --- a/code/modules/projectiles/guns/projectile/revolver.dm +++ b/code/modules/projectiles/guns/projectile/revolver.dm @@ -84,8 +84,8 @@ return boolets /obj/item/gun/projectile/revolver/examine(mob/user) - ..() - to_chat(user, "[get_ammo(0,0)] of those are live rounds.") + . = ..() + . += "[get_ammo(0,0)] of those are live rounds." /obj/item/gun/projectile/revolver/detective desc = "A cheap Martian knock-off of a classic law enforcement firearm. Uses .38-special rounds." @@ -467,7 +467,7 @@ f_name = "a " f_name += "blood-stained [name]!" - to_chat(user, "[bicon(src)] That's [f_name]") + . = list("[bicon(src)] That's [f_name]") if(desc) - to_chat(user, desc) + . += desc diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index 8b658911b3b..ee6b013af0d 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -66,9 +66,9 @@ chambered = AC /obj/item/gun/projectile/shotgun/examine(mob/user) - ..() + . = ..() if(chambered) - to_chat(user, "A [chambered.BB ? "live" : "spent"] one is in the chamber.") + . += "A [chambered.BB ? "live" : "spent"] one is in the chamber." /obj/item/gun/projectile/shotgun/isHandgun() //You cannot, in fact, holster a shotgun. return 0 @@ -239,8 +239,8 @@ . = ..() /obj/item/gun/projectile/shotgun/boltaction/examine(mob/user) - ..() - to_chat(user, "The bolt is [bolt_open ? "open" : "closed"].") + . = ..() + . += "The bolt is [bolt_open ? "open" : "closed"]." /obj/item/gun/projectile/shotgun/boltaction/enchanted name = "enchanted bolt action rifle" diff --git a/code/modules/projectiles/guns/rocket.dm b/code/modules/projectiles/guns/rocket.dm index 983c6f319fd..53de1a16854 100644 --- a/code/modules/projectiles/guns/rocket.dm +++ b/code/modules/projectiles/guns/rocket.dm @@ -16,8 +16,8 @@ var/list/rockets = new/list() /obj/item/gun/rocketlauncher/examine(mob/user) - ..() - to_chat(user, "[rockets.len] / [max_rockets] rockets.") + . = ..() + . += "[rockets.len] / [max_rockets] rockets." /obj/item/gun/rocketlauncher/Destroy() QDEL_LIST(rockets) diff --git a/code/modules/projectiles/guns/syringe_gun.dm b/code/modules/projectiles/guns/syringe_gun.dm index ca18cdcd82e..04cf2d248d3 100644 --- a/code/modules/projectiles/guns/syringe_gun.dm +++ b/code/modules/projectiles/guns/syringe_gun.dm @@ -46,8 +46,8 @@ ..() /obj/item/gun/syringe/examine(mob/user) - ..() - to_chat(user, "Can hold [max_syringes] syringe\s. Has [syringes.len] syringe\s remaining.") + . = ..() + . += "Can hold [max_syringes] syringe\s. Has [syringes.len] syringe\s remaining." /obj/item/gun/syringe/attack_self(mob/living/user as mob) if(!syringes.len) diff --git a/code/modules/projectiles/guns/throw.dm b/code/modules/projectiles/guns/throw.dm index 97bb65f5d02..58f3db026e1 100644 --- a/code/modules/projectiles/guns/throw.dm +++ b/code/modules/projectiles/guns/throw.dm @@ -12,7 +12,7 @@ var/projectile_speed = 1 var/projectile_range = 1 -/obj/item/gun/throw/proc/notify_ammo_count(mob/user) +/obj/item/gun/throw/proc/notify_ammo_count() return /obj/item/gun/throw/proc/get_throwrange() @@ -31,9 +31,9 @@ return count /obj/item/gun/throw/examine(mob/user) - ..() - to_chat(user, "It is [to_launch ? "loaded with \a [to_launch]" : "not loaded"].") - notify_ammo_count(user) + . = ..() + . += "It is [to_launch ? "loaded with \a [to_launch]" : "not loaded"]." + . += notify_ammo_count() /obj/item/gun/throw/Destroy() QDEL_NULL(to_launch) @@ -53,7 +53,7 @@ to_chat(user, "You load [I] into [src].") if(!to_launch) process_chamber() - notify_ammo_count(user) + to_chat(user, notify_ammo_count()) else to_chat(user, "[src] cannot hold any more projectiles.") else diff --git a/code/modules/projectiles/guns/throw/crossbow.dm b/code/modules/projectiles/guns/throw/crossbow.dm index 9c87f7949a9..ca626534320 100644 --- a/code/modules/projectiles/guns/throw/crossbow.dm +++ b/code/modules/projectiles/guns/throw/crossbow.dm @@ -39,11 +39,11 @@ icon_state = "[initial(icon_state)]-drawn" /obj/item/gun/throw/crossbow/examine(mob/user) - ..() + . = ..() if(cell) - to_chat(user, "\A [cell] is mounted onto [src]. Battery cell charge: [cell.charge]/[cell.maxcharge]") + . += "\A [cell] is mounted onto [src]. Battery cell charge: [cell.charge]/[cell.maxcharge]" else - to_chat(user, "It has an empty mount for a battery cell.") + . += "It has an empty mount for a battery cell." /obj/item/gun/throw/crossbow/modify_projectile(obj/item/I, on_chamber = 0) if(cell && on_chamber && istype(I, /obj/item/arrow/rod)) diff --git a/code/modules/projectiles/guns/throw/pielauncher.dm b/code/modules/projectiles/guns/throw/pielauncher.dm index ed3a70ad032..69dcc166aae 100644 --- a/code/modules/projectiles/guns/throw/pielauncher.dm +++ b/code/modules/projectiles/guns/throw/pielauncher.dm @@ -21,8 +21,8 @@ loaded_projectiles += P process_chamber() -/obj/item/gun/throw/piecannon/notify_ammo_count(mob/user) - to_chat(user, "[src] has [get_ammocount()] of [max_capacity] pies left.") +/obj/item/gun/throw/piecannon/notify_ammo_count() + return "[src] has [get_ammocount()] of [max_capacity] pies left." /obj/item/gun/throw/piecannon/update_icon() if(to_launch) diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index 7c53761a70f..3719ac81776 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -105,11 +105,11 @@ return ..() /obj/machinery/chem_dispenser/examine(mob/user) - ..() + . = ..() if(panel_open) - to_chat(user, "[src]'s maintenance hatch is open!") + . += "[src]'s maintenance hatch is open!" if(in_range(user, src) || isobserver(user)) - to_chat(user, "The status display reads:
      Recharging [recharge_amount] power units per interval.
      Power efficiency increased by [round((powerefficiency * 1000) - 100, 1)]%.") + . += "The status display reads:
      Recharging [recharge_amount] power units per interval.
      Power efficiency increased by [round((powerefficiency * 1000) - 100, 1)]%." /obj/machinery/chem_dispenser/process() diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index e15e6316cb1..fa86a25f11c 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -102,16 +102,15 @@ return /obj/item/reagent_containers/borghypo/examine(mob/user) - if(!..(user, 2)) - return + . = ..() + if(get_dist(user, src) <= 2) + var/empty = TRUE - var/empty = 1 + for(var/datum/reagents/RS in reagent_list) + var/datum/reagent/R = locate() in RS.reagent_list + if(R) + . += "It currently has [R.volume] units of [R.name] stored." + empty = FALSE - for(var/datum/reagents/RS in reagent_list) - var/datum/reagent/R = locate() in RS.reagent_list - if(R) - to_chat(user, "It currently has [R.volume] units of [R.name] stored.") - empty = 0 - - if(empty) - to_chat(user, "It is currently empty. Allow some time for the internal syntheszier to produce more.") + if(empty) + . += "It is currently empty. Allow some time for the internal syntheszier to produce more." diff --git a/code/modules/reagents/reagent_containers/glass_containers.dm b/code/modules/reagents/reagent_containers/glass_containers.dm index 5221ae5e600..edf1624ea3a 100644 --- a/code/modules/reagents/reagent_containers/glass_containers.dm +++ b/code/modules/reagents/reagent_containers/glass_containers.dm @@ -51,10 +51,9 @@ base_name = name /obj/item/reagent_containers/glass/examine(mob/user) - if(!..(user, 2)) - return - if(!is_open_container()) - to_chat(user, "Airtight lid seals it completely.") + . = ..() + if(get_dist(user, src) <= 2 && !is_open_container()) + . += "Airtight lid seals it completely." /obj/item/reagent_containers/glass/attack(mob/M, mob/user, def_zone) if(!is_open_container()) diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 0309f3e2e7e..de0b8c3bae6 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -122,11 +122,11 @@ icon_state = "[initial(icon_state)]0" /obj/item/reagent_containers/hypospray/autoinjector/examine() - ..() + . = ..() if(reagents && reagents.reagent_list.len) - to_chat(usr, "It is currently loaded.") + . += "It is currently loaded." else - to_chat(usr, "It is spent.") + . += "It is spent." /obj/item/reagent_containers/hypospray/autoinjector/teporone //basilisks name = "teporone autoinjector" diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index d8ee5d88309..482b8b20ccd 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -83,8 +83,9 @@ to_chat(user, "You [amount_per_transfer_from_this == 10 ? "remove" : "fix"] the nozzle. You'll now use [amount_per_transfer_from_this] units per spray.") /obj/item/reagent_containers/spray/examine(mob/user) - if(..(user, 0) && user == loc) - to_chat(user, "[round(reagents.total_volume)] units left.") + . = ..() + if(get_dist(user, src) && user == loc) + . += "[round(reagents.total_volume)] units left." /obj/item/reagent_containers/spray/verb/empty() diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index fc9d5d56134..41fa898905d 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -116,10 +116,9 @@ boom() /obj/structure/reagent_dispensers/fueltank/examine(mob/user) - if(!..(user, 2)) - return - if(rig) - to_chat(usr, "There is some kind of device rigged to the tank.") + . = ..() + if(get_dist(user, src) <= 2 && rig) + . += "There is some kind of device rigged to the tank." /obj/structure/reagent_dispensers/fueltank/attack_hand() if(rig) @@ -224,9 +223,9 @@ var/paper_cups = 25 //Paper cups left from the cooler /obj/structure/reagent_dispensers/water_cooler/examine(mob/user) - if(!..(user, 2)) - return - to_chat(user, "There are [paper_cups ? paper_cups : "no"] paper cups left.") + . = ..() + if(get_dist(user, src) <= 2) + . += "There are [paper_cups ? paper_cups : "no"] paper cups left." /obj/structure/reagent_dispensers/water_cooler/attack_hand(mob/living/user) if(!paper_cups) diff --git a/code/modules/ruins/lavalandruin_code/dead_ratvar.dm b/code/modules/ruins/lavalandruin_code/dead_ratvar.dm index cde2007d643..fa30c9eb273 100644 --- a/code/modules/ruins/lavalandruin_code/dead_ratvar.dm +++ b/code/modules/ruins/lavalandruin_code/dead_ratvar.dm @@ -23,7 +23,7 @@ /obj/effect/clockwork/overlay/examine(mob/user) if(linked) - linked.examine(user) + return linked.examine(user) /obj/effect/clockwork/overlay/ex_act() return FALSE diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm index 44f27b5deb4..219753d4524 100644 --- a/code/modules/surgery/organs/augments_arms.dm +++ b/code/modules/surgery/organs/augments_arms.dm @@ -30,8 +30,8 @@ transform = matrix(-1, 0, 0, 0, 1, 0) /obj/item/organ/internal/cyberimp/arm/examine(mob/user) - ..() - to_chat(user, "[src] is assembled in the [parent_organ == "r_arm" ? "right" : "left"] arm configuration. You can use a screwdriver to reassemble it.") + . = ..() + . += "[src] is assembled in the [parent_organ == "r_arm" ? "right" : "left"] arm configuration. You can use a screwdriver to reassemble it." /obj/item/organ/internal/cyberimp/arm/attackby(obj/item/I, mob/user, params) if(isscrewdriver(I)) diff --git a/code/modules/surgery/organs/organ.dm b/code/modules/surgery/organs/organ.dm index 29a13cf1e08..5b82fdf8c23 100644 --- a/code/modules/surgery/organs/organ.dm +++ b/code/modules/surgery/organs/organ.dm @@ -145,12 +145,12 @@ return 0 /obj/item/organ/examine(mob/user) - ..(user) + . = ..() if(status & ORGAN_DEAD) if(!is_robotic()) - to_chat(user, "The decay has set in.") + . += "The decay has set in." else - to_chat(user, "It looks in need of repairs.") + . += "It looks in need of repairs." /obj/item/organ/proc/handle_germ_effects() //** Handle the effects of infections diff --git a/code/modules/telesci/telepad.dm b/code/modules/telesci/telepad.dm index 893e9719fb4..8ff937eea6f 100644 --- a/code/modules/telesci/telepad.dm +++ b/code/modules/telesci/telepad.dm @@ -136,8 +136,8 @@ rcell = new(src) /obj/item/rcs/examine(mob/user) - ..(user) - to_chat(user, "There are [round(rcell.charge/chargecost)] charge\s left.") + . = ..() + . += "There are [round(rcell.charge/chargecost)] charge\s left." /obj/item/rcs/Destroy() QDEL_NULL(rcell) diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm index 1deedc434a9..0f737823d5b 100644 --- a/code/modules/telesci/telesci_computer.dm +++ b/code/modules/telesci/telesci_computer.dm @@ -42,8 +42,8 @@ return ..() /obj/machinery/computer/telescience/examine(mob/user) - ..(user) - to_chat(user, "There are [crystals ? crystals : "no"] bluespace crystal\s in the crystal slots.") + . = ..() + . += "There are [crystals ? crystals : "no"] bluespace crystal\s in the crystal slots." /obj/machinery/computer/telescience/Initialize() ..() diff --git a/code/modules/vehicle/ambulance.dm b/code/modules/vehicle/ambulance.dm index f10f9d9769c..29fb4e0108f 100644 --- a/code/modules/vehicle/ambulance.dm +++ b/code/modules/vehicle/ambulance.dm @@ -107,7 +107,7 @@ /obj/structure/bed/amb_trolley/examine(mob/user) . = ..() - to_chat(user, "Drag [src]'s sprite over the ambulance to (de)attach it.") + . += "Drag [src]'s sprite over the ambulance to (de)attach it." /obj/structure/bed/amb_trolley/MouseDrop(obj/over_object as obj) ..() diff --git a/code/modules/vehicle/janicart.dm b/code/modules/vehicle/janicart.dm index 0f4382c92d1..2445e983fd3 100644 --- a/code/modules/vehicle/janicart.dm +++ b/code/modules/vehicle/janicart.dm @@ -56,9 +56,9 @@ /obj/vehicle/janicart/examine(mob/user) - ..() + . = ..() if(floorbuffer) - to_chat(user, "It has been upgraded with a floor buffer.") + . += "It has been upgraded with a floor buffer." /obj/vehicle/janicart/attackby(obj/item/I, mob/user, params) From fdc208c3e0be05ed08b1abf57601525e16f118e5 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 26 Sep 2019 01:05:03 -0400 Subject: [PATCH 41/57] Automatic changelog generation for PR #12280 [ci skip] --- html/changelogs/AutoChangeLog-pr-12280.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12280.yml diff --git a/html/changelogs/AutoChangeLog-pr-12280.yml b/html/changelogs/AutoChangeLog-pr-12280.yml new file mode 100644 index 00000000000..83ea693ce02 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12280.yml @@ -0,0 +1,5 @@ +author: "farie82" +delete-after: True +changes: + - bugfix: "Morphs examine text now stays true to the humanoid target they choose." + - tweak: "Cult constructs now show their examine text when you're next to it. Instead of on top of it." From 56d994b464dff0ec3745b3aa167c45db0addf6ac Mon Sep 17 00:00:00 2001 From: Couls Date: Thu, 26 Sep 2019 19:53:09 -0400 Subject: [PATCH 42/57] Slime people rework (#11990) --- .../mob/living/carbon/human/species/slime.dm | 22 ++++++++++++++---- code/modules/surgery/organs/subtypes/slime.dm | 11 +++++++++ icons/obj/species_organs/slime.dmi | Bin 0 -> 1687 bytes paradise.dme | 1 + 4 files changed, 29 insertions(+), 5 deletions(-) create mode 100644 code/modules/surgery/organs/subtypes/slime.dm create mode 100644 icons/obj/species_organs/slime.dmi diff --git a/code/modules/mob/living/carbon/human/species/slime.dm b/code/modules/mob/living/carbon/human/species/slime.dm index 0b4080d6851..76e7ce2afee 100644 --- a/code/modules/mob/living/carbon/human/species/slime.dm +++ b/code/modules/mob/living/carbon/human/species/slime.dm @@ -25,8 +25,7 @@ male_cough_sounds = list('sound/effects/slime_squish.ogg') female_cough_sounds = list('sound/effects/slime_squish.ogg') - species_traits = list(LIPS, IS_WHITELISTED, NO_BREATHE, NO_INTORGANS, NO_SCAN) - dies_at_threshold = TRUE + species_traits = list(LIPS, IS_WHITELISTED, NO_SCAN) clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS bodyflags = HAS_SKIN_COLOR | NO_EYES dietflags = DIET_CARN @@ -35,16 +34,29 @@ flesh_color = "#5fe8b1" blood_color = "#0064C8" exotic_blood = "water" - blood_damage_type = TOX butt_sprite = "slime" //Has default darksight of 2. has_organ = list( - "brain" = /obj/item/organ/internal/brain/slime + "brain" = /obj/item/organ/internal/brain/slime, + "osmatic pressure regulator" = /obj/item/organ/internal/heart/slime, + "gas exchange membrane" = /obj/item/organ/internal/lungs/slime ) mutantears = null - + has_limbs = list( + "chest" = list("path" = /obj/item/organ/external/chest/unbreakable), + "groin" = list("path" = /obj/item/organ/external/groin/unbreakable), + "head" = list("path" = /obj/item/organ/external/head/unbreakable), + "l_arm" = list("path" = /obj/item/organ/external/arm/unbreakable), + "r_arm" = list("path" = /obj/item/organ/external/arm/right/unbreakable), + "l_leg" = list("path" = /obj/item/organ/external/leg/unbreakable), + "r_leg" = list("path" = /obj/item/organ/external/leg/right/unbreakable), + "l_hand" = list("path" = /obj/item/organ/external/hand/unbreakable), + "r_hand" = list("path" = /obj/item/organ/external/hand/right/unbreakable), + "l_foot" = list("path" = /obj/item/organ/external/foot/unbreakable), + "r_foot" = list("path" = /obj/item/organ/external/foot/right/unbreakable) + ) suicide_messages = list( "is melting into a puddle!", "is ripping out their own core!", diff --git a/code/modules/surgery/organs/subtypes/slime.dm b/code/modules/surgery/organs/subtypes/slime.dm new file mode 100644 index 00000000000..a1c4e5a0bf6 --- /dev/null +++ b/code/modules/surgery/organs/subtypes/slime.dm @@ -0,0 +1,11 @@ +/obj/item/organ/internal/heart/slime + icon = 'icons/obj/species_organs/slime.dmi' + name = "osmotic pressure regulator" + icon_state = "heart" + desc = "It appears to be some kind of biological pump that uses osmotic pressure to regulate water flow. It seems to work similar to a heart." + +/obj/item/organ/internal/lungs/slime + icon = 'icons/obj/species_organs/slime.dmi' + name = "gas exchange membrane" + icon_state = "lungs" + desc = "Membrane used for oxygen intake and gas exchange. These seem to work similar to lungs." \ No newline at end of file diff --git a/icons/obj/species_organs/slime.dmi b/icons/obj/species_organs/slime.dmi new file mode 100644 index 0000000000000000000000000000000000000000..58ec636ca7ecc7caf9d98f1f2f927006e3d95d94 GIT binary patch literal 1687 zcmV;I259+-P)V=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex7wuvIWN;^NFm z%}mcIfpCgT5=&AQY!#F;QWJ|xl(;xkGK-28Y!wW-IMa#}b5kK~xT>7ey!2vRs+1L6 z{ah4Wd_B1U7j7ixug^2W000HrNklxh)?$_V<`#itres|>j`SbWc!(=;wZ1dKDY$uRy z-WrhY1k%Onc2TF>MKg`_#u@+s*4BDtYJx7^8=DW(p=ZaAA0U;PB$EwDs(nE7K{~`H z!uqwV$`vL0NDlxKA1pP&;k!040pRr+;dHyGwY46jhda@}^Lvs`jFd{C`5+x~loS1` z$~-jInS^cif>qBiQxcK{CHhETXU|8SJ^#6@<7MM?yJ*cmXU1_f8;}$qA>PtYH?1f= z*%=u9?OG=jMt3>M;pXaaO6sb3T_#)~@n$spfW{JNK1he^?D=SX-&{rrgJ1tT!-548 ziad7>qvrq>Sehda13-KxWa$p_4_`$&Bxk?Bt^GgeQZ+;CCRhd_`1{pP9R;OKP7dOc zDFA@Eh$G>9GEFElbh&v5qr04d5FVCrDv4;t>2}drt7A@ltksb`6dE75#}Op!5^C7@X6$%8BdIR>F~Fwz=}2ifZ=e@+;8ywRm55y z5vSXAUu!H)23Rg5cx#~42LM!(i5Y8#p#qbEFdewzqv3lpW%L}_$Aqxq1c^=g3U3BV zeU{4zrls%&B$vMG@k90a!RT}eLA2izM0>X&+P$jBA2A&6iPY?K7HBm=lL0H%byfht zwSfub(yEc@q@UNB^1v~9gpCrSkL3`3j3)rVF-76tyLtBkVD&o8q$~DWoNgCoMH~9t z+98PcTL3zxmYR$HzB{Erp#dly5yXZL0KwSgj3l(wFVkXz=0@nl$1)A;u2l96*ZTmI zf>DzSH44avF-!}}{A+9FCx!v_y{XB3K1uPa$3H9HI3bAZErG*VctKq64-Rxym)SRj z0fYpx!RK|Kt1ACo1iLhkT`cyZD`0ms9opWs9b2~9Dv7#8amb#Mk7UejGRB$WUg<&g zS9e&;W#9u{)b`!S#T5?OQ$nDR0YE%1FWKFk+2e5DvX9Kpe3EWKZ0HMku7v0(tEU2< z3kJYC23W^ztH1bVT$oWBNpl=qJ_g)c{~yM~lYyzoXV{ zj@tmB{nTkik%(TF9_y*f(P`=x(o(&U$kRjP-GFC61^9;mZvs#thz%wjy?Rj)TP^`W zz;o0Fz*17(bOgZ4#e!=xfPev26)MLjs2m?7swyqm^;PLf1t^N5i^azv#YUj0_tS1p zo*{C5#QQ)H?Y#ldl|1X7ErkKkg%yC+Ki1o`0ssWD#Sg#|8tm8+Z(TDJ8tm8#pdY{= ziv`zYz}b_-L#%;-GvpJF%Li*+I6+|DkHtxy7Pt?gNZ*hmSQd zlx1hz-f6;kZy5Z`58Yu0J9$3(cdXR`2Ba+am_J%v+js&`XSyFqO?Z-&zXv4Qar;a^0MMw+5S~i_z>$@W zHE9LYz+P|PPXW)-jQ}va<7X@$$iRSXu-Du7&FtY^ji)O-$s1+BtKg0PDEcyZYe2RW h$Tn{c$aVtR=3jXFa}Ktq;+y~g002ovPDHLkV1j~dHZK4G literal 0 HcmV?d00001 diff --git a/paradise.dme b/paradise.dme index 55c92017702..4bf862793c8 100644 --- a/paradise.dme +++ b/paradise.dme @@ -2442,6 +2442,7 @@ #include "code\modules\surgery\organs\subtypes\plasmaman.dm" #include "code\modules\surgery\organs\subtypes\shadow.dm" #include "code\modules\surgery\organs\subtypes\skrell.dm" +#include "code\modules\surgery\organs\subtypes\slime.dm" #include "code\modules\surgery\organs\subtypes\standard.dm" #include "code\modules\surgery\organs\subtypes\tajaran.dm" #include "code\modules\surgery\organs\subtypes\unathi.dm" From b3e584e689470c065894c9295f2061d13f12fb71 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 26 Sep 2019 19:53:12 -0400 Subject: [PATCH 43/57] Automatic changelog generation for PR #11990 [ci skip] --- html/changelogs/AutoChangeLog-pr-11990.yml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11990.yml diff --git a/html/changelogs/AutoChangeLog-pr-11990.yml b/html/changelogs/AutoChangeLog-pr-11990.yml new file mode 100644 index 00000000000..c6ebbcebdbf --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11990.yml @@ -0,0 +1,8 @@ +author: "Couls" +delete-after: True +changes: + - rscadd: "Slime lungs and heart" + - rscdel: "Slimes no longer take toxins damage from blood loss" + - rscdel: "Slimes no longer take brute damage in crit" + - rscadd: "Slimes now breathe" + - tweak: "slimes now use new crit" From a873c075c82de025b98f5dba7fa356cfcce6e003 Mon Sep 17 00:00:00 2001 From: TDSSS <32099540+TDSSS@users.noreply.github.com> Date: Fri, 27 Sep 2019 01:54:38 +0200 Subject: [PATCH 44/57] Fies missing surgery tools in abductor ship (#12428) --- _maps/map_files/cyberiad/z2.dmm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm index ba60ea44f3b..ffb4f0fbc7f 100644 --- a/_maps/map_files/cyberiad/z2.dmm +++ b/_maps/map_files/cyberiad/z2.dmm @@ -4300,6 +4300,9 @@ /obj/structure/table/abductor, /obj/item/surgicaldrill/alien, /obj/item/circular_saw/alien, +/obj/item/FixOVein/alien, +/obj/item/bonesetter/alien, +/obj/item/bonegel/alien, /turf/unsimulated/floor/abductor, /area/abductor_ship) "ll" = ( From d3ff9b9fd137ba22b5911fbe05475d8e289f5f3b Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 26 Sep 2019 19:54:39 -0400 Subject: [PATCH 45/57] Automatic changelog generation for PR #12428 [ci skip] --- html/changelogs/AutoChangeLog-pr-12428.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12428.yml diff --git a/html/changelogs/AutoChangeLog-pr-12428.yml b/html/changelogs/AutoChangeLog-pr-12428.yml new file mode 100644 index 00000000000..65a6e2a14f7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12428.yml @@ -0,0 +1,4 @@ +author: "TDSSS" +delete-after: True +changes: + - bugfix: "added missing tools to one abductor ship" From 80bb2218911a9b5f21610f41be0742228b199e9e Mon Sep 17 00:00:00 2001 From: MrMagolor <36342804+MrMagolor@users.noreply.github.com> Date: Thu, 26 Sep 2019 19:59:20 -0400 Subject: [PATCH 46/57] Adds an ATMOS Holofan Creator to the Chief Engineer's locker (#12419) --- .../structures/crates_lockers/closets/secure/engineering.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm index 0608eb64cbb..517732cdd11 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -40,6 +40,7 @@ new /obj/item/reagent_containers/food/drinks/mug/ce(src) new /obj/item/organ/internal/cyberimp/eyes/meson(src) new /obj/item/clothing/accessory/medal/engineering(src) + new /obj/item/holosign_creator/atmos(src) /obj/structure/closet/secure_closet/engineering_electrical From f5907624579a24a8091015238c6d45f4d6dccbed Mon Sep 17 00:00:00 2001 From: MrMagolor <36342804+MrMagolor@users.noreply.github.com> Date: Thu, 26 Sep 2019 20:01:48 -0400 Subject: [PATCH 47/57] Cult Pylon Turns Simulated Wall into Cult Wall and Ignore Unsimulated Walls (#12418) --- code/game/gamemodes/cult/cult_structures.dm | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm index 0620b97718a..4dd309b23dd 100644 --- a/code/game/gamemodes/cult/cult_structures.dm +++ b/code/game/gamemodes/cult/cult_structures.dm @@ -167,11 +167,13 @@ ..() var/list/blacklisted_pylon_turfs = typecacheof(list( - /turf/simulated/floor/engine/cult, - /turf/space, - /turf/simulated/floor/plating/lava, - /turf/simulated/floor/chasm, - /turf/simulated/wall, + /turf/simulated/floor/engine/cult, + /turf/space, + /turf/simulated/floor/plating/lava, + /turf/simulated/floor/chasm, + /turf/simulated/wall/cult, + /turf/simulated/wall/cult/artificer, + /turf/unsimulated/wall )) /obj/structure/cult/functional/pylon @@ -231,7 +233,10 @@ var/list/blacklisted_pylon_turfs = typecacheof(list( var/turf/T = safepick(validturfs) if(T) - T.ChangeTurf(/turf/simulated/floor/engine/cult) + if(istype(T, /turf/simulated/floor)) + T.ChangeTurf(/turf/simulated/floor/engine/cult) + if(istype(T, /turf/simulated/wall)) + T.ChangeTurf(/turf/simulated/wall/cult) else var/turf/simulated/floor/engine/cult/F = safepick(cultturfs) if(F) From 23a66028f5e9c68d16ea42f732de74417d872a04 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Thu, 26 Sep 2019 20:01:50 -0400 Subject: [PATCH 48/57] Automatic changelog generation for PR #12418 [ci skip] --- html/changelogs/AutoChangeLog-pr-12418.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12418.yml diff --git a/html/changelogs/AutoChangeLog-pr-12418.yml b/html/changelogs/AutoChangeLog-pr-12418.yml new file mode 100644 index 00000000000..f2cfdae1b20 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12418.yml @@ -0,0 +1,5 @@ +author: "MrMagolor" +delete-after: True +changes: + - bugfix: "Cult pylons no longer delete unsimulated walls and turn them into floors." + - tweak: "Cult pylons now turn simulated walls into cult walls." From 47511c92d7a83890a03f8b1f4ef378f0922777d7 Mon Sep 17 00:00:00 2001 From: SteelSlayer <42044220+SteelSlayer@users.noreply.github.com> Date: Fri, 27 Sep 2019 10:02:38 -0500 Subject: [PATCH 49/57] fixes roundstart autotraitors (#12435) --- code/game/gamemodes/autotraitor/autotraitor.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/gamemodes/autotraitor/autotraitor.dm b/code/game/gamemodes/autotraitor/autotraitor.dm index 390c9ab37b5..cc0cc307ed5 100644 --- a/code/game/gamemodes/autotraitor/autotraitor.dm +++ b/code/game/gamemodes/autotraitor/autotraitor.dm @@ -45,12 +45,12 @@ for(var/i = 0, i < num_traitors, i++) var/datum/mind/traitor = pick(possible_traitors) - traitors += traitor + pre_traitors += traitor possible_traitors.Remove(traitor) - for(var/datum/mind/traitor in traitors) + for(var/datum/mind/traitor in pre_traitors) if(!traitor || !istype(traitor)) - traitors.Remove(traitor) + pre_traitors.Remove(traitor) continue if(istype(traitor)) traitor.special_role = SPECIAL_ROLE_TRAITOR From f68540d04c8af91664fcfde541b395954390f2ab Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 27 Sep 2019 11:02:40 -0400 Subject: [PATCH 50/57] Automatic changelog generation for PR #12435 [ci skip] --- html/changelogs/AutoChangeLog-pr-12435.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12435.yml diff --git a/html/changelogs/AutoChangeLog-pr-12435.yml b/html/changelogs/AutoChangeLog-pr-12435.yml new file mode 100644 index 00000000000..a7b6cfbe085 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12435.yml @@ -0,0 +1,4 @@ +author: "SteelSlayer" +delete-after: True +changes: + - bugfix: "Fixes round-start autotraitors not getting their objectives and uplink codes" From 35395a5b29d86a9b3beb953356541684c8d7078c Mon Sep 17 00:00:00 2001 From: variableundefined <40092670+variableundefined@users.noreply.github.com> Date: Fri, 27 Sep 2019 08:03:30 -0700 Subject: [PATCH 51/57] Manual Changelog Compile 9/26/2019 (#12430) --- html/changelog.html | 33 ++++++++++++++++++++++ html/changelogs/.all_changelog.yml | 24 ++++++++++++++++ html/changelogs/AutoChangeLog-pr-11990.yml | 8 ------ html/changelogs/AutoChangeLog-pr-12280.yml | 5 ---- html/changelogs/AutoChangeLog-pr-12405.yml | 6 ---- html/changelogs/AutoChangeLog-pr-12417.yml | 4 --- html/changelogs/AutoChangeLog-pr-12418.yml | 5 ---- html/changelogs/AutoChangeLog-pr-12428.yml | 4 --- 8 files changed, 57 insertions(+), 32 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-11990.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12280.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12405.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12417.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12418.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12428.yml diff --git a/html/changelog.html b/html/changelog.html index c0c76d3ffdd..d40cde16a74 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,39 @@ -->
      +

      26 September 2019

      +

      AzuleUtama updated:

      +
        +
      • Improvised shotguns are now in the correct tab when trying to craft them.
      • +
      +

      Couls updated:

      +
        +
      • Slime lungs and heart
      • +
      • Slimes no longer take toxins damage from blood loss
      • +
      • Slimes no longer take brute damage in crit
      • +
      • Slimes now breathe
      • +
      • slimes now use new crit
      • +
      +

      Kyep updated:

      +
        +
      • Fixed NPC redsuited syndicates from being unable to move in space.
      • +
      • Fixed NPC bots thinking that they can path through airlocks which are welded shut. refactor: Refactors some safety checks so that its impossible for depot mobs to generate runtimes in rare cases (e.g: admins spawning them outside the depot for testing)
      • +
      +

      MrMagolor updated:

      +
        +
      • Cult pylons no longer delete unsimulated walls and turn them into floors.
      • +
      • Cult pylons now turn simulated walls into cult walls.
      • +
      +

      TDSSS updated:

      +
        +
      • added missing tools to one abductor ship
      • +
      +

      farie82 updated:

      +
        +
      • Morphs examine text now stays true to the humanoid target they choose.
      • +
      • Cult constructs now show their examine text when you're next to it. Instead of on top of it.
      • +
      +

      24 September 2019

      AzuleUtama updated:

        diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 0e23667e483..cbc77462782 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -11559,3 +11559,27 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - bugfix: Fixed clown changelings not losing comic sans on transformation - tweak: Clowns can now lose the clumsy and comic genes through DNA manipulation (but not mutadone) +2019-09-26: + AzuleUtama: + - bugfix: Improvised shotguns are now in the correct tab when trying to craft them. + Couls: + - rscadd: Slime lungs and heart + - rscdel: Slimes no longer take toxins damage from blood loss + - rscdel: Slimes no longer take brute damage in crit + - rscadd: Slimes now breathe + - tweak: slimes now use new crit + Kyep: + - bugfix: Fixed NPC redsuited syndicates from being unable to move in space. + - bugfix: 'Fixed NPC bots thinking that they can path through airlocks which are + welded shut. refactor: Refactors some safety checks so that its impossible for + depot mobs to generate runtimes in rare cases (e.g: admins spawning them outside + the depot for testing)' + MrMagolor: + - bugfix: Cult pylons no longer delete unsimulated walls and turn them into floors. + - tweak: Cult pylons now turn simulated walls into cult walls. + TDSSS: + - bugfix: added missing tools to one abductor ship + farie82: + - bugfix: Morphs examine text now stays true to the humanoid target they choose. + - tweak: Cult constructs now show their examine text when you're next to it. Instead + of on top of it. diff --git a/html/changelogs/AutoChangeLog-pr-11990.yml b/html/changelogs/AutoChangeLog-pr-11990.yml deleted file mode 100644 index c6ebbcebdbf..00000000000 --- a/html/changelogs/AutoChangeLog-pr-11990.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: "Couls" -delete-after: True -changes: - - rscadd: "Slime lungs and heart" - - rscdel: "Slimes no longer take toxins damage from blood loss" - - rscdel: "Slimes no longer take brute damage in crit" - - rscadd: "Slimes now breathe" - - tweak: "slimes now use new crit" diff --git a/html/changelogs/AutoChangeLog-pr-12280.yml b/html/changelogs/AutoChangeLog-pr-12280.yml deleted file mode 100644 index 83ea693ce02..00000000000 --- a/html/changelogs/AutoChangeLog-pr-12280.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "farie82" -delete-after: True -changes: - - bugfix: "Morphs examine text now stays true to the humanoid target they choose." - - tweak: "Cult constructs now show their examine text when you're next to it. Instead of on top of it." diff --git a/html/changelogs/AutoChangeLog-pr-12405.yml b/html/changelogs/AutoChangeLog-pr-12405.yml deleted file mode 100644 index 8a6b5355f41..00000000000 --- a/html/changelogs/AutoChangeLog-pr-12405.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Kyep" -delete-after: True -changes: - - bugfix: "Fixed NPC redsuited syndicates from being unable to move in space." - - bugfix: "Fixed NPC bots thinking that they can path through airlocks which are welded shut. -refactor: Refactors some safety checks so that its impossible for depot mobs to generate runtimes in rare cases (e.g: admins spawning them outside the depot for testing)" diff --git a/html/changelogs/AutoChangeLog-pr-12417.yml b/html/changelogs/AutoChangeLog-pr-12417.yml deleted file mode 100644 index 65bc070f4a3..00000000000 --- a/html/changelogs/AutoChangeLog-pr-12417.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "AzuleUtama" -delete-after: True -changes: - - bugfix: "Improvised shotguns are now in the correct tab when trying to craft them." diff --git a/html/changelogs/AutoChangeLog-pr-12418.yml b/html/changelogs/AutoChangeLog-pr-12418.yml deleted file mode 100644 index f2cfdae1b20..00000000000 --- a/html/changelogs/AutoChangeLog-pr-12418.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "MrMagolor" -delete-after: True -changes: - - bugfix: "Cult pylons no longer delete unsimulated walls and turn them into floors." - - tweak: "Cult pylons now turn simulated walls into cult walls." diff --git a/html/changelogs/AutoChangeLog-pr-12428.yml b/html/changelogs/AutoChangeLog-pr-12428.yml deleted file mode 100644 index 65a6e2a14f7..00000000000 --- a/html/changelogs/AutoChangeLog-pr-12428.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "TDSSS" -delete-after: True -changes: - - bugfix: "added missing tools to one abductor ship" From 2bf3883e5bd46fe2d721a132edbbef0d05289a12 Mon Sep 17 00:00:00 2001 From: Pidgey <35320204+PidgeyThePirate@users.noreply.github.com> Date: Sat, 28 Sep 2019 09:04:30 +1000 Subject: [PATCH 52/57] Issue #12420 - Guardian snapback null-space glitch fix (#12432) --- code/game/gamemodes/miniantags/guardian/guardian.dm | 3 ++- code/game/gamemodes/miniantags/guardian/types/protector.dm | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/code/game/gamemodes/miniantags/guardian/guardian.dm b/code/game/gamemodes/miniantags/guardian/guardian.dm index a527f055466..17d7187f439 100644 --- a/code/game/gamemodes/miniantags/guardian/guardian.dm +++ b/code/game/gamemodes/miniantags/guardian/guardian.dm @@ -73,7 +73,8 @@ qdel() /mob/living/simple_animal/hostile/guardian/proc/snapback() - if(summoner) + // If the summoner dies instantly, the summoner's ghost may be drawn into null space as the protector is deleted. This check should prevent that. + if(summoner && loc && summoner.loc) if(get_dist(get_turf(summoner),get_turf(src)) <= range) return else diff --git a/code/game/gamemodes/miniantags/guardian/types/protector.dm b/code/game/gamemodes/miniantags/guardian/types/protector.dm index 9206b0d1b0b..5fb31b8ba15 100644 --- a/code/game/gamemodes/miniantags/guardian/types/protector.dm +++ b/code/game/gamemodes/miniantags/guardian/types/protector.dm @@ -41,7 +41,8 @@ toggle = TRUE /mob/living/simple_animal/hostile/guardian/protector/snapback() //snap to what? snap to the guardian! - if(summoner) + // If the summoner dies instantly, the summoner's ghost may be drawn into null space as the protector is deleted. This check should prevent that. + if(summoner && loc && summoner.loc) if(get_dist(get_turf(summoner),get_turf(src)) <= range) return else From 3e31169357fec4d1076094121d6fb377d2857a67 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 27 Sep 2019 19:04:33 -0400 Subject: [PATCH 53/57] Automatic changelog generation for PR #12432 [ci skip] --- html/changelogs/AutoChangeLog-pr-12432.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12432.yml diff --git a/html/changelogs/AutoChangeLog-pr-12432.yml b/html/changelogs/AutoChangeLog-pr-12432.yml new file mode 100644 index 00000000000..ac1ff133849 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12432.yml @@ -0,0 +1,4 @@ +author: "PidgeyThePirate" +delete-after: True +changes: + - bugfix: "fixed a rare glitch in which a guardian that is killed instantly (i.e by a wand of death) may draw its charge into null space." From 30bbc23b22c75a295242e6827645688180803773 Mon Sep 17 00:00:00 2001 From: Pidgey <35320204+PidgeyThePirate@users.noreply.github.com> Date: Sat, 28 Sep 2019 11:56:21 +1000 Subject: [PATCH 54/57] Issue #12331 - Stops bluespace anomaly from teleporting ghosts. (#12433) --- code/modules/events/anomaly_bluespace.dm | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/code/modules/events/anomaly_bluespace.dm b/code/modules/events/anomaly_bluespace.dm index a8f11681577..c0d0472026f 100644 --- a/code/modules/events/anomaly_bluespace.dm +++ b/code/modules/events/anomaly_bluespace.dm @@ -43,9 +43,10 @@ var/y_distance = TO.y - FROM.y var/x_distance = TO.x - FROM.x for(var/atom/movable/A in range(12, FROM )) // iterate thru list of mobs in the area - if(istype(A, /obj/item/radio/beacon)) continue // don't teleport beacons because that's just insanely stupid - if(A.anchored) continue - + if(istype(A, /obj/item/radio/beacon)) // don't teleport beacons because that's just insanely stupid + continue + if(A.anchored || A.move_resist == INFINITY) + continue var/turf/newloc = locate(A.x + x_distance, A.y + y_distance, TO.z) // calculate the new place if(!A.Move(newloc)) // if the atom, for some reason, can't move, FORCE them to move! :) We try Move() first to invoke any movement-related checks the atom needs to perform after moving A.loc = locate(A.x + x_distance, A.y + y_distance, TO.z) From d4fce9086863e625f95c097302619397cd550249 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 27 Sep 2019 21:56:24 -0400 Subject: [PATCH 55/57] Automatic changelog generation for PR #12433 [ci skip] --- html/changelogs/AutoChangeLog-pr-12433.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12433.yml diff --git a/html/changelogs/AutoChangeLog-pr-12433.yml b/html/changelogs/AutoChangeLog-pr-12433.yml new file mode 100644 index 00000000000..ae53494a9a0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12433.yml @@ -0,0 +1,4 @@ +author: "PidgeyThePirate" +delete-after: True +changes: + - tweak: "bluespace anomalies no longer teleport ghosts when their event fires." From d63ac45319bd4a94fd989eee56481a42791b788f Mon Sep 17 00:00:00 2001 From: Pidgey <35320204+PidgeyThePirate@users.noreply.github.com> Date: Sat, 28 Sep 2019 11:56:53 +1000 Subject: [PATCH 56/57] Issue #12408 - Fixes drones requiring all-access to reboot. (#12431) --- code/modules/mob/living/silicon/robot/drone/drone.dm | 2 +- code/modules/mob/living/silicon/robot/robot.dm | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index 0f3422f237a..edf53f56918 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -13,7 +13,7 @@ braintype = "Robot" lawupdate = 0 density = 0 - req_access = list(access_engine, access_robotics) + req_one_access = list(access_engine, access_robotics) ventcrawler = 2 magpulse = 1 mob_size = MOB_SIZE_SMALL diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 900705733ba..76023c7ac63 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -65,7 +65,8 @@ var/list/robot_verbs_default = list( var/wiresexposed = 0 var/locked = 1 - var/list/req_access = list(access_robotics) + var/list/req_one_access = list(access_robotics) + var/list/req_access var/ident = 0 //var/list/laws = list() var/alarms = list("Motion"=list(), "Fire"=list(), "Atmosphere"=list(), "Power"=list(), "Camera"=list()) @@ -891,6 +892,7 @@ var/list/robot_verbs_default = list( /mob/living/silicon/robot/proc/allowed(obj/item/I) var/obj/dummy = new /obj(null) // Create a dummy object to check access on as to avoid having to snowflake check_access on every mob dummy.req_access = req_access + dummy.req_one_access = req_one_access if(dummy.check_access(I)) qdel(dummy) @@ -1302,7 +1304,7 @@ var/list/robot_verbs_default = list( designation = "SpecOps" lawupdate = 0 scrambledcodes = 1 - req_access = list(access_cent_specops) + req_one_access = list(access_cent_specops) ionpulse = 1 magpulse = 1 pdahide = 1 @@ -1352,7 +1354,7 @@ var/list/robot_verbs_default = list( designation = "ERT" lawupdate = 0 scrambledcodes = 1 - req_access = list(access_cent_specops) + req_one_access = list(access_cent_specops) ionpulse = 1 force_modules = list("Engineering", "Medical", "Security") From 9f2ee00f15dae0b2296bb1ca2827850f4542e55d Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 27 Sep 2019 21:56:55 -0400 Subject: [PATCH 57/57] Automatic changelog generation for PR #12431 [ci skip] --- html/changelogs/AutoChangeLog-pr-12431.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12431.yml diff --git a/html/changelogs/AutoChangeLog-pr-12431.yml b/html/changelogs/AutoChangeLog-pr-12431.yml new file mode 100644 index 00000000000..af6524de08a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12431.yml @@ -0,0 +1,4 @@ +author: "PidgeyThePirate" +delete-after: True +changes: + - bugfix: "Rebooting a drone no longer requires both engineering and robotics access."

KVk0H@!q&S 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 From 9b4785692a8ee7745e994289336b3fa4ceee3612 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Mon, 23 Sep 2019 23:01:14 -0400 Subject: [PATCH 04/57] Automatic changelog generation for PR #12400 [ci skip] --- html/changelogs/AutoChangeLog-pr-12400.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12400.yml diff --git a/html/changelogs/AutoChangeLog-pr-12400.yml b/html/changelogs/AutoChangeLog-pr-12400.yml new file mode 100644 index 00000000000..993a116d9b9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12400.yml @@ -0,0 +1,6 @@ +author: "Ionward" +delete-after: True +changes: + - bugfix: "Fixed Tajaran fat sprites, they are no longer duplicates of their slim torso." + - bugfix: "Fixed fat aqua jumpsuit only using one direction." + - bugfix: "Fixed missing Lasagna icon." From f3023f78768643674f276ee6879315331c2e74f1 Mon Sep 17 00:00:00 2001 From: Dave Date: Mon, 23 Sep 2019 23:08:37 -0400 Subject: [PATCH 05/57] Sword shade godmode (#12402) --- code/modules/mob/living/simple_animal/shade.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm index 47113341881..14714452850 100644 --- a/code/modules/mob/living/simple_animal/shade.dm +++ b/code/modules/mob/living/simple_animal/shade.dm @@ -46,3 +46,7 @@ /mob/living/simple_animal/shade/sword universal_speak = 1 faction = list("neutral") + +/mob/living/simple_animal/shade/sword/Initialize(mapload) + .=..() + status_flags |= GODMODE \ No newline at end of file From dd98edeac70547c9f24e19542c4809b59934e603 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Mon, 23 Sep 2019 23:08:40 -0400 Subject: [PATCH 06/57] Automatic changelog generation for PR #12402 [ci skip] --- html/changelogs/AutoChangeLog-pr-12402.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12402.yml diff --git a/html/changelogs/AutoChangeLog-pr-12402.yml b/html/changelogs/AutoChangeLog-pr-12402.yml new file mode 100644 index 00000000000..d6acda813a4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12402.yml @@ -0,0 +1,4 @@ +author: "Dave-TH" +delete-after: True +changes: + - bugfix: "The ghosts inside possessed blades are now invincible and will not die to weird edge cases." From 2e26973c3cab5ce22f876b467c3530ba0678f7ac Mon Sep 17 00:00:00 2001 From: Ty-Omaha Date: Tue, 24 Sep 2019 18:11:12 -0400 Subject: [PATCH 07/57] Increases timer for blob mouse spawn (#12359) --- code/modules/events/blob.dm | 4 ++-- code/modules/mob/living/simple_animal/friendly/mouse.dm | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/events/blob.dm b/code/modules/events/blob.dm index 54394411e73..7a998f06dcb 100644 --- a/code/modules/events/blob.dm +++ b/code/modules/events/blob.dm @@ -1,6 +1,6 @@ /datum/event/blob - announceWhen = 120 - endWhen = 180 + announceWhen = 180 + endWhen = 240 /datum/event/blob/announce() event_announcement.Announce("Confirmed outbreak of level 5 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/AI/outbreak5.ogg') diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index 5da6bee438d..3ca0c840efd 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -179,7 +179,7 @@ minbodytemp = 0 gold_core_spawnable = NO_SPAWN var/cycles_alive = 0 - var/cycles_limit = 30 + var/cycles_limit = 60 var/has_burst = FALSE /mob/living/simple_animal/mouse/blobinfected/Life() From a44718f5e5327dfd248f0ef3be3a61b4c3a38f91 Mon Sep 17 00:00:00 2001 From: Kyep <16434066+Kyep@users.noreply.github.com> Date: Tue, 24 Sep 2019 22:11:29 +0000 Subject: [PATCH 08/57] Fixes incorrect names of syndie/antag coins (#12362) --- code/modules/mining/ores_coins.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index 120dacad800..c86582c183b 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -322,6 +322,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ var/string_attached var/list/sideslist = list("heads","tails") var/cmineral = null + var/name_by_cmineral = TRUE var/cooldown = 0 var/credits = 10 @@ -330,7 +331,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ pixel_y = rand(0,8)-8 icon_state = "coin_[cmineral]_[sideslist[1]]" - if(cmineral) + if(cmineral && name_by_cmineral) name = "[cmineral] coin" /obj/item/coin/gold @@ -405,6 +406,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ desc = "A novelty coin that helps the heart know what hard evidence cannot prove." sideslist = list("valid", "salad") credits = 20 + name_by_cmineral = FALSE /obj/item/coin/antagtoken/syndicate name = "syndicate coin" From b86251b26d15da55e6fa338abfc878cad1a31651 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Tue, 24 Sep 2019 18:11:31 -0400 Subject: [PATCH 09/57] Automatic changelog generation for PR #12362 [ci skip] --- html/changelogs/AutoChangeLog-pr-12362.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12362.yml diff --git a/html/changelogs/AutoChangeLog-pr-12362.yml b/html/changelogs/AutoChangeLog-pr-12362.yml new file mode 100644 index 00000000000..ca4c4171aa7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12362.yml @@ -0,0 +1,4 @@ +author: "Kyep" +delete-after: True +changes: + - bugfix: "Fixed a small bug that caused coins named \"syndicate coin\" or \"antag token\" to both incorrectly appear as \"valid coin\"." From bc85be73a195ec7a0d2707f60c253235506b534d Mon Sep 17 00:00:00 2001 From: Evankhell561 <49106866+Evankhell561@users.noreply.github.com> Date: Tue, 24 Sep 2019 18:12:07 -0400 Subject: [PATCH 10/57] mechs now start with a high-capacity power cell+ (#12382) --- code/game/mecha/mecha.dm | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 258d0eb7898..e1c5a03b3a6 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -151,9 +151,7 @@ C.forceMove(src) cell = C return - cell = new(src) - cell.charge = 15000 - cell.maxcharge = 15000 + cell = new/obj/item/stock_parts/cell/high/plus(src) /obj/mecha/proc/add_cabin() cabin_air = new From d17ab7e6d0a3ed64f6c377c04cbf5dcabb444b24 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Tue, 24 Sep 2019 18:12:08 -0400 Subject: [PATCH 11/57] Automatic changelog generation for PR #12382 [ci skip] --- html/changelogs/AutoChangeLog-pr-12382.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12382.yml diff --git a/html/changelogs/AutoChangeLog-pr-12382.yml b/html/changelogs/AutoChangeLog-pr-12382.yml new file mode 100644 index 00000000000..518ee606aaf --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12382.yml @@ -0,0 +1,4 @@ +author: "Evankhell561" +delete-after: True +changes: + - tweak: "mechs now start with a high-capacity power cell+" From a185a1e537d9e5391a9d2ec3209f64e545c50204 Mon Sep 17 00:00:00 2001 From: farie82 Date: Wed, 25 Sep 2019 00:12:16 +0200 Subject: [PATCH 12/57] Makes Toxic Compensation do the toxin damage it healed (#12383) --- code/datums/diseases/advance/symptoms/damage_converter.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/datums/diseases/advance/symptoms/damage_converter.dm b/code/datums/diseases/advance/symptoms/damage_converter.dm index cba4d4a4cd0..8ee98df67ef 100644 --- a/code/datums/diseases/advance/symptoms/damage_converter.dm +++ b/code/datums/diseases/advance/symptoms/damage_converter.dm @@ -44,10 +44,11 @@ Bonus if(!parts.len) return - + var/healed = 0 for(var/obj/item/organ/external/E in parts) + healed = min(E.brute_dam, get_damage) + min(E.burn_dam, get_damage) E.heal_damage(get_damage, get_damage, 0, 0) - M.adjustToxLoss(get_damage*parts.len) + M.adjustToxLoss(healed) else From 3eb4ad0ed599bcbecd027f510e72eb2dae7115f4 Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Tue, 24 Sep 2019 18:15:05 -0400 Subject: [PATCH 13/57] Maintainers Have No Sense of Right or Wrong (#12381) --- code/__DEFINES/misc.dm | 3 + code/game/gamemodes/objective.dm | 48 +++ code/game/gamemodes/wizard/rightandwrong.dm | 325 +++++++++--------- code/game/gamemodes/wizard/spellbook.dm | 36 +- code/modules/admin/secrets.dm | 4 +- code/modules/admin/topic.dm | 28 +- .../antagonists/survivalist/survivalist.dm | 41 +++ code/modules/mob/new_player/new_player.dm | 5 + paradise.dme | 1 + 9 files changed, 295 insertions(+), 196 deletions(-) create mode 100644 code/modules/antagonists/survivalist/survivalist.dm diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index a9e43b7c3a0..7dd5fc5a609 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -417,3 +417,6 @@ #define ENGTYPE_SING "Singularity" #define ENGTYPE_SM "Supermatter" #define ENGTYPE_TESLA "Tesla" + +#define SUMMON_GUNS "guns" +#define SUMMON_MAGIC "magic" \ No newline at end of file diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 42ebb351e42..8bdee684ae1 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -506,6 +506,54 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu return 0 return 1 +/datum/objective/steal_five_of_type + explanation_text = "Steal at least five items!" + var/list/wanted_items = list() + +/datum/objective/steal_five_of_type/New() + ..() + wanted_items = typecacheof(wanted_items) + +/datum/objective/steal_five_of_type/check_completion() + var/stolen_count = 0 + if(!isliving(owner.current)) + return FALSE + var/list/all_items = owner.current.GetAllContents() //this should get things in cheesewheels, books, etc. + for(var/obj/I in all_items) //Check for wanted items + if(is_type_in_typecache(I, wanted_items)) + stolen_count++ + return stolen_count >= 5 + +/datum/objective/steal_five_of_type/summon_guns + explanation_text = "Steal at least five guns!" + wanted_items = list(/obj/item/gun) + +/datum/objective/steal_five_of_type/summon_magic + explanation_text = "Steal at least five magical artefacts!" + wanted_items = list() + +/datum/objective/steal_five_of_type/summon_magic/New() + wanted_items = GLOB.summoned_magic_objectives + ..() + +/datum/objective/steal_five_of_type/summon_magic/check_completion() + var/stolen_count = 0 + if(!isliving(owner.current)) + return FALSE + var/list/all_items = owner.current.GetAllContents() //this should get things in cheesewheels, books, etc. + for(var/obj/I in all_items) //Check for wanted items + if(istype(I, /obj/item/spellbook) && !istype(I, /obj/item/spellbook/oneuse)) + var/obj/item/spellbook/spellbook = I + if(spellbook.uses) //if the book still has powers... + stolen_count++ //it counts. nice. + if(istype(I, /obj/item/spellbook/oneuse)) + var/obj/item/spellbook/oneuse/oneuse = I + if(!oneuse.used) + stolen_count++ + else if(is_type_in_typecache(I, wanted_items)) + stolen_count++ + return stolen_count >= 5 + /datum/objective/blood /datum/objective/blood/proc/gen_amount_goal(low = 150, high = 400) target_amount = rand(low,high) diff --git a/code/game/gamemodes/wizard/rightandwrong.dm b/code/game/gamemodes/wizard/rightandwrong.dm index e69a4b7ec79..76ac6dc603f 100644 --- a/code/game/gamemodes/wizard/rightandwrong.dm +++ b/code/game/gamemodes/wizard/rightandwrong.dm @@ -1,170 +1,169 @@ +//In this file: Summon Magic/Summon Guns/Summon Events +// 1 in 50 chance of getting something really special. +#define SPECIALIST_MAGIC_PROB 2 -/mob/proc/rightandwrong(summon_type, revolver_fight = FALSE, fake_revolver_fight = FALSE) //0 = Summon Guns, 1 = Summon Magic - var/list/gunslist = list("taser","egun","laser","revolver","detective","c20r","nuclear","deagle","gyrojet","pulse","suppressed","cannon","doublebarrel","shotgun","combatshotgun","bulldog","mateba","sabr","crossbow","saw","car","boltaction","arg","uzi","turret","pulsecarbine","decloner","mindflayer","kinetic","advplasmacutter","wormhole","wt550","grenadelauncher","medibeam", "fakerevolver") - var/list/magiclist = list("fireball","smoke","blind","mindswap","forcewall","knock","horsemask","charge", "summonitem", "wandnothing", "wanddeath", "wandresurrection", "wandpolymorph", "wandteleport", "wanddoor", "wandfireball", "staffhealing", "armor", "scrying", "staffdoor", "special","voodoo","special") - var/list/magicspeciallist = list("staffchange","staffanimation", "wandbelt", "contract", "staffchaos","necromantic") +GLOBAL_LIST_INIT(summoned_guns, list( + /obj/item/gun/energy/disabler, + /obj/item/gun/energy/gun, + /obj/item/gun/energy/gun/advtaser, + /obj/item/gun/energy/laser, + /obj/item/gun/projectile/revolver, + /obj/item/gun/projectile/revolver/detective, + /obj/item/gun/projectile/automatic/pistol/deagle/camo, + /obj/item/gun/projectile/automatic/gyropistol, + /obj/item/gun/energy/pulse, + /obj/item/gun/projectile/automatic/pistol, + /obj/item/gun/projectile/revolver/doublebarrel, + /obj/item/gun/projectile/shotgun, + /obj/item/gun/projectile/shotgun/automatic/combat, + /obj/item/gun/projectile/automatic/ar, + /obj/item/gun/projectile/revolver/mateba, + /obj/item/gun/projectile/shotgun/boltaction, + /obj/item/gun/projectile/automatic/mini_uzi, + /obj/item/gun/energy/lasercannon, + /obj/item/gun/energy/kinetic_accelerator/crossbow/large, + /obj/item/gun/energy/gun/nuclear, + /obj/item/gun/projectile/automatic/proto, + /obj/item/gun/projectile/automatic/c20r, + /obj/item/gun/projectile/automatic/l6_saw, + /obj/item/gun/projectile/automatic/m90, + /obj/item/gun/energy/alien, + /obj/item/gun/energy/gun/turret, + /obj/item/gun/energy/pulse/carbine, + /obj/item/gun/energy/decloner, + /obj/item/gun/energy/mindflayer, + /obj/item/gun/energy/kinetic_accelerator, + /obj/item/gun/energy/plasmacutter/adv, + /obj/item/gun/energy/wormhole_projector, + /obj/item/gun/projectile/automatic/wt550, + /obj/item/gun/projectile/automatic/shotgun/bulldog, + /obj/item/gun/projectile/revolver/grenadelauncher, + /obj/item/gun/projectile/revolver/golden, + /obj/item/gun/projectile/automatic/sniper_rifle, + /obj/item/gun/medbeam, + /obj/item/gun/energy/laser/scatter)) - to_chat(usr, "You summoned [summon_type ? "magic" : "guns"]!") - message_admins("[key_name_admin(usr)] summoned [summon_type ? "magic" : "guns"]! ([revolver_fight ? "Revolver duel!" : ""] [fake_revolver_fight ? "Suicidal revolver duel!" : ""])") +//if you add anything that isn't covered by the typepaths below, add it to summon_magic_objective_types +GLOBAL_LIST_INIT(summoned_magic, list( + /obj/item/spellbook/oneuse/fireball, + /obj/item/spellbook/oneuse/smoke, + /obj/item/spellbook/oneuse/blind, + /obj/item/spellbook/oneuse/mindswap, + /obj/item/spellbook/oneuse/forcewall, + /obj/item/spellbook/oneuse/knock, + /obj/item/spellbook/oneuse/horsemask, + /obj/item/spellbook/oneuse/charge, + /obj/item/spellbook/oneuse/summonitem, + /obj/item/gun/magic/wand, + /obj/item/gun/magic/wand/death, + /obj/item/gun/magic/wand/resurrection, + /obj/item/gun/magic/wand/polymorph, + /obj/item/gun/magic/wand/teleport, + /obj/item/gun/magic/wand/door, + /obj/item/gun/magic/wand/fireball, + /obj/item/gun/magic/staff/healing, + /obj/item/gun/magic/staff/door, + /obj/item/scrying, + /obj/item/voodoo, + /obj/item/clothing/suit/space/hardsuit/wizard, + /obj/item/immortality_talisman, + /obj/item/melee/ghost_sword)) + +GLOBAL_LIST_INIT(summoned_special_magic, list( + /obj/item/gun/magic/staff/change, + /obj/item/gun/magic/staff/animate, + /obj/item/storage/belt/wands/full, + /obj/item/contract, + /obj/item/gun/magic/staff/chaos, + /obj/item/necromantic_stone, + /obj/item/blood_contract)) + +//everything above except for single use spellbooks, because they are counted separately (and are for basic bitches anyways) +GLOBAL_LIST_INIT(summoned_magic_objectives, list( + /obj/item/contract, + /obj/item/blood_contract, + /obj/item/clothing/suit/space/hardsuit/wizard, + /obj/item/gun/magic, + /obj/item/immortality_talisman, + /obj/item/melee/ghost_sword, + /obj/item/necromantic_stone, + /obj/item/scrying, + /obj/item/spellbook, + /obj/item/storage/belt/wands/full, + /obj/item/voodoo)) + +// If true, it's the probability of triggering "survivor" antag. +GLOBAL_VAR_INIT(summon_guns_triggered, FALSE) +GLOBAL_VAR_INIT(summon_magic_triggered, FALSE) + +/proc/give_guns(mob/living/carbon/human/H) + if(H.stat == DEAD || !(H.client)) + return + if(H.mind) + if(iswizard(H)) + return + + if(prob(GLOB.summon_guns_triggered) && !(H.mind in SSticker.mode.traitors)) + SSticker.mode.traitors += H.mind + + H.mind.add_antag_datum(/datum/antagonist/survivalist/guns) + H.create_attack_log("was made into a survivalist, and trusts no one!") + + var/gun_type = pick(GLOB.summoned_guns) + var/obj/item/gun/G = new gun_type(get_turf(H)) + playsound(get_turf(H),'sound/magic/summon_guns.ogg', 50, TRUE) + + var/in_hand = H.put_in_hands(G) // not always successful + + to_chat(H, "\A [G] appears [in_hand ? "in your hand" : "at your feet"]!") + +/proc/give_magic(mob/living/carbon/human/H) + if(H.stat == DEAD || !(H.client)) + return + if(H.mind) + if(iswizard(H)) + return + + if(prob(GLOB.summon_magic_triggered) && !(H.mind in SSticker.mode.traitors)) + SSticker.mode.traitors += H.mind + + H.mind.add_antag_datum(/datum/antagonist/survivalist/magic) + H.create_attack_log("was made into a survivalist, and trusts no one!") + + var/magic_type = pick(GLOB.summoned_magic) + var/lucky = FALSE + if(prob(SPECIALIST_MAGIC_PROB)) + magic_type = pick(GLOB.summoned_special_magic) + lucky = TRUE + + var/obj/item/M = new magic_type(get_turf(H)) + playsound(get_turf(H),'sound/magic/summon_magic.ogg', 50, TRUE) + + var/in_hand = H.put_in_hands(M) + + to_chat(H, "\A [M] appears [in_hand ? "in your hand" : "at your feet"]!") + if(lucky) + to_chat(H, "You feel incredibly lucky.") + +/proc/rightandwrong(summon_type, mob/user, survivor_probability) + if(user) //in this case either someone holding a spellbook or a badmin + to_chat(user, "You summoned [summon_type]!") + message_admins("[ADMIN_LOOKUPFLW(user)] summoned [summon_type]!") + log_game("[key_name(user)] summoned [summon_type]!") + + if(summon_type == SUMMON_MAGIC) + GLOB.summon_magic_triggered = survivor_probability + else if(summon_type == SUMMON_GUNS) + GLOB.summon_guns_triggered = survivor_probability + else + CRASH("Bad summon_type given: [summon_type]") for(var/mob/living/carbon/human/H in GLOB.player_list) - if(H.stat == 2 || !(H.client)) + var/turf/T = get_turf(H) + if(T && is_away_level(T.z)) continue - if(H.mind) - if(H.mind.special_role == SPECIAL_ROLE_WIZARD || H.mind.special_role == SPECIAL_ROLE_WIZARD_APPRENTICE) - continue - var/randomizeguns = pick(gunslist) - var/randomizemagic = pick(magiclist) - var/randomizemagicspecial = pick(magicspeciallist) - if(revolver_fight) - randomizeguns = "revolver" - if(fake_revolver_fight) - if(prob(50)) - randomizeguns = "revolver" - else - randomizeguns = "fakerevolver" - if(!summon_type) - switch(randomizeguns) - if("taser") - new /obj/item/gun/energy/gun/advtaser(get_turf(H)) - if("egun") - new /obj/item/gun/energy/gun(get_turf(H)) - if("laser") - new /obj/item/gun/energy/laser(get_turf(H)) - if("revolver") - new /obj/item/gun/projectile/revolver(get_turf(H)) - if("detective") - new /obj/item/gun/projectile/revolver/detective(get_turf(H)) - if("deagle") - new /obj/item/gun/projectile/automatic/pistol/deagle/camo(get_turf(H)) - if("gyrojet") - new /obj/item/gun/projectile/automatic/gyropistol(get_turf(H)) - if("pulse") - new /obj/item/gun/energy/pulse(get_turf(H)) - if("suppressed") - new /obj/item/gun/projectile/automatic/pistol(get_turf(H)) - new /obj/item/suppressor(get_turf(H)) - if("doublebarrel") - new /obj/item/gun/projectile/revolver/doublebarrel(get_turf(H)) - if("shotgun") - new /obj/item/gun/projectile/shotgun(get_turf(H)) - if("combatshotgun") - new /obj/item/gun/projectile/shotgun/automatic/combat(get_turf(H)) - if("arg") - new /obj/item/gun/projectile/automatic/ar(get_turf(H)) - if("mateba") - new /obj/item/gun/projectile/revolver/mateba(get_turf(H)) - if("boltaction") - new /obj/item/gun/projectile/shotgun/boltaction(get_turf(H)) - if("uzi") - new /obj/item/gun/projectile/automatic/mini_uzi(get_turf(H)) - if("cannon") - new /obj/item/gun/energy/lasercannon(get_turf(H)) - if("crossbow") - new /obj/item/gun/energy/kinetic_accelerator/crossbow/large(get_turf(H)) - if("nuclear") - new /obj/item/gun/energy/gun/nuclear(get_turf(H)) - if("sabr") - new /obj/item/gun/projectile/automatic/proto(get_turf(H)) - if("bulldog") - new /obj/item/gun/projectile/automatic/shotgun/bulldog(get_turf(H)) - if("c20r") - new /obj/item/gun/projectile/automatic/c20r(get_turf(H)) - if("saw") - new /obj/item/gun/projectile/automatic/l6_saw(get_turf(H)) - if("car") - new /obj/item/gun/projectile/automatic/m90(get_turf(H)) - if("turret") - new /obj/item/gun/energy/gun/turret(get_turf(H)) - if("pulsecarbine") - new /obj/item/gun/energy/pulse/carbine(get_turf(H)) - if("decloner") - new /obj/item/gun/energy/decloner(get_turf(H)) - if("mindflayer") - new /obj/item/gun/energy/mindflayer(get_turf(H)) - if("kinetic") - new /obj/item/gun/energy/kinetic_accelerator(get_turf(H)) - if("advplasmacutter") - new /obj/item/gun/energy/plasmacutter/adv(get_turf(H)) - if("wormhole") - new /obj/item/gun/energy/wormhole_projector(get_turf(H)) - if("wt550") - new /obj/item/gun/projectile/automatic/wt550(get_turf(H)) - if("grenadelauncher") - new /obj/item/gun/projectile/revolver/grenadelauncher(get_turf(H)) - if("medibeam") - new /obj/item/gun/medbeam(get_turf(H)) - if("fakerevolver") - new /obj/item/toy/russian_revolver/trick_revolver(get_turf(H)) //lol - - playsound(get_turf(H), 'sound/magic/summon_guns.ogg', 50, 1) + if(summon_type == SUMMON_MAGIC) + give_magic(H) else - switch(randomizemagic) - if("fireball") - new /obj/item/spellbook/oneuse/fireball(get_turf(H)) - if("smoke") - new /obj/item/spellbook/oneuse/smoke(get_turf(H)) - if("blind") - new /obj/item/spellbook/oneuse/blind(get_turf(H)) - if("mindswap") - new /obj/item/spellbook/oneuse/mindswap(get_turf(H)) - if("forcewall") - new /obj/item/spellbook/oneuse/forcewall(get_turf(H)) - if("knock") - new /obj/item/spellbook/oneuse/knock(get_turf(H)) - if("horsemask") - new /obj/item/spellbook/oneuse/horsemask(get_turf(H)) - if("charge") - new /obj/item/spellbook/oneuse/charge(get_turf(H)) - if("summonitem") - new /obj/item/spellbook/oneuse/summonitem(get_turf(H)) - if("wandnothing") - new /obj/item/gun/magic/wand(get_turf(H)) - if("wanddeath") - new /obj/item/gun/magic/wand/death(get_turf(H)) - if("wandresurrection") - new /obj/item/gun/magic/wand/resurrection(get_turf(H)) - if("wandpolymorph") - new /obj/item/gun/magic/wand/polymorph(get_turf(H)) - if("wandteleport") - new /obj/item/gun/magic/wand/teleport(get_turf(H)) - if("wanddoor") - new /obj/item/gun/magic/wand/door(get_turf(H)) - if("wandfireball") - new /obj/item/gun/magic/wand/fireball(get_turf(H)) - if("staffhealing") - new /obj/item/gun/magic/staff/healing(get_turf(H)) - if("staffdoor") - new /obj/item/gun/magic/staff/door(get_turf(H)) - if("armor") - new /obj/item/clothing/suit/space/hardsuit/wizard(get_turf(H)) - if("scrying") - new /obj/item/scrying(get_turf(H)) - if(!(XRAY in H.mutations)) - H.mutations.Add(XRAY) - H.sight |= (SEE_MOBS|SEE_OBJS|SEE_TURFS) - H.see_in_dark = 8 - H.lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE - H.update_sight() - to_chat(H, "The walls suddenly disappear.") - if("voodoo") - new /obj/item/voodoo(get_turf(H)) - if("special") - magiclist -= "special" //only one super OP item per summoning max - switch(randomizemagicspecial) - if("staffchange") - new /obj/item/gun/magic/staff/change(get_turf(H)) - if("staffanimation") - new /obj/item/gun/magic/staff/animate(get_turf(H)) - if("wandbelt") - new /obj/item/storage/belt/wands/full(get_turf(H)) - if("contract") - new /obj/item/contract(get_turf(H)) - if("staffchaos") - new /obj/item/gun/magic/staff/chaos(get_turf(H)) - if("necromantic") - new /obj/item/necromantic_stone(get_turf(H)) - to_chat(H, "You suddenly feel lucky.") - - playsound(get_turf(H), 'sound/magic/summon_magic.ogg', 50, 1) + give_guns(H) \ No newline at end of file diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index 56cc3594ee2..75c15c633bc 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -295,11 +295,11 @@ /datum/spellbook_entry/summon name = "Summon Stuff" category = "Rituals" - refundable = 0 + refundable = FALSE buy_word = "Cast" - var/active = 0 + var/active = FALSE -/datum/spellbook_entry/summon/CanBuy(var/mob/living/carbon/human/user,var/obj/item/spellbook/book) +/datum/spellbook_entry/summon/CanBuy(mob/living/carbon/human/user, obj/item/spellbook/book) return ..() && !active /datum/spellbook_entry/summon/GetInfo() @@ -337,8 +337,7 @@ /datum/spellbook_entry/summon/guns name = "Summon Guns" - desc = "Nothing could possibly go wrong with arming a crew of lunatics just itching for an excuse to kill you. Just be careful not to stand still too long! You will also receive 1 extra point to use in your spellbook." - cost = 0 + desc = "Nothing could possibly go wrong with arming a crew of lunatics just itching for an excuse to kill you. There is a good chance that they will shoot each other first." log_name = "SG" /datum/spellbook_entry/summon/guns/IsSpellAvailable() @@ -349,18 +348,17 @@ else return TRUE -/datum/spellbook_entry/summon/guns/Buy(var/mob/living/carbon/human/user,var/obj/item/spellbook/book) +/datum/spellbook_entry/summon/guns/Buy(mob/living/carbon/human/user, obj/item/spellbook/book) feedback_add_details("wizard_spell_learned", log_name) - user.rightandwrong(0) - book.uses += 1 - active = 1 - to_chat(user, "You have cast summon guns and gained an extra charge for your spellbook.") - return 1 + rightandwrong(SUMMON_GUNS, user, 10) + active = TRUE + playsound(get_turf(user), 'sound/magic/castsummon.ogg', 50, TRUE) + to_chat(user, "You have cast summon guns!") + return TRUE /datum/spellbook_entry/summon/magic name = "Summon Magic" - desc = "Share the wonders of magic with the crew and show them why they aren't to be trusted with it at the same time. You will also receive 1 extra point to use in your spellbook." - cost = 0 + desc = "Share the wonders of magic with the crew and show them why they aren't to be trusted with it at the same time." log_name = "SU" /datum/spellbook_entry/summon/magic/IsSpellAvailable() @@ -371,13 +369,13 @@ else return TRUE -/datum/spellbook_entry/summon/magic/Buy(var/mob/living/carbon/human/user,var/obj/item/spellbook/book) +/datum/spellbook_entry/summon/magic/Buy(mob/living/carbon/human/user, obj/item/spellbook/book) feedback_add_details("wizard_spell_learned", log_name) - user.rightandwrong(1) - book.uses += 1 - active = 1 - to_chat(user, "You have cast summon magic and gained an extra charge for your spellbook.") - return 1 + rightandwrong(SUMMON_MAGIC, user, 10) + active = TRUE + playsound(get_turf(user), 'sound/magic/castsummon.ogg', 50, TRUE) + to_chat(user, "You have cast summon magic!") + return TRUE //Main category - Magical Items /datum/spellbook_entry/item diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm index cec31ffc2ac..fe487ae6431 100644 --- a/code/modules/admin/secrets.dm +++ b/code/modules/admin/secrets.dm @@ -113,9 +113,7 @@ Japanese Animes Mode   Egalitarian Station Mode
Summon Guns   - Summon Magic   - Summon Revolver Duel   - Summon Suicidal Revolver Duel + Summon Magic
Roll the Dice

diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 2875c16c137..24b49ad3781 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -37,7 +37,7 @@ return var/ticketID = text2num(href_list["openmentorticket"]) SSmentor_tickets.showDetailUI(usr, ticketID) - + if(href_list["stickyban"]) stickyban(href_list["stickyban"],href_list) @@ -2860,19 +2860,25 @@ if("guns") feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","SG") - usr.rightandwrong(FALSE) + var/survivor_probability = 0 + switch(alert("Do you want this to create survivors antagonists?", , "No Antags", "Some Antags", "All Antags!")) + if("Some Antags") + survivor_probability = 25 + if("All Antags!") + survivor_probability = 100 + + rightandwrong(SUMMON_GUNS, usr, survivor_probability) if("magic") feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","SM") - usr.rightandwrong(TRUE) - if("revolver") - feedback_inc("admin_secrets_fun_used", 1) - feedback_add_details("admin_secrets_fun_used", "SRD") - usr.rightandwrong(FALSE, revolver_fight = TRUE) - if("fakerevolver") - feedback_inc("admin_secrets_fun_used", 1) - feedback_add_details("admin_secrets_fun_used", "SFD") - usr.rightandwrong(FALSE, fake_revolver_fight = TRUE) + var/survivor_probability = 0 + switch(alert("Do you want this to create survivors antagonists?", , "No Antags", "Some Antags", "All Antags!")) + if("Some Antags") + survivor_probability = 25 + if("All Antags!") + survivor_probability = 100 + + rightandwrong(SUMMON_MAGIC, usr, survivor_probability) if("tdomereset") var/delete_mobs = alert("Clear all mobs?","Confirm","Yes","No","Cancel") if(delete_mobs == "Cancel") diff --git a/code/modules/antagonists/survivalist/survivalist.dm b/code/modules/antagonists/survivalist/survivalist.dm new file mode 100644 index 00000000000..7d08e18834c --- /dev/null +++ b/code/modules/antagonists/survivalist/survivalist.dm @@ -0,0 +1,41 @@ +/datum/antagonist/survivalist + name = "Survivalist" + var/greet_message = "" + +/datum/antagonist/survivalist/proc/forge_objectives() + var/datum/objective/survive/survive = new + survive.owner = owner + objectives += survive + owner.objectives |= objectives + +/datum/antagonist/survivalist/on_gain() + owner.special_role = "survivalist" + forge_objectives() + . = ..() + +/datum/antagonist/survivalist/greet() + to_chat(owner.current, "You are the survivalist! [greet_message]") + owner.announce_objectives() + +/datum/antagonist/survivalist/guns + greet_message = "Your own safety matters above all else, and the only way to ensure your safety is to stockpile weapons! Grab as many guns as possible, by any means necessary. Kill anyone who gets in your way." + +/datum/antagonist/survivalist/guns/forge_objectives() + var/datum/objective/steal_five_of_type/summon_guns/guns = new + guns.owner = owner + objectives += guns + ..() + +/datum/antagonist/survivalist/magic + name = "Amateur Magician" + greet_message = "Grow your newfound talent! Grab as many magical artefacts as possible, by any means necessary. Kill anyone who gets in your way." + +/datum/antagonist/survivalist/magic/greet() + ..() + to_chat(owner.current, "As a wonderful magician, you should remember that spellbooks don't mean anything if they are used up.") + +/datum/antagonist/survivalist/magic/forge_objectives() + var/datum/objective/steal_five_of_type/summon_magic/magic = new + magic.owner = owner + objectives += magic + ..() \ No newline at end of file diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 47a4e4a5d0e..ac8917398c5 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -379,6 +379,11 @@ AnnounceArrival(character, rank, join_message) AddEmploymentContract(character) + if(GLOB.summon_guns_triggered) + give_guns(character) + if(GLOB.summon_magic_triggered) + give_magic(character) + if(!thisjob.is_position_available() && thisjob in SSjobs.prioritized_jobs) SSjobs.prioritized_jobs -= thisjob qdel(src) diff --git a/paradise.dme b/paradise.dme index bdb77b45dd0..554b6f1c041 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1236,6 +1236,7 @@ #include "code\modules\antagonists\_common\antag_hud.dm" #include "code\modules\antagonists\_common\antag_spawner.dm" #include "code\modules\antagonists\_common\antag_team.dm" +#include "code\modules\antagonists\survivalist\survivalist.dm" #include "code\modules\antagonists\wishgranter\wishgranter.dm" #include "code\modules\arcade\arcade_base.dm" #include "code\modules\arcade\arcade_prize.dm" From c13e47bc163be460d1d974bd935815db5d56c101 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Tue, 24 Sep 2019 18:15:07 -0400 Subject: [PATCH 14/57] Automatic changelog generation for PR #12381 [ci skip] --- html/changelogs/AutoChangeLog-pr-12381.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12381.yml diff --git a/html/changelogs/AutoChangeLog-pr-12381.yml b/html/changelogs/AutoChangeLog-pr-12381.yml new file mode 100644 index 00000000000..adc4cf02ce9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12381.yml @@ -0,0 +1,6 @@ +author: "Fox McCloud" +delete-after: True +changes: + - rscadd: "Summon guns/magic is no longer free, but costs 2 spells points" + - rscadd: "Summon guns/magic makes 10% of the crew antags with the objective to collect guns/magical items and kill anyone who gets in their way" + - rscadd: "If a wizard (or admin) summons guns/magic, latejoiners to the round will also acquire summoned items" From e7530e85071918839a03c23942631bd624f35537 Mon Sep 17 00:00:00 2001 From: Kyep <16434066+Kyep@users.noreply.github.com> Date: Tue, 24 Sep 2019 22:16:04 +0000 Subject: [PATCH 15/57] Fixes hierophant club and warp cube ignoring area/tele_proof (#12360) --- code/__HELPERS/unsorted.dm | 12 ++++++++++++ code/modules/mining/lavaland/loot/hierophant_loot.dm | 3 +++ code/modules/mining/lavaland/loot/tendril_loot.dm | 4 ++++ 3 files changed, 19 insertions(+) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 10759fe336a..3aaf3164428 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -166,6 +166,18 @@ Turf and target are seperate in case you want to teleport some distance from a t return destination + +/proc/is_in_teleport_proof_area(atom/O) + if(!O) + return FALSE + var/area/A = get_area(O) + if(!A) + return FALSE + if(A.tele_proof) + return TRUE + else + return FALSE + // Returns true if direction is blocked from loc // Checks if doors are open /proc/DirBlocked(turf/loc,var/dir) diff --git a/code/modules/mining/lavaland/loot/hierophant_loot.dm b/code/modules/mining/lavaland/loot/hierophant_loot.dm index d7f47baed1d..d86226943a2 100644 --- a/code/modules/mining/lavaland/loot/hierophant_loot.dm +++ b/code/modules/mining/lavaland/loot/hierophant_loot.dm @@ -114,6 +114,9 @@ if(user.is_in_active_hand(src) && user.is_in_inactive_hand(src)) //you need to hold the staff to teleport to_chat(user, "You need to hold the club in your hands to [beacon ? "teleport with it":"detach the beacon"]!") return + if(is_in_teleport_proof_area(user)) + to_chat(user, "[src] sparks and fizzles.") + return if(!beacon || QDELETED(beacon)) if(isturf(user.loc)) user.visible_message("[user] starts fiddling with [src]'s pommel...", \ diff --git a/code/modules/mining/lavaland/loot/tendril_loot.dm b/code/modules/mining/lavaland/loot/tendril_loot.dm index 67b597e90aa..e5a2c94fa7d 100644 --- a/code/modules/mining/lavaland/loot/tendril_loot.dm +++ b/code/modules/mining/lavaland/loot/tendril_loot.dm @@ -312,6 +312,10 @@ to_chat(user, "[src] fizzles uselessly.") return + if(is_in_teleport_proof_area(user) || is_in_teleport_proof_area(linked)) + to_chat(user, "[src] sparks and fizzles.") + return + var/datum/effect_system/smoke_spread/smoke = new smoke.set_up(1, 0, user.loc) smoke.start() From 082dcc991025d777079c8cc23e577cdfad4f3c1c Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Tue, 24 Sep 2019 18:16:07 -0400 Subject: [PATCH 16/57] Automatic changelog generation for PR #12360 [ci skip] --- html/changelogs/AutoChangeLog-pr-12360.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12360.yml diff --git a/html/changelogs/AutoChangeLog-pr-12360.yml b/html/changelogs/AutoChangeLog-pr-12360.yml new file mode 100644 index 00000000000..58aa0a0335d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12360.yml @@ -0,0 +1,4 @@ +author: "Kyep" +delete-after: True +changes: + - bugfix: "The Hierophant club and warp cubes (lavaland loot) no longer allow you to teleport into or out of areas that are set to forbid teleports." From 86e6d85093ff076939c88552bc1b1e9f4e768b48 Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Tue, 24 Sep 2019 18:17:55 -0400 Subject: [PATCH 17/57] Nutrition Refactor (#12389) --- code/__DEFINES/genetics.dm | 3 +- code/__DEFINES/mobs.dm | 4 +- .../diseases/advance/symptoms/weight.dm | 2 +- code/datums/diseases/food_poisoning.dm | 2 +- code/datums/diseases/tuberculosis.dm | 2 +- code/datums/spells/cluwne.dm | 4 +- .../gamemodes/changeling/powers/absorb.dm | 2 +- code/game/gamemodes/devil/devilinfo.dm | 2 +- code/game/gamemodes/vampire/vampire.dm | 4 +- code/game/gamemodes/wizard/spellbook.dm | 5 +- code/game/machinery/computer/arcade.dm | 4 +- code/game/machinery/rechargestation.dm | 2 +- code/game/objects/items/crayons.dm | 2 +- code/game/objects/items/weapons/soap.dm | 2 +- code/modules/admin/topic.dm | 2 +- code/modules/hydroponics/hydroponics.dm | 4 +- code/modules/mob/living/carbon/carbon.dm | 6 +- code/modules/mob/living/carbon/human/human.dm | 10 ++ code/modules/mob/living/carbon/human/life.dm | 93 ++++++++++--------- .../living/carbon/human/species/_species.dm | 2 + .../living/carbon/human/species/abductor.dm | 5 +- .../mob/living/carbon/human/species/diona.dm | 4 +- .../mob/living/carbon/human/species/golem.dm | 7 +- .../living/carbon/human/species/plasmaman.dm | 7 +- .../living/carbon/human/species/shadowling.dm | 6 +- .../living/carbon/human/species/skeleton.dm | 4 +- .../mob/living/carbon/human/species/slime.dm | 2 +- .../mob/living/carbon/human/species/unathi.dm | 3 +- code/modules/mob/living/carbon/life.dm | 2 +- code/modules/mob/living/living.dm | 2 +- code/modules/mob/mob.dm | 8 ++ code/modules/mob/transform_procs.dm | 2 +- .../modules/projectiles/projectile/special.dm | 2 +- .../reagents/chemistry/reagents/food.dm | 19 ++-- .../reagents/chemistry/reagents/toxins.dm | 4 +- .../research/xenobiology/xenobiology.dm | 2 +- code/modules/surgery/organs/augments_arms.dm | 4 +- .../surgery/organs/augments_internal.dm | 2 +- code/modules/surgery/organs/organ_internal.dm | 2 +- code/modules/surgery/organs/subtypes/kidan.dm | 2 +- 40 files changed, 135 insertions(+), 111 deletions(-) diff --git a/code/__DEFINES/genetics.dm b/code/__DEFINES/genetics.dm index 6afa76a02b0..c8916e31f40 100644 --- a/code/__DEFINES/genetics.dm +++ b/code/__DEFINES/genetics.dm @@ -165,4 +165,5 @@ #define NOZOMBIE 20 #define NO_GERMS 21 #define NO_DECAY 22 -#define PIERCEIMMUNE 23 \ No newline at end of file +#define PIERCEIMMUNE 23 +#define NO_HUNGER 24 \ No newline at end of file diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 25540dd4965..0a551570472 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -67,8 +67,8 @@ // Taste sensitivity - lower is more sensitive // Represents the minimum portion of total taste the mob can sense #define TASTE_SENSITIVITY_NORMAL 15 -#define TASTE_SENSITIVITY_SHARP 7.5 -#define TASTE_SENSITIVITY_DULL 20 +#define TASTE_SENSITIVITY_SHARP 10 +#define TASTE_SENSITIVITY_DULL 25 #define TASTE_SENSITIVITY_NO_TASTE 101 // Reagent type flags, defines the types of mobs this reagent will affect diff --git a/code/datums/diseases/advance/symptoms/weight.dm b/code/datums/diseases/advance/symptoms/weight.dm index 1378df4d05e..98b940f2b83 100644 --- a/code/datums/diseases/advance/symptoms/weight.dm +++ b/code/datums/diseases/advance/symptoms/weight.dm @@ -36,4 +36,4 @@ Bonus else to_chat(M, "[pick("So hungry...", "You'd kill someone for a bite of food...", "Hunger cramps seize you...")]") M.overeatduration = max(M.overeatduration - 100, 0) - M.nutrition = max(M.nutrition - 100, 0) \ No newline at end of file + M.adjust_nutrition(-100) \ No newline at end of file diff --git a/code/datums/diseases/food_poisoning.dm b/code/datums/diseases/food_poisoning.dm index 2e7d083455b..4df31ec57d9 100644 --- a/code/datums/diseases/food_poisoning.dm +++ b/code/datums/diseases/food_poisoning.dm @@ -63,7 +63,7 @@ if(affected_mob.nutrition > 10) affected_mob.visible_message("[affected_mob] vomits on the floor profusely!") affected_mob.fakevomit(no_text = 1) - affected_mob.nutrition -= rand(3,5) + affected_mob.adjust_nutrition(-rand(3,5)) else to_chat(affected_mob, "Your stomach lurches painfully!") affected_mob.visible_message("[affected_mob] gags and retches!") diff --git a/code/datums/diseases/tuberculosis.dm b/code/datums/diseases/tuberculosis.dm index 9aad7ff6d17..9a305c758e3 100644 --- a/code/datums/diseases/tuberculosis.dm +++ b/code/datums/diseases/tuberculosis.dm @@ -52,7 +52,7 @@ if(prob(3)) to_chat(affected_mob, "[pick("Your stomach silently rumbles...", "Your stomach seizes up and falls limp, muscles dead and lifeless.", "You could eat a crayon")]") affected_mob.overeatduration = max(affected_mob.overeatduration - 100, 0) - affected_mob.nutrition = max(affected_mob.nutrition - 100, 0) + affected_mob.adjust_nutrition(-100) if(prob(15)) to_chat(affected_mob, "[pick("You feel uncomfortably hot...", "You feel like unzipping your jumpsuit", "You feel like taking off some clothes...")]") affected_mob.bodytemperature += 40 diff --git a/code/datums/spells/cluwne.dm b/code/datums/spells/cluwne.dm index 09f98994f1e..6a87419886c 100644 --- a/code/datums/spells/cluwne.dm +++ b/code/datums/spells/cluwne.dm @@ -18,7 +18,7 @@ idiot_brain.insert(src, make_cluwne = 0) idiot_brain.dna = dna.Clone() setBrainLoss(80) - nutrition = 9000 + set_nutrition(9000) overeatduration = 9000 Confused(30) if(mind) @@ -44,7 +44,7 @@ /mob/living/carbon/human/proc/makeAntiCluwne() to_chat(src, "You don't feel very funny.") adjustBrainLoss(-120) - nutrition = NUTRITION_LEVEL_STARVING + set_nutrition(NUTRITION_LEVEL_STARVING) overeatduration = 0 SetConfused(0) SetJitter(0) diff --git a/code/game/gamemodes/changeling/powers/absorb.dm b/code/game/gamemodes/changeling/powers/absorb.dm index b5ad5ab9f8a..16251722632 100644 --- a/code/game/gamemodes/changeling/powers/absorb.dm +++ b/code/game/gamemodes/changeling/powers/absorb.dm @@ -58,7 +58,7 @@ changeling.absorb_dna(target, user) if(user.nutrition < NUTRITION_LEVEL_WELL_FED) - user.nutrition = min((user.nutrition + target.nutrition), NUTRITION_LEVEL_WELL_FED) + user.set_nutrition(min((user.nutrition + target.nutrition), NUTRITION_LEVEL_WELL_FED)) if(target.mind)//if the victim has got a mind diff --git a/code/game/gamemodes/devil/devilinfo.dm b/code/game/gamemodes/devil/devilinfo.dm index 419034a9e1f..89d997831a3 100644 --- a/code/game/gamemodes/devil/devilinfo.dm +++ b/code/game/gamemodes/devil/devilinfo.dm @@ -162,7 +162,7 @@ var/global/list/lawlorify = list ( if(soulsOwned.Find(soul)) return soulsOwned += soul - owner.current.nutrition = NUTRITION_LEVEL_FULL + owner.current.set_nutrition(NUTRITION_LEVEL_FULL) to_chat(owner.current, "You feel satiated as you received a new soul.") update_hud() switch(SOULVALUE) diff --git a/code/game/gamemodes/vampire/vampire.dm b/code/game/gamemodes/vampire/vampire.dm index d696543cbdf..ac5ddc92f98 100644 --- a/code/game/gamemodes/vampire/vampire.dm +++ b/code/game/gamemodes/vampire/vampire.dm @@ -314,9 +314,9 @@ You are weak to holy things and starlight. Don't go into space and avoid the Cha var/mob/living/carbon/human/V = owner if(!H.ckey && !H.player_ghosted)//Only runs if there is no ckey and the body has not being ghosted while alive to_chat(V, "Feeding on [H] reduces your thirst, but you get no usable blood from them.") - V.nutrition = min(NUTRITION_LEVEL_WELL_FED, V.nutrition + 5) + V.set_nutrition(min(NUTRITION_LEVEL_WELL_FED, V.nutrition + 5)) else - V.nutrition = min(NUTRITION_LEVEL_WELL_FED, V.nutrition + (blood / 2)) + V.set_nutrition(min(NUTRITION_LEVEL_WELL_FED, V.nutrition + (blood / 2))) draining = null diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index 75c15c633bc..69bcfeb4a7a 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -861,10 +861,7 @@ /obj/item/spellbook/oneuse/smoke/recoil(mob/user as mob) ..() to_chat(user, "Your stomach rumbles...") - if(user.nutrition) - user.nutrition -= 200 - if(user.nutrition <= 0) - user.nutrition = 0 + user.adjust_nutrition(-200) /obj/item/spellbook/oneuse/blind spell = /obj/effect/proc_holder/spell/targeted/trigger/blind diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index c9d7f10302a..695e01103ea 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -367,7 +367,7 @@ if(food <= 0) dat += "
You ran out of food and starved." if(emagged) - user.nutrition = 0 //yeah you pretty hongry + user.set_nutrition(0) //yeah you pretty hongry to_chat(user, "Your body instantly contracts to that of one who has not eaten in months. Agonizing cramps seize you as you fall to the floor.") if(fuel <= 0) dat += "
You ran out of fuel, and drift, slowly, into a star." @@ -467,7 +467,7 @@ sleep(30) atom_say("[M] violently throws up!") playsound(loc, 'sound/effects/splat.ogg', 50, 1) - M.nutrition -= 50 //lose a lot of food + M.adjust_nutrition(-50) //lose a lot of food var/turf/location = usr.loc if(istype(location, /turf/simulated)) location.add_vomit_floor(TRUE) diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index c15aed3b757..00f88f51c6a 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -164,7 +164,7 @@ else if(istype(occupant, /mob/living/carbon/human)) var/mob/living/carbon/human/H = occupant if(H.get_int_organ(/obj/item/organ/internal/cell) && H.nutrition < 450) - H.nutrition = min(H.nutrition+recharge_speed_nutrition, 450) + H.set_nutrition(min(H.nutrition + recharge_speed_nutrition, 450)) if(repairs) H.heal_overall_damage(repairs, repairs, TRUE, 0, 1) diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 1f7ad5c132b..4d27e5d175b 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -111,7 +111,7 @@ return playsound(loc, 'sound/items/eatfood.ogg', 50, 0) to_chat(user, "You take a [huffable ? "huff" : "bite"] of the [name]. Delicious!") - user.nutrition += 5 + user.adjust_nutrition(5) if(uses) uses -= 5 if(uses <= 0) diff --git a/code/game/objects/items/weapons/soap.dm b/code/game/objects/items/weapons/soap.dm index 912212d19c7..20cd0eb1e28 100644 --- a/code/game/objects/items/weapons/soap.dm +++ b/code/game/objects/items/weapons/soap.dm @@ -31,7 +31,7 @@ if(muncher && isdrask(muncher)) to_chat(user, "You take a bite of the [name]. Delicious!") playsound(user.loc, 'sound/items/eatfood.ogg', 50, 0) - user.nutrition += 2 + user.adjust_nutrition(2) else if(istype(target,/obj/effect/decal/cleanable)) user.visible_message("[user] begins to scrub \the [target.name] out with [src].") if(do_after(user, cleanspeed, target = target) && target) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 24b49ad3781..754091a30db 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1934,7 +1934,7 @@ H.reagents.add_reagent("ice", 40) logmsg = "cold." if("Hunger") - H.nutrition = NUTRITION_LEVEL_CURSED + H.set_nutrition(NUTRITION_LEVEL_CURSED) logmsg = "starvation." if("Cluwne") H.makeCluwne() diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 25ae26da3ad..2d3adacefbf 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -991,12 +991,12 @@ /obj/machinery/hydroponics/attack_animal(mob/living/user) if(istype(user, /mob/living/simple_animal/diona)) if(weedlevel > 0) - user.nutrition += weedlevel * 15 + user.adjust_nutrition(weedlevel * 15) adjustWeeds(-10) update_icon() visible_message("[user] begins rooting through [src], ripping out weeds and eating them noisily.","You begin rooting through [src], ripping out weeds and eating them noisily.") else if(nutrilevel < 10) - user.nutrition -= ((10 - nutrilevel) * 5) + user.adjust_nutrition(-((10 - nutrilevel) * 5)) adjustNutri(10) update_icon() visible_message("[user] secretes a trickle of green liquid from its tail, refilling [src]'s nutrient tray.","You secrete a trickle of green liquid from your tail, refilling [src]'s nutrient tray.") diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index de52fe192da..a56a63bb858 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -26,9 +26,9 @@ . = ..() if(.) if(nutrition && stat != DEAD) - nutrition -= hunger_drain / 10 + adjust_nutrition(-(hunger_drain * 0.1)) if(m_intent == MOVE_INTENT_RUN) - nutrition -= hunger_drain / 10 + adjust_nutrition(-(hunger_drain * 0.1)) if((FAT in mutations) && m_intent == MOVE_INTENT_RUN && bodytemperature <= 360) bodytemperature += 2 @@ -110,7 +110,7 @@ else if(T) T.add_vomit_floor() - nutrition -= lost_nutrition + adjust_nutrition(-lost_nutrition) if(stun) adjustToxLoss(-3) T = get_step(T, dir) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 0a860b6019f..0019aefbad3 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1900,6 +1900,16 @@ Eyes need to have significantly high darksight to shine unless the mob has the X .["Make superhero"] = "?_src_=vars;makesuper=[UID()]" . += "---" +/mob/living/carbon/human/adjust_nutrition(change) + if(NO_HUNGER in dna.species.species_traits) + return FALSE + return ..() + +/mob/living/carbon/human/set_nutrition(change) + if(NO_HUNGER in dna.species.species_traits) + return FALSE + return ..() + /mob/living/carbon/human/proc/special_post_clone_handling() if(mind && mind.assigned_role == "Cluwne") //HUNKE your suffering never stops makeCluwne() diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index bc3e1fdb3bd..2643d1f3102 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -597,54 +597,55 @@ if(status_flags & GODMODE) return 0 //godmode - //The fucking FAT mutation is the greatest shit ever. It makes everyone so hot and bothered. - if(CAN_BE_FAT in dna.species.species_traits) - if(FAT in mutations) - if(overeatduration < 100) - becomeSlim() - else - if(overeatduration > 500) - becomeFat() - - // nutrition decrease - if(nutrition > 0 && stat != DEAD) - // THEY HUNGER - var/hunger_rate = hunger_drain - if(satiety > 0) - satiety-- - if(satiety < 0) - satiety++ - if(prob(round(-satiety/40))) - Jitter(5) - hunger_rate = 3 * hunger_drain - nutrition = max(0, nutrition - hunger_rate) - - if(nutrition > NUTRITION_LEVEL_FULL) - if(overeatduration < 600) //capped so people don't take forever to unfat - overeatduration++ - - else - if(overeatduration > 1) - if(OBESITY in mutations) - overeatduration -= 1 // Those with obesity gene take twice as long to unfat + if(!(NO_HUNGER in dna.species.species_traits)) + //The fucking FAT mutation is the greatest shit ever. It makes everyone so hot and bothered. + if(CAN_BE_FAT in dna.species.species_traits) + if(FAT in mutations) + if(overeatduration < 100) + becomeSlim() else - overeatduration -= 2 + if(overeatduration > 500) + becomeFat() - //metabolism change - if(nutrition > NUTRITION_LEVEL_FAT) - metabolism_efficiency = 1 - else if(nutrition > NUTRITION_LEVEL_FED && satiety > 80) - if(metabolism_efficiency != 1.25) - to_chat(src, "You feel vigorous.") - metabolism_efficiency = 1.25 - else if(nutrition < NUTRITION_LEVEL_STARVING + 50) - if(metabolism_efficiency != 0.8) - to_chat(src, "You feel sluggish.") - metabolism_efficiency = 0.8 - else - if(metabolism_efficiency == 1.25) - to_chat(src, "You no longer feel vigorous.") - metabolism_efficiency = 1 + // nutrition decrease + if(nutrition > 0 && stat != DEAD) + // THEY HUNGER + var/hunger_rate = hunger_drain + if(satiety > 0) + satiety-- + if(satiety < 0) + satiety++ + if(prob(round(-satiety/40))) + Jitter(5) + hunger_rate = 3 * hunger_drain + adjust_nutrition(-hunger_rate) + + if(nutrition > NUTRITION_LEVEL_FULL) + if(overeatduration < 600) //capped so people don't take forever to unfat + overeatduration++ + + else + if(overeatduration > 1) + if(OBESITY in mutations) + overeatduration -= 1 // Those with obesity gene take twice as long to unfat + else + overeatduration -= 2 + + //metabolism change + if(nutrition > NUTRITION_LEVEL_FAT) + metabolism_efficiency = 1 + else if(nutrition > NUTRITION_LEVEL_FED && satiety > 80) + if(metabolism_efficiency != 1.25) + to_chat(src, "You feel vigorous.") + metabolism_efficiency = 1.25 + else if(nutrition < NUTRITION_LEVEL_STARVING + 50) + if(metabolism_efficiency != 0.8) + to_chat(src, "You feel sluggish.") + metabolism_efficiency = 0.8 + else + if(metabolism_efficiency == 1.25) + to_chat(src, "You no longer feel vigorous.") + metabolism_efficiency = 1 if(drowsyness) AdjustDrowsy(-1) diff --git a/code/modules/mob/living/carbon/human/species/_species.dm b/code/modules/mob/living/carbon/human/species/_species.dm index d3ce27a4704..1e753279059 100644 --- a/code/modules/mob/living/carbon/human/species/_species.dm +++ b/code/modules/mob/living/carbon/human/species/_species.dm @@ -814,6 +814,8 @@ H.healthdoll.cached_healthdoll_overlays = new_overlays /datum/species/proc/handle_hud_icons_nutrition(mob/living/carbon/human/H) + if(NO_HUNGER in species_traits) + return FALSE if(H.mind && H.mind.vampire && (H.mind in SSticker.mode.vampires)) //Vampires switch(H.nutrition) if(NUTRITION_LEVEL_FULL to INFINITY) diff --git a/code/modules/mob/living/carbon/human/species/abductor.dm b/code/modules/mob/living/carbon/human/species/abductor.dm index 64c5a4aa0b3..33b94cbabe0 100644 --- a/code/modules/mob/living/carbon/human/species/abductor.dm +++ b/code/modules/mob/living/carbon/human/species/abductor.dm @@ -11,13 +11,14 @@ "liver" = /obj/item/organ/internal/liver, "kidneys" = /obj/item/organ/internal/kidneys, "brain" = /obj/item/organ/internal/brain/abductor, - "appendix" = /obj/item/organ/internal/appendix, "eyes" = /obj/item/organ/internal/eyes/abductor //3 darksight. ) - species_traits = list(NO_BLOOD, NO_BREATHE, VIRUSIMMUNE, NOGUNS, NO_EXAMINE) + species_traits = list(NO_BLOOD, NO_BREATHE, VIRUSIMMUNE, NOGUNS, NO_HUNGER, NO_EXAMINE) dies_at_threshold = TRUE + taste_sensitivity = TASTE_SENSITIVITY_NO_TASTE + clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS dietflags = DIET_OMNI reagent_tag = PROCESS_ORG diff --git a/code/modules/mob/living/carbon/human/species/diona.dm b/code/modules/mob/living/carbon/human/species/diona.dm index 40fc2b001df..48664341623 100644 --- a/code/modules/mob/living/carbon/human/species/diona.dm +++ b/code/modules/mob/living/carbon/human/species/diona.dm @@ -91,9 +91,9 @@ H.clear_alert("nolight") else H.throw_alert("nolight", /obj/screen/alert/nolight) - H.nutrition += light_amount * 10 + H.adjust_nutrition(light_amount * 10) if(H.nutrition > NUTRITION_LEVEL_ALMOST_FULL) - H.nutrition = NUTRITION_LEVEL_ALMOST_FULL + H.set_nutrition(NUTRITION_LEVEL_ALMOST_FULL) if(light_amount > 0.2 && !H.suiciding) //if there's enough light, heal if(!pod && H.health <= 0) return diff --git a/code/modules/mob/living/carbon/human/species/golem.dm b/code/modules/mob/living/carbon/human/species/golem.dm index 4b816f7ab5d..a7f27a5753f 100644 --- a/code/modules/mob/living/carbon/human/species/golem.dm +++ b/code/modules/mob/living/carbon/human/species/golem.dm @@ -341,8 +341,7 @@ heat_level_2 = 340 heat_level_3 = 400 - dietflags = 0 //Regenerate nutrition in light, no diet necessary - taste_sensitivity = TASTE_SENSITIVITY_NO_TASTE + dietflags = DIET_HERB // Plants eat...plants? info_text = "As a Wooden Golem, you have plant-like traits: you take damage from extreme temperatures, can be set on fire, and have lower armor than a normal golem. You regenerate when in the light and wither in the darkness." prefix = "Wooden" @@ -361,9 +360,9 @@ H.clear_alert("nolight") else H.throw_alert("nolight", /obj/screen/alert/nolight) - H.nutrition += light_amount * 10 + H.adjust_nutrition(light_amount * 10) if(H.nutrition > NUTRITION_LEVEL_ALMOST_FULL) - H.nutrition = NUTRITION_LEVEL_ALMOST_FULL + H.set_nutrition(NUTRITION_LEVEL_ALMOST_FULL) if(light_amount > 0.2 && !H.suiciding) //if there's enough light, heal H.adjustBruteLoss(-1) H.adjustFireLoss(-1) diff --git a/code/modules/mob/living/carbon/human/species/plasmaman.dm b/code/modules/mob/living/carbon/human/species/plasmaman.dm index e4ba4349202..d925e2ef1d9 100644 --- a/code/modules/mob/living/carbon/human/species/plasmaman.dm +++ b/code/modules/mob/living/carbon/human/species/plasmaman.dm @@ -1,4 +1,4 @@ -/datum/species/plasmaman // /vg/ +/datum/species/plasmaman name = "Plasmaman" name_plural = "Plasmamen" icobase = 'icons/mob/human_races/r_plasmaman_sb.dmi' @@ -6,12 +6,14 @@ dangerous_existence = TRUE //So so much //language = "Clatter" - species_traits = list(IS_WHITELISTED, RADIMMUNE, NO_BLOOD, NOTRANSSTING) + species_traits = list(IS_WHITELISTED, RADIMMUNE, NO_BLOOD, NO_HUNGER, NOTRANSSTING) forced_heartattack = TRUE // Plasmamen have no blood, but they should still get heart-attacks skinned_type = /obj/item/stack/sheet/mineral/plasma // We're low on plasma, R&D! *eyes plasmaman co-worker intently* dietflags = DIET_OMNI reagent_tag = PROCESS_ORG + taste_sensitivity = TASTE_SENSITIVITY_NO_TASTE //skeletons can't taste anything + butt_sprite = "plasma" breathid = "tox" @@ -34,7 +36,6 @@ "liver" = /obj/item/organ/internal/liver/plasmaman, "kidneys" = /obj/item/organ/internal/kidneys/plasmaman, "brain" = /obj/item/organ/internal/brain/plasmaman, - "appendix" = /obj/item/organ/internal/appendix, "eyes" = /obj/item/organ/internal/eyes/plasmaman ) diff --git a/code/modules/mob/living/carbon/human/species/shadowling.dm b/code/modules/mob/living/carbon/human/species/shadowling.dm index f65aedb530b..d05c358ce73 100644 --- a/code/modules/mob/living/carbon/human/species/shadowling.dm +++ b/code/modules/mob/living/carbon/human/species/shadowling.dm @@ -9,7 +9,7 @@ blood_color = "#555555" flesh_color = "#222222" - species_traits = list(NO_BLOOD, NO_BREATHE, RADIMMUNE, NOGUNS, NO_EXAMINE) //Can't use guns due to muzzle flash + species_traits = list(NO_BLOOD, NO_BREATHE, RADIMMUNE, NOGUNS, NO_HUNGER, NO_EXAMINE) //Can't use guns due to muzzle flash burn_mod = 1.5 //1.5x burn damage, 2x is excessive heatmod = 1.5 @@ -24,7 +24,6 @@ if(!H.weakeyes) H.weakeyes = 1 //Makes them more vulnerable to flashes and flashbangs var/light_amount = 0 - H.nutrition = NUTRITION_LEVEL_WELL_FED //i aint never get hongry if(isturf(H.loc)) var/turf/T = H.loc light_amount = T.get_lumcount() * 10 @@ -60,7 +59,7 @@ blood_color = "#CCCCCC" flesh_color = "#AAAAAA" - species_traits = list(NO_BLOOD, NO_BREATHE, RADIMMUNE, NO_EXAMINE) + species_traits = list(NO_BLOOD, NO_BREATHE, RADIMMUNE, NO_HUNGER, NO_EXAMINE) burn_mod = 1.1 heatmod = 1.1 @@ -68,7 +67,6 @@ if(!H.weakeyes) H.weakeyes = 1 //Makes them more vulnerable to flashes and flashbangs var/light_amount = 0 - H.nutrition = NUTRITION_LEVEL_WELL_FED //i aint never get hongry if(isturf(H.loc)) var/turf/T = H.loc light_amount = T.get_lumcount() * 10 diff --git a/code/modules/mob/living/carbon/human/species/skeleton.dm b/code/modules/mob/living/carbon/human/species/skeleton.dm index 2ce5839123b..af779483666 100644 --- a/code/modules/mob/living/carbon/human/species/skeleton.dm +++ b/code/modules/mob/living/carbon/human/species/skeleton.dm @@ -10,10 +10,12 @@ blood_color = "#FFFFFF" flesh_color = "#E6E6C6" - species_traits = list(NO_BREATHE, NO_BLOOD, RADIMMUNE, VIRUSIMMUNE, PIERCEIMMUNE) + species_traits = list(NO_BREATHE, NO_BLOOD, RADIMMUNE, VIRUSIMMUNE, NO_HUNGER, PIERCEIMMUNE) dies_at_threshold = TRUE skinned_type = /obj/item/stack/sheet/bone + taste_sensitivity = TASTE_SENSITIVITY_NO_TASTE //skeletons can't taste anything + dietflags = DIET_OMNI reagent_tag = PROCESS_ORG diff --git a/code/modules/mob/living/carbon/human/species/slime.dm b/code/modules/mob/living/carbon/human/species/slime.dm index 37b38de361c..0b4080d6851 100644 --- a/code/modules/mob/living/carbon/human/species/slime.dm +++ b/code/modules/mob/living/carbon/human/species/slime.dm @@ -171,7 +171,7 @@ H.update_body() H.updatehealth() H.UpdateDamageIcon() - H.nutrition -= SLIMEPERSON_HUNGERCOST + H.adjust_nutrition(-SLIMEPERSON_HUNGERCOST) H.visible_message("[H] finishes regrowing [H.p_their()] missing [new_limb]!", "You finish regrowing your [limb_select]") else to_chat(H, "You need to hold still in order to regrow a limb!") diff --git a/code/modules/mob/living/carbon/human/species/unathi.dm b/code/modules/mob/living/carbon/human/species/unathi.dm index 7ab0f9cbec9..6240e2673bd 100644 --- a/code/modules/mob/living/carbon/human/species/unathi.dm +++ b/code/modules/mob/living/carbon/human/species/unathi.dm @@ -19,6 +19,7 @@ clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS bodyflags = HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_BODY_MARKINGS | HAS_HEAD_MARKINGS | HAS_SKIN_COLOR | HAS_ALT_HEADS | TAIL_WAGGING dietflags = DIET_CARN + taste_sensitivity = TASTE_SENSITIVITY_SHARP cold_level_1 = 280 //Default 260 - Lower is better cold_level_2 = 220 //Default 200 @@ -110,7 +111,7 @@ name_plural = "Ash Walkers" blurb = "These reptillian creatures appear to be related to the Unathi, but seem significantly less evolved. \ - They roam the wastes of Lavaland, worshipping a dead city and capturing unsuspecting miners." + They roam the wastes of Lavaland, worshipping a dead city and capturing unsuspecting miners." language = "Sinta'unathi" default_language = "Sinta'unathi" diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index c5cbbc0b1d3..a9263f58ea2 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -253,7 +253,7 @@ continue if(times_fired % 3 == 1) M.adjustBruteLoss(5) - nutrition += 10 + adjust_nutrition(10) //this updates all special effects: stunned, sleeping, weakened, druggy, stuttering, etc.. /mob/living/carbon/handle_status_effects() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index f659b4198d1..ea3db60383d 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -427,7 +427,7 @@ radiation = 0 SetDruggy(0) SetHallucinate(0) - nutrition = NUTRITION_LEVEL_FED + 50 + set_nutrition(NUTRITION_LEVEL_FED + 50) bodytemperature = 310 CureBlind() CureNearsighted() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 4e8da45a155..8e35233be06 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1398,3 +1398,11 @@ var/list/slot_equipment_priority = list( \ suffix = "_8" S.icon_state = "[initial(S.icon_state)][suffix]" + +///Adjust the nutrition of a mob +/mob/proc/adjust_nutrition(change) + nutrition = max(0, nutrition + change) + +///Force set the mob nutrition +/mob/proc/set_nutrition(change) + nutrition = max(0, change) \ No newline at end of file diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 565f5f2fd23..5154f19fda7 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -154,7 +154,7 @@ var/list/babies = list() for(var/i=1,i<=number,i++) var/mob/living/carbon/slime/M = new/mob/living/carbon/slime(loc) - M.nutrition = round(nutrition/number) + M.set_nutrition(round(nutrition / number)) step_away(M,src) babies += M new_slime = pick(babies) diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index 41646c114af..06ab5c9a61b 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -171,7 +171,7 @@ if(ishuman(target)) //These rays make plantmen fat. var/mob/living/carbon/human/H = M if(IS_PLANT in H.dna.species.species_traits) - H.nutrition = min(H.nutrition+30, NUTRITION_LEVEL_FULL) + H.set_nutrition(min(H.nutrition+30, NUTRITION_LEVEL_FULL)) else if(iscarbon(target)) M.show_message("The radiation beam dissipates harmlessly through your body.") else diff --git a/code/modules/reagents/chemistry/reagents/food.dm b/code/modules/reagents/chemistry/reagents/food.dm index 4d6303f490c..afc4c4f2f8f 100644 --- a/code/modules/reagents/chemistry/reagents/food.dm +++ b/code/modules/reagents/chemistry/reagents/food.dm @@ -16,7 +16,7 @@ if(ishuman(M)) var/mob/living/carbon/human/H = M if(H.can_eat(diet_flags)) //Make sure the species has it's dietflag set, otherwise it can't digest any nutrients - H.nutrition += nutriment_factor // For hunger and fatness + H.adjust_nutrition(nutriment_factor) // For hunger and fatness return ..() /datum/reagent/consumable/nutriment // Pure nutriment, universally digestable and thus slightly less effective @@ -838,13 +838,16 @@ color = "#63DE63" taste_description = "burned food" -/datum/reagent/questionmark/reaction_mob(mob/living/M, method=TOUCH, volume) - if(method == INGEST) - M.Stun(2, FALSE) - M.Weaken(2, FALSE) - M.update_canmove() - to_chat(M, "Ugh! Eating that was a terrible idea!") - M.ForceContractDisease(new /datum/disease/food_poisoning(0)) +/datum/reagent/questionmark/reaction_mob(mob/living/carbon/human/H, method = TOUCH, volume) + if(istype(H) && method == INGEST) + if(H.dna.species.taste_sensitivity < TASTE_SENSITIVITY_NO_TASTE) // If you can taste it, then you know how awful it is. + H.Stun(2, FALSE) + H.Weaken(2, FALSE) + H.update_canmove() + to_chat(H, "Ugh! Eating that was a terrible idea!") + if(NO_HUNGER in H.dna.species.species_traits) //If you don't eat, then you can't get food poisoning + return + H.ForceContractDisease(new /datum/disease/food_poisoning(0)) /datum/reagent/msg name = "Monosodium glutamate" diff --git a/code/modules/reagents/chemistry/reagents/toxins.dm b/code/modules/reagents/chemistry/reagents/toxins.dm index df67e3ae5da..f232d2d2066 100644 --- a/code/modules/reagents/chemistry/reagents/toxins.dm +++ b/code/modules/reagents/chemistry/reagents/toxins.dm @@ -874,8 +874,8 @@ to_chat(M, "Your stomach grumbles painfully!") else if(prob(60)) - var/fat_to_burn = max(round(M.nutrition/100,1), 5) - M.nutrition = max(0, M.nutrition-fat_to_burn) + var/fat_to_burn = max(round(M.nutrition / 100, 1), 5) + M.adjust_nutrition(-fat_to_burn) M.overeatduration = 0 return ..() | update_flags diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 81ca4bfeb9b..1dd4f05eb97 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -151,7 +151,7 @@ return M.docile = 1 - M.nutrition = 700 + M.set_nutrition(700) to_chat(M, "You absorb the potion and feel your intense desire to feed melt away.") to_chat(user, "You feed the slime the potion, removing its hunger and calming it.") being_used = 1 diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm index 9342b3afd29..44f27b5deb4 100644 --- a/code/modules/surgery/organs/augments_arms.dm +++ b/code/modules/surgery/organs/augments_arms.dm @@ -337,11 +337,11 @@ break A.charging = 1 if(A.cell.charge >= 500) - H.nutrition += 50 + H.adjust_nutrition(50) A.cell.charge -= 500 to_chat(H, "You siphon off some of the stored charge for your own use.") else - H.nutrition += A.cell.charge/10 + H.adjust_nutrition(A.cell.charge * 0.1) A.cell.charge = 0 to_chat(H, "You siphon off the last of \the [A]'s charge.") break diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index 71a06d8e013..8f80b4e58e3 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -229,7 +229,7 @@ if(owner.nutrition <= hunger_threshold) synthesizing = 1 to_chat(owner, "You feel less hungry...") - owner.nutrition += 50 + owner.adjust_nutrition(50) spawn(50) synthesizing = 0 diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 4f859ea2e2b..7527ed19f92 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -285,7 +285,7 @@ /obj/item/organ/internal/honktumor/cursed/on_life() //No matter what you do, no matter who you are, no matter where you go, you're always going to be a fat, stuttering dimwit. ..() owner.setBrainLoss(80) - owner.nutrition = 9000 + owner.set_nutrition(9000) owner.overeatduration = 9000 diff --git a/code/modules/surgery/organs/subtypes/kidan.dm b/code/modules/surgery/organs/subtypes/kidan.dm index 3778a7204cc..b87531ac337 100644 --- a/code/modules/surgery/organs/subtypes/kidan.dm +++ b/code/modules/surgery/organs/subtypes/kidan.dm @@ -41,7 +41,7 @@ owner.visible_message("[owner] fades to dark.") return - owner.nutrition = max(owner.nutrition - KIDAN_LANTERN_HUNGERCOST, KIDAN_LANTERN_HUNGERCOST) + owner.set_nutrition(max(owner.nutrition - KIDAN_LANTERN_HUNGERCOST, KIDAN_LANTERN_HUNGERCOST)) var/new_light = calculate_glow(KIDAN_LANTERN_LIGHT) From 028c5ad3ca1daade3069044407aa7f9fce43d0b4 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Tue, 24 Sep 2019 18:17:57 -0400 Subject: [PATCH 18/57] Automatic changelog generation for PR #12389 [ci skip] --- html/changelogs/AutoChangeLog-pr-12389.yml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12389.yml diff --git a/html/changelogs/AutoChangeLog-pr-12389.yml b/html/changelogs/AutoChangeLog-pr-12389.yml new file mode 100644 index 00000000000..0ec30bdb4c7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12389.yml @@ -0,0 +1,8 @@ +author: "Fox McCloud" +delete-after: True +changes: + - rscadd: "Abductors, Skeletons, Shadowlings, and Plasmamen never get hungry" + - tweak: "Abductors, Skeleton, and Plasmamen can't taste anything" + - tweak: "Wood Golems now have a diet and taste sensitivity much like Diona" + - tweak: "Unathi are more sensitive to tastes" + - tweak: "Adjusted the sensitivity of \"sharp\" and \"dull\" tastes a bit" From 18bbcc6fa4458ed9f5fd93d27d108ba132334f60 Mon Sep 17 00:00:00 2001 From: Ty-Omaha Date: Tue, 24 Sep 2019 18:18:14 -0400 Subject: [PATCH 19/57] silence current midi verb (#12394) --- code/modules/client/preference/preferences_toggles.dm | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/code/modules/client/preference/preferences_toggles.dm b/code/modules/client/preference/preferences_toggles.dm index c1ad8d6d103..d5e4b2bf3fe 100644 --- a/code/modules/client/preference/preferences_toggles.dm +++ b/code/modules/client/preference/preferences_toggles.dm @@ -287,3 +287,10 @@ to_chat(src, "As a ghost, you will now [(prefs.toggles & CHAT_GHOSTPDA) ? "see all PDA messages" : "no longer see PDA messages"].") prefs.save_preferences(src) feedback_add_details("admin_verb","TGP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/verb/silence_current_midi() + set name = "Silence Current Midi" + set category = "Preferences" + set desc = "Silence the current admin midi playing" + usr.stop_sound_channel(CHANNEL_ADMIN) + to_chat(src, "The current admin midi has been silenced") From bf039d5a27e3c2b37f065c1a82c6e4a5fc63a4ff Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Tue, 24 Sep 2019 18:18:16 -0400 Subject: [PATCH 20/57] Automatic changelog generation for PR #12394 [ci skip] --- html/changelogs/AutoChangeLog-pr-12394.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12394.yml diff --git a/html/changelogs/AutoChangeLog-pr-12394.yml b/html/changelogs/AutoChangeLog-pr-12394.yml new file mode 100644 index 00000000000..2ea7342cd5a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12394.yml @@ -0,0 +1,4 @@ +author: "Ty-Omaha" +delete-after: True +changes: + - rscadd: "You can now silence the current midi with a verb in the preferences tab, without affecting your prefrence to hear midis in the future." From 28552488185e9e9b789cf3859cddb6c52a10629d Mon Sep 17 00:00:00 2001 From: AzuleUtama <44248086+AzuleUtama@users.noreply.github.com> Date: Tue, 24 Sep 2019 23:19:45 +0100 Subject: [PATCH 21/57] Fixes durathread mutating, reorganizes seed vendor (#12401) --- code/game/machinery/vending.dm | 12 ++++++------ code/modules/hydroponics/grown/cotton.dm | 1 + 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index d4008421fdc..2c13dbc946a 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -1279,7 +1279,6 @@ products = list(/obj/item/seeds/aloe =3, /obj/item/seeds/ambrosia = 3, /obj/item/seeds/apple = 3, - /obj/item/seeds/cotton = 3, /obj/item/seeds/banana = 3, /obj/item/seeds/berry = 3, /obj/item/seeds/cabbage = 3, @@ -1291,6 +1290,7 @@ /obj/item/seeds/coffee = 3, /obj/item/seeds/comfrey =3, /obj/item/seeds/corn = 3, + /obj/item/seeds/cotton = 3, /obj/item/seeds/nymph =3, /obj/item/seeds/eggplant = 3, /obj/item/seeds/garlic = 3, @@ -1302,14 +1302,14 @@ /obj/item/seeds/orange = 3, /obj/item/seeds/peanuts = 3, /obj/item/seeds/pineapple = 3, - /obj/item/seeds/potato = 3, /obj/item/seeds/poppy = 3, + /obj/item/seeds/potato = 3, /obj/item/seeds/pumpkin = 3, /obj/item/seeds/replicapod = 3, /obj/item/seeds/wheat/rice = 3, /obj/item/seeds/soya = 3, - /obj/item/seeds/sunflower = 3, /obj/item/seeds/sugarcane = 3, + /obj/item/seeds/sunflower = 3, /obj/item/seeds/tea = 3, /obj/item/seeds/tobacco = 3, /obj/item/seeds/tomato = 3, @@ -1317,15 +1317,15 @@ /obj/item/seeds/watermelon = 3, /obj/item/seeds/wheat = 3, /obj/item/seeds/whitebeet = 3) - contraband = list(/obj/item/seeds/amanita = 2, + contraband = list(/obj/item/seeds/cannabis = 3, + /obj/item/seeds/amanita = 2, + /obj/item/seeds/fungus = 3, /obj/item/seeds/glowshroom = 2, /obj/item/seeds/liberty = 2, /obj/item/seeds/nettle = 2, /obj/item/seeds/plump = 2, /obj/item/seeds/reishi = 2, - /obj/item/seeds/cannabis = 3, /obj/item/seeds/starthistle = 2, - /obj/item/seeds/fungus = 3, /obj/item/seeds/random = 2) premium = list(/obj/item/reagent_containers/spray/waterflower = 1) refill_canister = /obj/item/vending_refill/hydroseeds diff --git a/code/modules/hydroponics/grown/cotton.dm b/code/modules/hydroponics/grown/cotton.dm index 3fa4247f578..590831a1f9b 100644 --- a/code/modules/hydroponics/grown/cotton.dm +++ b/code/modules/hydroponics/grown/cotton.dm @@ -61,6 +61,7 @@ yield = 2 potency = 50 growthstages = 3 + mutatelist = list() growing_icon = 'icons/obj/hydroponics/growing.dmi' icon_dead = "cotton-dead" From fa0c95730f69305363344e5696d57474f9e201dc Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Tue, 24 Sep 2019 18:19:47 -0400 Subject: [PATCH 22/57] Automatic changelog generation for PR #12401 [ci skip] --- html/changelogs/AutoChangeLog-pr-12401.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12401.yml diff --git a/html/changelogs/AutoChangeLog-pr-12401.yml b/html/changelogs/AutoChangeLog-pr-12401.yml new file mode 100644 index 00000000000..8e9f4b6e26f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12401.yml @@ -0,0 +1,5 @@ +author: "AzuleUtama" +delete-after: True +changes: + - tweak: "Reorganises products in seed vendor." + - bugfix: "Fixes Durathread mutating into more Durathread" From 3f143c071c28389c0099325649195c44b67c1338 Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Tue, 24 Sep 2019 18:23:54 -0400 Subject: [PATCH 23/57] Fixes Seed Vault Gene Modder (#12409) --- .../LavaRuins/lavaland_surface_seed_vault.dmm | 2 +- code/game/machinery/constructable_frame.dm | 2 ++ code/modules/hydroponics/gene_modder.dm | 18 +++++++++++++----- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm index b097156d39a..1bba42283c2 100644 --- a/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm +++ b/_maps/map_files/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm @@ -30,7 +30,7 @@ /turf/simulated/floor/plasteel/freezer, /area/ruin/powered/seedvault) "f" = ( -/obj/machinery/plantgenes/upgraded{ +/obj/machinery/plantgenes/seedvault{ pixel_y = 6 }, /obj/structure/table/wood, diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 21452131e76..e1f595f4dfd 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -382,6 +382,8 @@ to destroy them and players will be able to make replacements. /obj/item/stock_parts/console_screen = 1, /obj/item/stock_parts/scanning_module = 1) +/obj/item/circuitboard/plantgenes/vault + /obj/item/circuitboard/seed_extractor name = "circuit board (Seed Extractor)" build_path = /obj/machinery/seed_extractor diff --git a/code/modules/hydroponics/gene_modder.dm b/code/modules/hydroponics/gene_modder.dm index b486aa629bb..87c98f211f6 100644 --- a/code/modules/hydroponics/gene_modder.dm +++ b/code/modules/hydroponics/gene_modder.dm @@ -33,14 +33,14 @@ component_parts += new /obj/item/stock_parts/manipulator(null) RefreshParts() -/obj/machinery/plantgenes/upgraded/New() +/obj/machinery/plantgenes/seedvault/New() ..() component_parts = list() - component_parts += new /obj/item/circuitboard/plantgenes(null) + component_parts += new /obj/item/circuitboard/plantgenes/vault(null) component_parts += new /obj/item/stock_parts/console_screen(null) - component_parts += new /obj/item/stock_parts/scanning_module/phasic(null) - component_parts += new /obj/item/stock_parts/micro_laser/ultra(null) - component_parts += new /obj/item/stock_parts/manipulator/pico(null) + component_parts += new /obj/item/stock_parts/scanning_module(null) + component_parts += new /obj/item/stock_parts/micro_laser(null) + component_parts += new /obj/item/stock_parts/manipulator(null) RefreshParts() /obj/machinery/plantgenes/Destroy() @@ -73,6 +73,14 @@ var/wratemod = ML.rating * 2.5 min_wrate = Floor(10-wratemod) // 7,5,2,0 Clamps at 0 and 10 You want this low min_wchance = 67-(ML.rating*16) // 48,35,19,3 Clamps at 0 and 67 You want this low + for(var/obj/item/circuitboard/plantgenes/vaultcheck in component_parts) + if(istype(vaultcheck, /obj/item/circuitboard/plantgenes/vault)) // TRAIT_DUMB BOTANY TUTS + max_potency = 100 + max_yield = 10 + min_production = 1 + max_endurance = 100 + min_wchance = 0 + min_wrate = 0 /obj/machinery/plantgenes/update_icon() ..() From e48a75b599aa203a337052a7c66ba04af8daf2b5 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Tue, 24 Sep 2019 18:23:56 -0400 Subject: [PATCH 24/57] Automatic changelog generation for PR #12409 [ci skip] --- html/changelogs/AutoChangeLog-pr-12409.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12409.yml diff --git a/html/changelogs/AutoChangeLog-pr-12409.yml b/html/changelogs/AutoChangeLog-pr-12409.yml new file mode 100644 index 00000000000..b4d9aedc449 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12409.yml @@ -0,0 +1,4 @@ +author: "Fox McCloud" +delete-after: True +changes: + - bugfix: "Fixes Seed Vault gene modder having limitations" From 653f417d367811893f4444de5b66accfb141b413 Mon Sep 17 00:00:00 2001 From: Dave Date: Tue, 24 Sep 2019 18:37:11 -0400 Subject: [PATCH 25/57] Fixes sequencing on mob spawner safties (#12399) --- code/modules/awaymissions/corpse.dm | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 3598a1469b7..7131b79b03b 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -48,13 +48,14 @@ if(!O.can_reenter_corpse) to_chat(user, "You have forfeited the right to respawn.") return - if(QDELETED(src) || QDELETED(user)) - return var/ghost_role = alert("Become [mob_name]? (Warning, You can no longer be cloned!)",,"Yes","No") - if(ghost_role == "No" || !loc) + if(ghost_role == "No") return if(!species_prompt()) return + if(!loc || !uses || QDELETED(src) || QDELETED(user)) + to_chat(user, "The [name] is no longer usable!") + return log_game("[user.ckey] became [mob_name]") create(ckey = user.ckey) From 1db3ab3d4b89f3fa41799b7302361689f5b139d1 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Tue, 24 Sep 2019 18:37:13 -0400 Subject: [PATCH 26/57] Automatic changelog generation for PR #12399 [ci skip] --- html/changelogs/AutoChangeLog-pr-12399.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12399.yml diff --git a/html/changelogs/AutoChangeLog-pr-12399.yml b/html/changelogs/AutoChangeLog-pr-12399.yml new file mode 100644 index 00000000000..8013e14d834 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12399.yml @@ -0,0 +1,4 @@ +author: "Dave-TH" +delete-after: True +changes: + - bugfix: "Mob spawners will no longer sometimes send players to the void." From 652920ae3cfe0d6aeaffcd3408699a7644382be5 Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Tue, 24 Sep 2019 18:42:47 -0400 Subject: [PATCH 27/57] Wizard Battlemage Armor (#12388) --- _maps/map_files/MetaStation/z2.dmm | 2 +- _maps/map_files/RandomZLevels/academy.dmm | 2 +- _maps/map_files/cyberiad/z2.dmm | 2 +- code/datums/outfits/outfit_admin.dm | 4 +- code/game/gamemodes/wizard/rightandwrong.dm | 4 +- code/game/gamemodes/wizard/spellbook.dm | 23 +++--- code/modules/clothing/clothing.dm | 3 + code/modules/clothing/spacesuits/hardsuit.dm | 72 ++++++++----------- code/modules/clothing/suits/wiz_robe.dm | 55 +++++++++++++- code/modules/mob/living/carbon/human/human.dm | 2 +- .../mob/living/carbon/human/update_icons.dm | 5 ++ 11 files changed, 113 insertions(+), 61 deletions(-) diff --git a/_maps/map_files/MetaStation/z2.dmm b/_maps/map_files/MetaStation/z2.dmm index 4dcf9a2797b..446079ebd0c 100644 --- a/_maps/map_files/MetaStation/z2.dmm +++ b/_maps/map_files/MetaStation/z2.dmm @@ -4443,7 +4443,7 @@ "mp" = ( /obj/effect/decal/cleanable/blood/splatter, /obj/structure/rack, -/obj/item/clothing/suit/space/hardsuit/wizard, +/obj/item/clothing/suit/space/hardsuit/shielded/wizard, /turf/unsimulated/floor{ tag = "icon-cultdamage"; icon_state = "cultdamage" diff --git a/_maps/map_files/RandomZLevels/academy.dmm b/_maps/map_files/RandomZLevels/academy.dmm index 87f3573eb00..03c8b8919e4 100644 --- a/_maps/map_files/RandomZLevels/academy.dmm +++ b/_maps/map_files/RandomZLevels/academy.dmm @@ -238,7 +238,7 @@ /turf/simulated/floor/wood, /area/awaymission/academy/headmaster) "aL" = ( -/obj/item/clothing/suit/space/hardsuit/wizard, +/obj/item/clothing/suit/space/hardsuit/shielded/wizard, /obj/structure/table/wood, /obj/item/stack/sheet/mineral/silver{ amount = 20 diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm index c7620721a8c..ba60ea44f3b 100644 --- a/_maps/map_files/cyberiad/z2.dmm +++ b/_maps/map_files/cyberiad/z2.dmm @@ -9053,7 +9053,7 @@ pixel_x = -3; pixel_y = 3 }, -/obj/item/clothing/suit/space/hardsuit/wizard, +/obj/item/clothing/suit/space/hardsuit/shielded/wizard, /obj/item/clothing/suit/space/santa{ pixel_x = 3; pixel_y = -3 diff --git a/code/datums/outfits/outfit_admin.dm b/code/datums/outfits/outfit_admin.dm index ff8a93d3df0..93e4015233b 100644 --- a/code/datums/outfits/outfit_admin.dm +++ b/code/datums/outfits/outfit_admin.dm @@ -810,7 +810,7 @@ /datum/outfit/admin/hardsuit/wizard name = "Wizard Hardsuit" - suit = /obj/item/clothing/suit/space/hardsuit/wizard + suit = /obj/item/clothing/suit/space/hardsuit/shielded/wizard shoes = /obj/item/clothing/shoes/magboots /datum/outfit/admin/hardsuit/medical @@ -1100,7 +1100,7 @@ l_hand = null backpack_contents = list( /obj/item/storage/box/engineer = 1, - /obj/item/clothing/suit/space/hardsuit/wizard = 1, + /obj/item/clothing/suit/space/hardsuit/shielded/wizard = 1, /obj/item/clothing/shoes/magboots = 1, /obj/item/kitchen/knife/ritual = 1, /obj/item/clothing/suit/wizrobe/red = 1, diff --git a/code/game/gamemodes/wizard/rightandwrong.dm b/code/game/gamemodes/wizard/rightandwrong.dm index 76ac6dc603f..5f2dc094724 100644 --- a/code/game/gamemodes/wizard/rightandwrong.dm +++ b/code/game/gamemodes/wizard/rightandwrong.dm @@ -66,7 +66,7 @@ GLOBAL_LIST_INIT(summoned_magic, list( /obj/item/gun/magic/staff/door, /obj/item/scrying, /obj/item/voodoo, - /obj/item/clothing/suit/space/hardsuit/wizard, + /obj/item/clothing/suit/space/hardsuit/shielded/wizard, /obj/item/immortality_talisman, /obj/item/melee/ghost_sword)) @@ -83,7 +83,7 @@ GLOBAL_LIST_INIT(summoned_special_magic, list( GLOBAL_LIST_INIT(summoned_magic_objectives, list( /obj/item/contract, /obj/item/blood_contract, - /obj/item/clothing/suit/space/hardsuit/wizard, + /obj/item/clothing/suit/space/hardsuit/shielded/wizard, /obj/item/gun/magic, /obj/item/immortality_talisman, /obj/item/melee/ghost_sword, diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index 69bcfeb4a7a..d2842c21c24 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -444,18 +444,21 @@ category = "Artefacts" //Weapons and Armors -/datum/spellbook_entry/item/armor - name = "Mastercrafted Armor Set" - desc = "An artefact suit of armor that allows you to cast spells while providing more protection against attacks and the void of space. Comes bundled with Boots of Gripping." - item_path = /obj/item/clothing/suit/space/hardsuit/wizard - log_name = "HS" +/datum/spellbook_entry/item/battlemage + name = "Battlemage Armour" + desc = "An ensorceled suit of armour, protected by a powerful shield. The shield can completely negate sixteen attacks before being permanently depleted." + item_path = /obj/item/clothing/suit/space/hardsuit/shielded/wizard + limit = 1 category = "Weapons and Armors" + log_name = "BMA" -/datum/spellbook_entry/item/armor/Buy(var/mob/living/carbon/human/user,var/obj/item/spellbook/book) - . = ..() - if(.) - new /obj/item/clothing/shoes/sandal(get_turf(user)) //In case they've lost them. - new /obj/item/clothing/gloves/color/purple(get_turf(user)) // To complete the outfit +/datum/spellbook_entry/item/battlemage_charge + name = "Battlemage Armour Charges" + desc = "A powerful defensive rune, it will grant eight additional charges to a suit of battlemage armour." + item_path = /obj/item/wizard_armour_charge + category = "Weapons and Armors" + cost = 1 + log_name = "BMAC" /datum/spellbook_entry/item/mjolnir name = "Mjolnir" diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 37a99a54682..d37c6fe9807 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -579,6 +579,9 @@ BLIND // can't see anything else ..() //This is required in order to ensure that the UI buttons for items that have alternate functions tied to UI buttons still work. +/obj/item/clothing/suit/proc/special_overlays() // Does it have special overlays when worn? + return FALSE + //Spacesuit //Note: Everything in modules/clothing/spacesuits should have the entire suit grouped together. // Meaning the the suit is defined directly after the corrisponding helmet. Just like below! diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index a00c1b5270b..9e78a4feb16 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -405,33 +405,6 @@ /obj/item/clothing/head/helmet/space/hardsuit/syndi/freedom/update_icon() return -//Wizard hardsuit -/obj/item/clothing/head/helmet/space/hardsuit/wizard - name = "gem-encrusted hardsuit helmet" - desc = "A bizarre gem-encrusted helmet that radiates magical energies." - icon_state = "hardsuit0-wiz" - item_state = "wiz_helm" - item_color = "wiz" - unacidable = TRUE //No longer shall our kind be foiled by lone chemists with spray bottles! - armor = list(melee = 40, bullet = 40, laser = 40, energy = 20, bomb = 35, bio = 100, rad = 50) - heat_protection = HEAD //Uncomment to enable firesuit protection - max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT - magical = TRUE - -/obj/item/clothing/suit/space/hardsuit/wizard - icon_state = "hardsuit-wiz" - name = "gem-encrusted hardsuit" - desc = "A bizarre gem-encrusted suit that radiates magical energies." - item_state = "wiz_hardsuit" - w_class = WEIGHT_CLASS_NORMAL - unacidable = TRUE - armor = list(melee = 40, bullet = 40, laser = 40, energy = 20, bomb = 35, bio = 100, rad = 50) - allowed = list(/obj/item/teleportation_scroll,/obj/item/tank) - heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS //Uncomment to enable firesuit protection - max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT - helmettype = /obj/item/clothing/head/helmet/space/hardsuit/wizard - magical = TRUE - //Medical hardsuit /obj/item/clothing/head/helmet/space/hardsuit/medical name = "medical hardsuit helmet" @@ -525,23 +498,24 @@ var/recharge_rate = 1 //How quickly the shield recharges once it starts charging var/shield_state = "shield-old" var/shield_on = "shield-old" - sprite_sheets = null /obj/item/clothing/suit/space/hardsuit/shielded/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) + recharge_cooldown = world.time + recharge_delay if(current_charges > 0) do_sparks(2, 1, src) owner.visible_message("[owner]'s shields deflect [attack_text] in a shower of sparks!") current_charges-- - recharge_cooldown = world.time + recharge_delay - START_PROCESSING(SSobj, src) + if(recharge_rate) + START_PROCESSING(SSobj, src) if(current_charges <= 0) - owner.visible_message("[owner]'s shield overloads!") + owner.visible_message("[owner]'s shield overloads!") shield_state = "broken" owner.update_inv_wear_suit() return 1 return 0 + /obj/item/clothing/suit/space/hardsuit/shielded/Destroy() STOP_PROCESSING(SSobj, src) return ..() @@ -549,15 +523,18 @@ /obj/item/clothing/suit/space/hardsuit/shielded/process() if(world.time > recharge_cooldown && current_charges < max_charges) current_charges = Clamp((current_charges + recharge_rate), 0, max_charges) - playsound(loc, 'sound/magic/charge.ogg', 50, 1) + playsound(loc, 'sound/magic/charge.ogg', 50, TRUE) if(current_charges == max_charges) - playsound(loc, 'sound/machines/ding.ogg', 50, 1) + playsound(loc, 'sound/machines/ding.ogg', 50, TRUE) STOP_PROCESSING(SSobj, src) shield_state = "[shield_on]" - if(istype(loc, /mob/living/carbon/human)) + if(ishuman(loc)) var/mob/living/carbon/human/C = loc C.update_inv_wear_suit() +/obj/item/clothing/suit/space/hardsuit/shielded/special_overlays() + return mutable_appearance('icons/effects/effects.dmi', shield_state, MOB_LAYER + 0.01) + //////Syndicate Version /obj/item/clothing/suit/space/hardsuit/shielded/syndi @@ -571,14 +548,25 @@ slowdown = 0 helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/syndi jetpack = /obj/item/tank/jetpack/suit - sprite_sheets = list( - "Unathi" = 'icons/mob/species/unathi/suit.dmi', - "Tajaran" = 'icons/mob/species/tajaran/suit.dmi', - "Skrell" = 'icons/mob/species/skrell/suit.dmi', - "Vox" = 'icons/mob/species/vox/suit.dmi', - "Vulpkanin" = 'icons/mob/species/vulpkanin/suit.dmi', - "Drask" = 'icons/mob/species/drask/suit.dmi' - ) + +/obj/item/clothing/suit/space/hardsuit/shielded/syndi/attackby(obj/item/I, mob/user, params) + if(ismultitool(I)) + if(shield_state == "broken") + to_chat(user, "You can't interface with the hardsuit's software if the shield's broken!") + return + + if(shield_state == "shield-red") + shield_state = "shield-old" + shield_on = "shield-old" + to_chat(user, "You roll back the hardsuit's software, changing the shield's color!") + + else + shield_state = "shield-red" + shield_on = "shield-red" + to_chat(user, "You update the hardsuit's hardware, changing back the shield's color to red.") + user.update_inv_wear_suit() + return + return ..() /obj/item/clothing/head/helmet/space/hardsuit/shielded/syndi name = "blood-red hardsuit helmet" diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm index 4329f3e04f4..69ccaf53b7b 100644 --- a/code/modules/clothing/suits/wiz_robe.dm +++ b/code/modules/clothing/suits/wiz_robe.dm @@ -154,4 +154,57 @@ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) unacidable = 0 burn_state = FLAMMABLE - magical = FALSE \ No newline at end of file + magical = FALSE + +//Shielded Armour + +/obj/item/clothing/suit/space/hardsuit/shielded/wizard + name = "battlemage armour" + desc = "Not all wizards are afraid of getting up close and personal." + icon_state = "hardsuit-wiz" + item_state = "wiz_hardsuit" + recharge_rate = 0 + current_charges = 15 + recharge_cooldown = INFINITY + shield_state = "shield-red" + shield_on = "shield-red" + min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT + max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT + helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/wizard + armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 20, bio = 20, rad = 20, fire = 100, acid = 100) + slowdown = 0 + unacidable = TRUE + burn_state = FIRE_PROOF + magical = TRUE + +/obj/item/clothing/head/helmet/space/hardsuit/shielded/wizard + name = "battlemage helmet" + desc = "A suitably impressive helmet." + icon_state = "hardsuit0-wiz" + item_state = "wiz_helm" + item_color = "wiz" + min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT + max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT + armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 20, bio = 20, rad = 20, fire = 100, acid = 100) + actions_types = null //No inbuilt light + unacidable = TRUE + burn_state = FIRE_PROOF + magical = TRUE + +/obj/item/clothing/head/helmet/space/hardsuit/shielded/wizard/attack_self(mob/user) + return + +/obj/item/wizard_armour_charge + name = "battlemage shield charges" + desc = "A powerful rune that will increase the number of hits a suit of battlemage armour can take before failing.." + icon = 'icons/effects/effects.dmi' + icon_state = "electricity2" + +/obj/item/wizard_armour_charge/afterattack(obj/item/clothing/suit/space/hardsuit/shielded/wizard/W, mob/user) + . = ..() + if(!istype(W)) + to_chat(user, "The rune can only be used on battlemage armour!") + return + W.current_charges += 8 + to_chat(user, "You charge [W]. It can now absorb [W.current_charges] hits.") + qdel(src) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 0019aefbad3..19c6b27cfdb 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1573,7 +1573,7 @@ Eyes need to have significantly high darksight to shine unless the mob has the X threatcount += 2 //Check for dresscode violations - if(istype(head, /obj/item/clothing/head/wizard) || istype(head, /obj/item/clothing/head/helmet/space/hardsuit/wizard)) + if(istype(head, /obj/item/clothing/head/wizard) || istype(head, /obj/item/clothing/head/helmet/space/hardsuit/shielded/wizard)) threatcount += 2 diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 05dfbd0e302..eeda9f87461 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -893,6 +893,11 @@ var/global/list/damage_icon_parts = list() bloodsies.color = wear_suit.blood_color standing.overlays += bloodsies + + var/special_overlays = wear_suit.special_overlays() + if(special_overlays) + standing.overlays += special_overlays + standing.alpha = wear_suit.alpha standing.color = wear_suit.color overlays_standing[SUIT_LAYER] = standing From 69e3a08a06bf7a7324762356af7e18264e98d455 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Tue, 24 Sep 2019 18:42:49 -0400 Subject: [PATCH 28/57] Automatic changelog generation for PR #12388 [ci skip] --- html/changelogs/AutoChangeLog-pr-12388.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12388.yml diff --git a/html/changelogs/AutoChangeLog-pr-12388.yml b/html/changelogs/AutoChangeLog-pr-12388.yml new file mode 100644 index 00000000000..4f064ebce36 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12388.yml @@ -0,0 +1,7 @@ +author: "Fox McCloud" +delete-after: True +changes: + - tweak: "Wizard's hardsuit is now battlemage armor" + - tweak: "Battlemage armor protects you from pressure of space (but not the cold), has no slowdown, and a moderate amount of armor, however, it has 16 shields to block incoming attacks" + - rscadd: "Can purchase additional charges for your battlemage armor for 1 spell point" + - tweak: "Shielded hardsuits now show the shield on the mob" From cb8529cdb85b9e83f1f4581601e243d8475a97f4 Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Tue, 24 Sep 2019 19:17:33 -0400 Subject: [PATCH 29/57] Makes Xenobiology Simpler. Removes Slimes (#12398) --- _maps/map_files/Delta/delta.dmm | 2 +- .../MetaStation/MetaStation.v41A.II.dmm | 2 +- _maps/map_files/cyberiad/cyberiad.dmm | 8 +- christmas.dm | 0 code/__DEFINES/is_helpers.dm | 2 +- code/__DEFINES/mobs.dm | 17 +- code/__HELPERS/unsorted.dm | 19 +- code/_onclick/hud/slime.dm | 18 +- code/_onclick/other_mobs.dm | 8 +- code/datums/diseases/transformation.dm | 2 +- code/datums/helper_datums/teleport.dm | 2 + code/datums/mind.dm | 2 +- code/datums/spells/area_teleport.dm | 3 + code/game/dna/dna_modifier.dm | 13 +- code/game/dna/genes/goon_powers.dm | 2 +- .../gamemodes/miniantags/abduction/gland.dm | 2 +- .../abduction/machinery/experiment.dm | 14 +- .../gamemodes/miniantags/bot_swarm/swarmer.dm | 2 +- code/game/machinery/Sleeper.dm | 21 +- code/game/machinery/adv_med.dm | 14 +- code/game/machinery/cryo.dm | 21 +- code/game/machinery/cryopod.dm | 14 +- code/game/mecha/mecha.dm | 4 - code/game/objects/items.dm | 2 +- code/game/objects/items/devices/scanners.dm | 53 +- .../items/weapons/implants/implantchair.dm | 2 +- code/game/objects/items/weapons/scrolls.dm | 3 + code/game/objects/obj_defense.dm | 4 +- .../structures/crates_lockers/closets.dm | 2 +- code/game/objects/structures/inflatable.dm | 2 +- code/game/objects/structures/mirror.dm | 6 +- code/game/verbs/suicide.dm | 2 +- code/modules/admin/topic.dm | 2 +- code/modules/admin/verbs/debug.dm | 10 + code/modules/admin/verbs/freeze.dm | 8 +- code/modules/events/anomaly_pyro.dm | 9 +- .../kitchen_machinery/processor.dm | 17 +- .../mob/living/carbon/alien/alien_defense.dm | 9 + .../living/carbon/alien/humanoid/humanoid.dm | 9 - .../mob/living/carbon/alien/larva/larva.dm | 10 - code/modules/mob/living/carbon/brain/brain.dm | 2 +- .../mob/living/carbon/carbon_defense.dm | 29 +- .../mob/living/carbon/human/human_defense.dm | 26 +- code/modules/mob/living/carbon/slime/death.dm | 21 - .../mob/living/carbon/slime/examine.dm | 45 -- code/modules/mob/living/carbon/slime/life.dm | 570 ---------------- .../modules/mob/living/carbon/slime/powers.dm | 233 ------- code/modules/mob/living/carbon/slime/say.dm | 29 - code/modules/mob/living/carbon/slime/slime.dm | 546 ---------------- .../mob/living/carbon/slime/update_icons.dm | 1 - code/modules/mob/living/living.dm | 4 - code/modules/mob/living/living_defense.dm | 26 +- code/modules/mob/living/living_defines.dm | 1 - .../mob/living/silicon/ai/ai_defense.dm | 2 +- .../mob/living/silicon/robot/robot_defense.dm | 2 +- .../living/simple_animal/animal_defense.dm | 12 +- .../living/simple_animal/friendly/slime.dm | 60 -- .../mob/living/simple_animal/simple_animal.dm | 2 +- .../mob/living/simple_animal/slime/death.dm | 32 + .../{carbon => simple_animal}/slime/emote.dm | 9 +- .../mob/living/simple_animal/slime/life.dm | 617 ++++++++++++++++++ .../mob/living/simple_animal/slime/powers.dm | 215 ++++++ .../mob/living/simple_animal/slime/say.dm | 18 + .../mob/living/simple_animal/slime/slime.dm | 505 ++++++++++++++ .../slime/subtypes.dm | 4 +- code/modules/mob/transform_procs.dm | 27 +- code/modules/projectiles/projectile/magic.dm | 2 +- code/modules/reagents/chemistry/holder.dm | 14 +- .../reagents/chemistry/reagents/food.dm | 4 +- .../chemistry/reagents/pyrotechnic.dm | 2 +- .../reagents/chemistry/reagents/water.dm | 4 +- .../chemistry/recipes/slime_extracts.dm | 17 +- code/modules/recycling/disposal.dm | 2 +- .../research/xenobiology/xenobio_camera.dm | 47 +- .../research/xenobiology/xenobiology.dm | 15 +- code/modules/spacepods/spacepod.dm | 7 +- code/modules/surgery/core_removal.dm | 61 ++ code/modules/surgery/slime.dm | 103 --- icons/mob/actions/actions_slime.dmi | Bin 0 -> 4717 bytes icons/mob/slimes.dmi | Bin 85977 -> 86112 bytes paradise.dme | 19 +- 81 files changed, 1774 insertions(+), 1903 deletions(-) create mode 100644 christmas.dm delete mode 100644 code/modules/mob/living/carbon/slime/death.dm delete mode 100644 code/modules/mob/living/carbon/slime/examine.dm delete mode 100644 code/modules/mob/living/carbon/slime/life.dm delete mode 100644 code/modules/mob/living/carbon/slime/powers.dm delete mode 100644 code/modules/mob/living/carbon/slime/say.dm delete mode 100644 code/modules/mob/living/carbon/slime/slime.dm delete mode 100644 code/modules/mob/living/carbon/slime/update_icons.dm delete mode 100644 code/modules/mob/living/simple_animal/friendly/slime.dm create mode 100644 code/modules/mob/living/simple_animal/slime/death.dm rename code/modules/mob/living/{carbon => simple_animal}/slime/emote.dm (95%) create mode 100644 code/modules/mob/living/simple_animal/slime/life.dm create mode 100644 code/modules/mob/living/simple_animal/slime/powers.dm create mode 100644 code/modules/mob/living/simple_animal/slime/say.dm create mode 100644 code/modules/mob/living/simple_animal/slime/slime.dm rename code/modules/mob/living/{carbon => simple_animal}/slime/subtypes.dm (96%) create mode 100644 code/modules/surgery/core_removal.dm delete mode 100644 code/modules/surgery/slime.dm create mode 100644 icons/mob/actions/actions_slime.dmi diff --git a/_maps/map_files/Delta/delta.dmm b/_maps/map_files/Delta/delta.dmm index 3e6c7e5c478..a89ac854596 100644 --- a/_maps/map_files/Delta/delta.dmm +++ b/_maps/map_files/Delta/delta.dmm @@ -78837,7 +78837,7 @@ /turf/simulated/floor/plasteel, /area/toxins/xenobiology) "cKn" = ( -/mob/living/carbon/slime, +/mob/living/simple_animal/slime, /turf/simulated/floor/greengrid, /area/toxins/xenobiology) "cKo" = ( diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm index c9c348db8d1..02acdb8fe7e 100644 --- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm +++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm @@ -23103,7 +23103,7 @@ /turf/simulated/floor/plasteel, /area/storage/tools) "aOE" = ( -/mob/living/carbon/slime, +/mob/living/simple_animal/slime, /turf/simulated/floor/plasteel, /area/toxins/xenobiology{ name = "\improper Secure Lab" diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 2162c77926e..02bd3ad1e7c 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -79739,7 +79739,7 @@ /obj/effect/landmark{ name = "revenantspawn" }, -/mob/living/carbon/slime, +/mob/living/simple_animal/slime, /turf/simulated/floor/engine, /area/toxins/xenobiology) "cMh" = ( @@ -81166,7 +81166,7 @@ }, /area/toxins/xenobiology) "cOS" = ( -/obj/machinery/optable, +/obj/structure/table, /turf/simulated/floor/plasteel{ icon_state = "white" }, @@ -81933,10 +81933,8 @@ /area/toxins/xenobiology) "cQt" = ( /obj/structure/table/reinforced, -/obj/item/circular_saw{ - pixel_y = 0 - }, /obj/item/scalpel, +/obj/item/hemostat, /turf/simulated/floor/plasteel{ icon_state = "white" }, diff --git a/christmas.dm b/christmas.dm new file mode 100644 index 00000000000..e69de29bb2d diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 0e5c5316254..5f9e2b463ff 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -84,7 +84,7 @@ GLOBAL_LIST_INIT(glass_sheet_types, typecacheof(list( #define isaliensentinel(A) (istype(A, /mob/living/carbon/alien/humanoid/sentinel)) -#define isslime(A) (istype((A), /mob/living/carbon/slime)) +#define isslime(A) (istype((A), /mob/living/simple_animal/slime)) //Structures #define isstructure(A) (istype((A), /obj/structure)) diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 0a551570472..1db82f879fe 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -95,6 +95,21 @@ #define APPEARANCE_ALL_BODY APPEARANCE_ALL_HAIR|APPEARANCE_HEAD_ACCESSORY|APPEARANCE_MARKINGS|APPEARANCE_BODY_ACCESSORY|APPEARANCE_ALT_HEAD #define APPEARANCE_ALL 32767 +//Slime evolution threshold. Controls how fast slimes can split/grow +#define SLIME_EVOLUTION_THRESHOLD 10 + +//Slime extract crossing. Controls how many extracts is required to feed to a slime to core-cross. +#define SLIME_EXTRACT_CROSSING_REQUIRED 10 + +//Slime commands defines +#define SLIME_FRIENDSHIP_FOLLOW 3 //Min friendship to order it to follow +#define SLIME_FRIENDSHIP_STOPEAT 5 //Min friendship to order it to stop eating someone +#define SLIME_FRIENDSHIP_STOPEAT_NOANGRY 7 //Min friendship to order it to stop eating someone without it losing friendship +#define SLIME_FRIENDSHIP_STOPCHASE 4 //Min friendship to order it to stop chasing someone (their target) +#define SLIME_FRIENDSHIP_STOPCHASE_NOANGRY 6 //Min friendship to order it to stop chasing someone (their target) without it losing friendship +#define SLIME_FRIENDSHIP_STAY 3 //Min friendship to order it to stay +#define SLIME_FRIENDSHIP_ATTACK 8 //Min friendship to order it to attack + //If you add a new status, be sure to add a list for it to the simple_animals global in _globalvars/lists/mobs.dm //Hostile Mob AI Status #define AI_ON 1 @@ -200,7 +215,7 @@ // For the tcomms monitor #define ispathhuman(A) (ispath(A, /mob/living/carbon/human)) #define ispathbrain(A) (ispath(A, /mob/living/carbon/brain)) -#define ispathslime(A) (ispath(A, /mob/living/carbon/slime)) +#define ispathslime(A) (ispath(A, /mob/living/simple_animal/slime)) #define ispathbot(A) (ispath(A, /mob/living/simple_animal/bot)) #define ispathsilicon(A) (ispath(A, /mob/living/silicon)) #define ispathanimal(A) (ispath(A, /mob/living/simple_animal)) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 3aaf3164428..82295bc9d80 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -421,7 +421,7 @@ Turf and target are seperate in case you want to teleport some distance from a t moblist.Add(M) for(var/mob/new_player/M in sortmob) moblist.Add(M) - for(var/mob/living/carbon/slime/M in sortmob) + for(var/mob/living/simple_animal/slime/M in sortmob) moblist.Add(M) for(var/mob/living/simple_animal/M in sortmob) moblist.Add(M) @@ -1530,6 +1530,23 @@ var/mob/dview/dview_mob = new return FALSE return TRUE +//datum may be null, but it does need to be a typed var +#define NAMEOF(datum, X) (#X || ##datum.##X) + +#define VARSET_LIST_CALLBACK(target, var_name, var_value) CALLBACK(GLOBAL_PROC, /proc/___callbackvarset, ##target, ##var_name, ##var_value) +//dupe code because dm can't handle 3 level deep macros +#define VARSET_CALLBACK(datum, var, var_value) CALLBACK(GLOBAL_PROC, /proc/___callbackvarset, ##datum, NAMEOF(##datum, ##var), ##var_value) + +/proc/___callbackvarset(list_or_datum, var_name, var_value) + if(length(list_or_datum)) + list_or_datum[var_name] = var_value + return + var/datum/D = list_or_datum + if(IsAdminAdvancedProcCall()) + D.vv_edit_var(var_name, var_value) //same result generally, unless badmemes + else + D.vars[var_name] = var_value + //Get the dir to the RIGHT of dir if they were on a clock //NORTH --> NORTHEAST /proc/get_clockwise_dir(dir) diff --git a/code/_onclick/hud/slime.dm b/code/_onclick/hud/slime.dm index 9f5621b75ee..f49228ddf66 100644 --- a/code/_onclick/hud/slime.dm +++ b/code/_onclick/hud/slime.dm @@ -1,18 +1,8 @@ -/mob/living/carbon/slime/create_mob_hud() - if(client && !hud_used) - hud_used = new /datum/hud/slime(src) - -/mob/living/simple_animal/slime/create_mob_hud() - if(client && !hud_used) - hud_used = new /datum/hud/slime(src) - -/datum/hud/slime/New(mob/owner) +/datum/hud/slime/New(mob/living/simple_animal/slime/owner, ui_style = 'icons/mob/screen_slime.dmi') ..() mymob.healths = new /obj/screen/healths/slime() infodisplay += mymob.healths - mymob.pullin = new /obj/screen/pull() - mymob.pullin.icon = 'icons/mob/screen_slime.dmi' - mymob.pullin.update_icon(mymob) - mymob.pullin.screen_loc = ui_construct_pull - hotkeybuttons += mymob.pullin +/mob/living/simple_animal/slime/create_mob_hud() + if(client && !hud_used) + hud_used = new /datum/hud/slime(src) \ No newline at end of file diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 53f2a89f9c1..d4ef3799610 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -84,11 +84,13 @@ Slimes Nothing happening here */ -/mob/living/carbon/slime/UnarmedAttack(var/atom/A) +/mob/living/simple_animal/slime/UnarmedAttack(atom/A) A.attack_slime(src) -/atom/proc/attack_slime(mob/user as mob) + +/atom/proc/attack_slime(mob/user) return -/mob/living/carbon/slime/RestrainedClickOn(var/atom/A) + +/mob/living/simple_animal/slime/RestrainedClickOn(atom/A) return /* diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm index 766c52c7b65..f619e9aa9bd 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/transformation.dm @@ -186,7 +186,7 @@ stage3 = list("Your appendages are melting away.", "Your limbs begin to lose their shape.") stage4 = list("You are turning into a slime.") stage5 = list("You have become a slime.") - new_form = /mob/living/carbon/slime/random + new_form = /mob/living/simple_animal/slime/random /datum/disease/transformation/slime/stage_act() ..() diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index 65e188512d5..bb424a9afdf 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -140,6 +140,8 @@ var/mob/living/L = teleatom if(L.buckled) L.buckled.unbuckle_mob(L, force = TRUE) + if(L.has_buckled_mobs()) + L.unbuckle_all_mobs(force = TRUE) destarea.Entered(teleatom) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index d03207ef41a..84d5ab32b8a 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -1729,7 +1729,7 @@ mind.active = 1 //indicates that the mind is currently synced with a client //slime -/mob/living/carbon/slime/mind_initialize() +/mob/living/simple_animal/slime/mind_initialize() ..() mind.assigned_role = "slime" diff --git a/code/datums/spells/area_teleport.dm b/code/datums/spells/area_teleport.dm index 023939c2747..2f07f106d2a 100644 --- a/code/datums/spells/area_teleport.dm +++ b/code/datums/spells/area_teleport.dm @@ -58,6 +58,9 @@ if(target && target.buckled) target.buckled.unbuckle_mob(target, force = TRUE) + if(target && target.has_buckled_mobs()) + target.unbuckle_all_mobs(force = TRUE) + var/list/tempL = L var/attempt = null var/success = 0 diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index e4b1f1e8a49..b95d3afc3f7 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -155,6 +155,9 @@ if(usr.abiotic()) to_chat(usr, "Subject cannot have abiotic items on.") return + if(usr.has_buckled_mobs()) //mob attached to us + to_chat(usr, "[usr] will not fit into the [src] because [usr.p_they()] [usr.p_have()] a slime latched onto [usr.p_their()] head.") + return usr.stop_pulling() usr.forceMove(src) src.occupant = usr @@ -190,10 +193,9 @@ if(L.abiotic()) to_chat(user, "Subject cannot have abiotic items on.") return - for(var/mob/living/carbon/slime/M in range(1,L)) - if(M.Victim == L) - to_chat(usr, "[L.name] will not fit into the [src] because [L.p_they()] [L.p_have()] a slime latched onto [L.p_their()] head.") - return + if(L.has_buckled_mobs()) //mob attached to us + to_chat(user, "[L] will not fit into [src] because [L.p_they()] [L.p_have()] a slime latched onto [L.p_their()] head.") + return if(L == user) visible_message("[user] climbs into the [src].") else @@ -242,6 +244,9 @@ if(G.affecting.abiotic()) to_chat(user, "Subject cannot have abiotic items on.") return + if(G.affecting.has_buckled_mobs()) //mob attached to us + to_chat(user, "will not fit into the [src] because [G.affecting.p_they()] [G.affecting.p_have()] a slime latched onto [G.affecting.p_their()] head.") + return if(panel_open) to_chat(usr, "Close the maintenance panel first.") return diff --git a/code/game/dna/genes/goon_powers.dm b/code/game/dna/genes/goon_powers.dm index 85e7126ae73..fa9f2a323e8 100644 --- a/code/game/dna/genes/goon_powers.dm +++ b/code/game/dna/genes/goon_powers.dm @@ -241,7 +241,7 @@ /mob/living/simple_animal/crab, /mob/living/simple_animal/mouse, /mob/living/carbon/human, - /mob/living/carbon/slime, + /mob/living/simple_animal/slime, /mob/living/carbon/alien/larva, /mob/living/simple_animal/slime, /mob/living/simple_animal/chick, diff --git a/code/game/gamemodes/miniantags/abduction/gland.dm b/code/game/gamemodes/miniantags/abduction/gland.dm index 2b0162829e1..2378ab1f789 100644 --- a/code/game/gamemodes/miniantags/abduction/gland.dm +++ b/code/game/gamemodes/miniantags/abduction/gland.dm @@ -129,7 +129,7 @@ to_chat(owner, "You feel nauseous!") owner.vomit(20) - var/mob/living/carbon/slime/Slime = new/mob/living/carbon/slime(get_turf(owner)) + var/mob/living/simple_animal/slime/Slime = new(get_turf(owner), "grey") Slime.Friends = list(owner) Slime.Leader = owner diff --git a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm index db6f07c1d24..fd7e7892cd4 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm @@ -27,10 +27,9 @@ return //occupied if(target.buckled) return - for(var/mob/living/carbon/slime/M in range(1, target)) - if(M.Victim == target) - to_chat(user, "[target] has a slime attached to [target.p_them()], deal with that first.") - return + if(target.has_buckled_mobs()) //mob attached to us + to_chat(user, "[target] will not fit into [src] because [target.p_they()] [target.p_have()] a slime latched onto [target.p_their()] head.") + return visible_message("[user] puts [target] into the [src].") target.forceMove(src) @@ -191,10 +190,9 @@ if(occupant) to_chat(user, "The [src] is already occupied!") return - for(var/mob/living/carbon/slime/S in range(1, grabbed.affecting)) - if(S.Victim == grabbed.affecting) - to_chat(user, "[grabbed.affecting] has a slime attached to them, deal with that first.") - return + if(grabbed.affecting.has_buckled_mobs()) //mob attached to us + to_chat(user, "[grabbed.affecting] will not fit into [src] because [grabbed.affecting.p_they()] [grabbed.affecting.p_have()] a slime latched onto [grabbed.affecting.p_their()] head.") + return visible_message("[user] puts [grabbed.affecting] into the [src].") var/mob/living/carbon/human/H = grabbed.affecting H.forceMove(src) diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm index 3c0ca1955fb..6ea14557e06 100644 --- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm +++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm @@ -346,7 +346,7 @@ S.DisperseTarget(src) return TRUE -/mob/living/carbon/slime/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) +/mob/living/simple_animal/slime/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) to_chat(S, "This biological resource is somehow resisting our bluespace transceiver. Aborting.") return FALSE diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index c447ff26e72..aefe99213e1 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -328,10 +328,9 @@ if(occupant) to_chat(user, "The sleeper is already occupied!") return - for(var/mob/living/carbon/slime/M in range(1, G.affecting)) - if(M.Victim == G.affecting) - to_chat(user, "[G.affecting.name] will not fit into the sleeper because [G.affecting.p_they()] [G.affecting.p_have()] a slime latched onto [G.affecting.p_their()] head.") - return + if(G.affecting.has_buckled_mobs()) //mob attached to us + to_chat(user, "[G.affecting] will not fit into [src] because [G.affecting.p_they()] [G.affecting.p_have()] a slime latched onto [G.affecting.p_their()] head.") + return visible_message("[user] starts putting [G.affecting.name] into the sleeper.") @@ -488,10 +487,9 @@ if(L.abiotic()) to_chat(user, "Subject cannot have abiotic items on.") return - for(var/mob/living/carbon/slime/M in range(1,L)) - if(M.Victim == L) - to_chat(usr, "[L.name] will not fit into the sleeper because [L.p_they()] [L.p_have()] a slime latched onto their head.") - return + if(L.has_buckled_mobs()) //mob attached to us + to_chat(user, "[L] will not fit into [src] because [L.p_they()] [L.p_have()] a slime latched onto [L.p_their()] head.") + return if(L == user) visible_message("[user] starts climbing into the sleeper.") else @@ -529,10 +527,9 @@ return if(usr.incapacitated()) //are you cuffed, dying, lying, stunned or other return - for(var/mob/living/carbon/slime/M in range(1,usr)) - if(M.Victim == usr) - to_chat(usr, "You're too busy getting your life sucked out of you.") - return + if(usr.has_buckled_mobs()) //mob attached to us + to_chat(usr, "[usr] will not fit into [src] because [usr.p_they()] [usr.p_have()] a slime latched onto [usr.p_their()] head.") + return visible_message("[usr] starts climbing into the sleeper.") if(do_after(usr, 20, target = usr)) if(occupant) diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index adb08949732..1fb4c505170 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -77,10 +77,9 @@ if(occupant) to_chat(user, "The scanner is already occupied!") return - for(var/mob/living/carbon/slime/M in range(1, TYPECAST_YOUR_SHIT.affecting)) - if(M.Victim == TYPECAST_YOUR_SHIT.affecting) - to_chat(user, "[TYPECAST_YOUR_SHIT.affecting.name] has a fucking slime attached to [TYPECAST_YOUR_SHIT.affecting.p_them()], deal with that first.") - return + if(TYPECAST_YOUR_SHIT.affecting.has_buckled_mobs()) //mob attached to us + to_chat(user, "[TYPECAST_YOUR_SHIT.affecting] will not fit into [src] because [TYPECAST_YOUR_SHIT.affecting.p_they()] [TYPECAST_YOUR_SHIT.affecting.p_have()] a fucking slime latched onto [TYPECAST_YOUR_SHIT.affecting.p_their()] head.") + return var/mob/living/carbon/human/M = TYPECAST_YOUR_SHIT.affecting if(M.abiotic()) to_chat(user, "Subject cannot have abiotic items on.") @@ -117,10 +116,9 @@ if(H.abiotic()) to_chat(user, "Subject cannot have abiotic items on.") return FALSE - for(var/mob/living/carbon/slime/M in range(1, H)) - if(M.Victim == H) - to_chat(user, "[H] has a fucking slime attached to [H.p_them()], deal with that first.") - return FALSE + if(H.has_buckled_mobs()) //mob attached to us + to_chat(user, "[H] will not fit into [src] because [H.p_they()] [H.p_have()] a slime latched onto [H.p_their()] head.") + return if(H == user) visible_message("[user] climbs into [src].") diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index b45a8331188..0546b0e9462 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -108,10 +108,9 @@ if(L.abiotic()) to_chat(user, "Subject cannot have abiotic items on.") return - for(var/mob/living/carbon/slime/M in range(1,L)) - if(M.Victim == L) - to_chat(usr, "[L.name] will not fit into the cryo cell because [L.p_they()] [L.p_have()] a slime latched onto [L.p_their()] head.") - return + if(L.has_buckled_mobs()) //mob attached to us + to_chat(user, "[L] will not fit into [src] because [L.p_they()] [L.p_have()] a slime latched onto [L.p_their()] head.") + return if(put_mob(L)) if(L == user) visible_message("[user] climbs into the cryo cell.") @@ -305,10 +304,9 @@ return if(!ismob(GG.affecting)) return - for(var/mob/living/carbon/slime/M in range(1,GG.affecting)) - if(M.Victim == GG.affecting) - to_chat(usr, "[GG.affecting.name] will not fit into the cryo because [GG.affecting.p_they()] [GG.affecting.p_have()] a slime latched onto [GG.affecting.p_their()] head.") - return + if(GG.affecting.has_buckled_mobs()) //mob attached to us + to_chat(user, "[GG.affecting] will not fit into [src] because [GG.affecting.p_they()] [GG.affecting.p_have()] a slime latched onto [GG.affecting.p_their()] head.") + return var/mob/M = GG.affecting if(put_mob(M)) qdel(GG) @@ -468,10 +466,9 @@ set category = "Object" set src in oview(1) - for(var/mob/living/carbon/slime/M in range(1,usr)) - if(M.Victim == usr) - to_chat(usr, "You're too busy getting your life sucked out of you.") - return + if(usr.has_buckled_mobs()) //mob attached to us + to_chat(usr, "[usr] will not fit into [src] because [usr.p_they()] [usr.p_have()] a slime latched onto [usr.p_their()] head.") + return if(stat & (NOPOWER|BROKEN)) return diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index f9d708a6200..9d6be29c84f 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -554,10 +554,9 @@ to_chat(user, "Dead people can not be put into cryo.") return - for(var/mob/living/carbon/slime/M in range(1,L)) - if(M.Victim == L) - to_chat(usr, "[L.name] will not fit into the cryo pod because [L.p_they()] [L.p_have()] a slime latched onto [L.p_their()] head.") - return + if(L.has_buckled_mobs()) //mob attached to us + to_chat(user, "[L] will not fit into [src] because [L.p_they()] [L.p_have()] a slime latched onto [L.p_their()] head.") + return var/willing = null //We don't want to allow people to be forced into despawning. @@ -658,10 +657,9 @@ to_chat(usr, "\The [src] is in use.") return - for(var/mob/living/carbon/slime/M in range(1,usr)) - if(M.Victim == usr) - to_chat(usr, "You're too busy getting your life sucked out of you.") - return + if(usr.has_buckled_mobs()) //mob attached to us + to_chat(usr, "[usr] will not fit into [src] because [usr.p_they()] [usr.p_have()] a slime latched onto [usr.p_their()] head.") + return visible_message("[usr] starts climbing into [src].") diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index e1c5a03b3a6..517d6dd4019 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -1144,10 +1144,6 @@ if(user.has_buckled_mobs()) //mob attached to us to_chat(user, "You can't enter the exosuit with other creatures attached to you!") return - for(var/mob/living/carbon/slime/S in range(1,user)) - if(S.Victim == user) - to_chat(user, "You're too busy getting your life sucked out of you.") - return visible_message("[user] starts to climb into [src]") diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 2116114a305..7acaf887828 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -471,7 +471,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d to_chat(user, "You're going to need to remove that mask/helmet/glasses first!") return - if(istype(M, /mob/living/carbon/alien) || istype(M, /mob/living/carbon/slime))//Aliens don't have eyes./N slimes also don't have eyes! + if(istype(M, /mob/living/carbon/alien) || istype(M, /mob/living/simple_animal/slime))//Aliens don't have eyes./N slimes also don't have eyes! to_chat(user, "You cannot locate any eyes on this creature!") return diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 841850ee418..6c5b9cae2d6 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -547,39 +547,46 @@ proc/healthscan(mob/user, mob/living/M, mode = 1, upgraded = FALSE) throw_range = 7 materials = list(MAT_METAL=30, MAT_GLASS=20) -/obj/item/slime_scanner/attack(mob/living/M as mob, mob/living/user as mob) - slime_scan(M, user) - -/proc/slime_scan(mob/living/carbon/slime/M, mob/living/user) - if(!isslime(M)) - user.show_message("This device can only scan slimes!", 1) +/obj/item/slime_scanner/attack(mob/living/M, mob/living/user) + if(user.incapacitated() || user.eye_blind) return - var/mob/living/carbon/slime/T = M - user.show_message("Slime scan results:", 1) - user.show_message(text("[T.colour] [] slime", T.is_adult ? "adult" : "baby"), 1) - user.show_message(text("Nutrition: [T.nutrition]/[]", T.get_max_nutrition()), 1) + if(!isslime(M)) + to_chat(user, "This device can only scan slimes!") + return + var/mob/living/simple_animal/slime/T = M + slime_scan(T, user) + +/proc/slime_scan(mob/living/simple_animal/slime/T, mob/living/user) + to_chat(user, "========================") + to_chat(user, "Slime scan results:") + to_chat(user, "[T.colour] [T.is_adult ? "adult" : "baby"] slime") + to_chat(user, "Nutrition: [T.nutrition]/[T.get_max_nutrition()]") if(T.nutrition < T.get_starve_nutrition()) - user.show_message("Warning: slime is starving!", 1) + to_chat(user, "Warning: slime is starving!") else if(T.nutrition < T.get_hunger_nutrition()) - user.show_message("Warning: slime is hungry", 1) - user.show_message("Electric change strength: [T.powerlevel]", 1) - user.show_message("Health: [T.health]", 1) + to_chat(user, "Warning: slime is hungry") + to_chat(user, "Electric change strength: [T.powerlevel]") + to_chat(user, "Health: [round(T.health/T.maxHealth,0.01)*100]%") if(T.slime_mutation[4] == T.colour) - user.show_message("This slime does not evolve any further.", 1) + to_chat(user, "This slime does not evolve any further.") else if(T.slime_mutation[3] == T.slime_mutation[4]) if(T.slime_mutation[2] == T.slime_mutation[1]) - user.show_message("Possible mutation: [T.slime_mutation[3]]", 1) - user.show_message("Genetic destability: [T.mutation_chance/2]% chance of mutation on splitting", 1) + to_chat(user, "Possible mutation: [T.slime_mutation[3]]") + to_chat(user, "Genetic destability: [T.mutation_chance/2] % chance of mutation on splitting") else - user.show_message("Possible mutations: [T.slime_mutation[1]], [T.slime_mutation[2]], [T.slime_mutation[3]] (x2)", 1) - user.show_message("Genetic destability: [T.mutation_chance]% chance of mutation on splitting", 1) + to_chat(user, "Possible mutations: [T.slime_mutation[1]], [T.slime_mutation[2]], [T.slime_mutation[3]] (x2)") + to_chat(user, "Genetic destability: [T.mutation_chance] % chance of mutation on splitting") else - user.show_message("Possible mutations: [T.slime_mutation[1]], [T.slime_mutation[2]], [T.slime_mutation[3]], [T.slime_mutation[4]]", 1) - user.show_message("Genetic destability: [T.mutation_chance]% chance of mutation on splitting", 1) + to_chat(user, "Possible mutations: [T.slime_mutation[1]], [T.slime_mutation[2]], [T.slime_mutation[3]], [T.slime_mutation[4]]") + to_chat(user, "Genetic destability: [T.mutation_chance] % chance of mutation on splitting") if(T.cores > 1) - user.show_message("Anomalous slime core amount detected", 1) - user.show_message("Growth progress: [T.amount_grown]/10", 1) + to_chat(user, "Multiple cores detected") + to_chat(user, "Growth progress: [T.amount_grown]/[SLIME_EVOLUTION_THRESHOLD]") + if(T.effectmod) + to_chat(user, "Core mutation in progress: [T.effectmod]") + to_chat(user, "Progress in core mutation: [T.applied] / [SLIME_EXTRACT_CROSSING_REQUIRED]") + to_chat(user, "========================") /obj/item/bodyanalyzer name = "handheld body analyzer" diff --git a/code/game/objects/items/weapons/implants/implantchair.dm b/code/game/objects/items/weapons/implants/implantchair.dm index cef14d28796..5727fe08cd0 100644 --- a/code/game/objects/items/weapons/implants/implantchair.dm +++ b/code/game/objects/items/weapons/implants/implantchair.dm @@ -79,7 +79,7 @@ return var/mob/M = G.affecting if(M.has_buckled_mobs()) - to_chat(usr, "[M] will not fit into [src] because [M.p_they()] [M.p_have()] a slime latched onto [M.p_their()] head.") + to_chat(user, "[M] will not fit into [src] because [M.p_they()] [M.p_have()] a slime latched onto [M.p_their()] head.") return if(put_mob(M)) qdel(G) diff --git a/code/game/objects/items/weapons/scrolls.dm b/code/game/objects/items/weapons/scrolls.dm index 696d54cc3bf..79d33de586f 100644 --- a/code/game/objects/items/weapons/scrolls.dm +++ b/code/game/objects/items/weapons/scrolls.dm @@ -85,6 +85,9 @@ if(user && user.buckled) user.buckled.unbuckle_mob(user, force = TRUE) + if(user && user.has_buckled_mobs()) + user.unbuckle_all_mobs(force = TRUE) + var/list/tempL = L var/attempt = null var/success = 0 diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index 572495b503f..6f007a6bdbc 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -126,10 +126,10 @@ if(. && !play_soundeffect) playsound(src, 'sound/effects/meteorimpact.ogg', 100, 1) -/obj/attack_slime(mob/living/carbon/slime/user) +/obj/attack_slime(mob/living/simple_animal/slime/user) if(!user.is_adult) return - attack_generic(user, rand(10, 15), "melee", 1) + attack_generic(user, rand(10, 15), BRUTE, "melee", 1) /obj/mech_melee_attack(obj/mecha/M) M.do_attack_animation(src) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index dba81195e6e..efca449bbf3 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -105,7 +105,7 @@ continue if(istype(M, /mob/living/simple_animal/bot/mulebot)) continue - if(M.buckled || M.anchored) + if(M.buckled || M.anchored || M.has_buckled_mobs()) continue M.forceMove(src) diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm index f4efa5452b0..03e80563224 100644 --- a/code/game/objects/structures/inflatable.dm +++ b/code/game/objects/structures/inflatable.dm @@ -90,7 +90,7 @@ attack_generic(M, M.melee_damage_upper) /obj/structure/inflatable/attack_slime(mob/user as mob) - var/mob/living/carbon/slime/S = user + var/mob/living/simple_animal/slime/S = user if(!S.is_adult) return attack_generic(user, rand(10, 15)) diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index 923fab9e885..f40d7f7f2de 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -108,7 +108,7 @@ /obj/structure/mirror/attack_slime(mob/living/user) user.changeNext_move(CLICK_CD_MELEE) - var/mob/living/carbon/slime/S = user + var/mob/living/simple_animal/slime/S = user if(!S.is_adult) return user.do_attack_animation(src) @@ -153,7 +153,7 @@ H.dna.real_name = newname if(H.mind) H.mind.name = newname - + if(newname) curse(user) @@ -197,7 +197,7 @@ if(voice_choice) curse(user) - + /obj/structure/mirror/magic/on_ui_close(mob/user) curse(user) diff --git a/code/game/verbs/suicide.dm b/code/game/verbs/suicide.dm index 0b171dac199..50b53cc7dd9 100644 --- a/code/game/verbs/suicide.dm +++ b/code/game/verbs/suicide.dm @@ -209,7 +209,7 @@ adjustOxyLoss(max(175 - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) -/mob/living/carbon/slime/verb/suicide() +/mob/living/simple_animal/slime/verb/suicide() set hidden = 1 if(stat == 2) to_chat(src, "You're already dead!") diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 754091a30db..a6926fe3414 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -345,7 +345,7 @@ var/mob/living/carbon/human/newmob = M.change_mob_type(/mob/living/carbon/human, null, null, delmob, 1) if(posttransformoutfit && istype(newmob)) newmob.equipOutfit(posttransformoutfit) - if("slime") M.change_mob_type( /mob/living/carbon/slime , null, null, delmob, 1 ) + if("slime") M.change_mob_type( /mob/living/simple_animal/slime , null, null, delmob, 1 ) if("monkey") M.change_mob_type( /mob/living/carbon/human/monkey , null, null, delmob, 1 ) if("robot") M.change_mob_type( /mob/living/silicon/robot , null, null, delmob, 1 ) if("cat") M.change_mob_type( /mob/living/simple_animal/pet/cat , null, null, delmob, 1 ) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 11664349274..57f88d20351 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -95,6 +95,16 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that to_chat(usr, "[procname] returned: [!isnull(returnval) ? returnval : "null"]") feedback_add_details("admin_verb","APC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +GLOBAL_VAR(AdminProcCaller) +GLOBAL_PROTECT(AdminProcCaller) + +/proc/IsAdminAdvancedProcCall() +#ifdef TESTING + return FALSE +#else + return usr && usr.client && GLOB.AdminProcCaller == usr.client.ckey +#endif + /client/proc/callproc_datum(var/A as null|area|mob|obj|turf) set category = "Debug" set name = "Atom ProcCall" diff --git a/code/modules/admin/verbs/freeze.dm b/code/modules/admin/verbs/freeze.dm index bdef649468d..4d60fb72bee 100644 --- a/code/modules/admin/verbs/freeze.dm +++ b/code/modules/admin/verbs/freeze.dm @@ -61,14 +61,12 @@ var/global/list/frozen_mob_list = list() update_icons() -/mob/living/carbon/slime/admin_Freeze(admin) +/mob/living/simple_animal/slime/admin_Freeze(admin) ..(admin) - adjustToxLoss(1010101010) //arbitrary large value + adjustHealth(1000) //arbitrary large value -/mob/living/carbon/slime/admin_unFreeze(admin) +/mob/living/simple_animal/slime/admin_unFreeze(admin) ..(admin) - adjustToxLoss(-1010101010) - stat = 0 revive() diff --git a/code/modules/events/anomaly_pyro.dm b/code/modules/events/anomaly_pyro.dm index 3c2e6025952..f281c549c97 100644 --- a/code/modules/events/anomaly_pyro.dm +++ b/code/modules/events/anomaly_pyro.dm @@ -22,7 +22,10 @@ if(newAnomaly.loc) explosion(get_turf(newAnomaly), -1,0,3, flame_range = 4) - var/mob/living/carbon/slime/S = new/mob/living/carbon/slime(get_turf(newAnomaly)) - S.colour = pick("red", "orange") - + var/turf/T = get_turf(src) + var/new_colour = pick("red", "orange") + var/mob/living/simple_animal/slime/S = new(T, new_colour) + S.rabid = TRUE + S.amount_grown = SLIME_EVOLUTION_THRESHOLD + S.Evolve() qdel(newAnomaly) \ No newline at end of file diff --git a/code/modules/food_and_drinks/kitchen_machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm index 19c866fae43..394ee10384b 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm @@ -30,13 +30,10 @@ rating_speed = M.rating /obj/machinery/processor/process() - ..() - // The irony - // To be clear, if it's grinding, then it can't suck them up if(processing) return - var/mob/living/carbon/slime/picked_slime - for(var/mob/living/carbon/slime/slime in range(1, src)) + var/mob/living/simple_animal/slime/picked_slime + for(var/mob/living/simple_animal/slime/slime in range(1, src)) if(slime.loc == src) continue if(slime.stat) @@ -48,7 +45,7 @@ if(!P) return - visible_message("[picked_slime] is sucked into \the [src].") + visible_message("[picked_slime] is sucked into [src].") picked_slime.forceMove(src) //RECIPE DATUMS @@ -110,18 +107,18 @@ /////MOB RECIPIES///// ////////////////////// /datum/food_processor_process/mob/slime - input = /mob/living/carbon/slime + input = /mob/living/simple_animal/slime output = null /datum/food_processor_process/mob/slime/process_food(loc, what, obj/machinery/processor/processor) - var/mob/living/carbon/slime/S = what + var/mob/living/simple_animal/slime/S = what var/C = S.cores if(S.stat != DEAD) - S.loc = loc + S.forceMove(processor.drop_location()) S.visible_message("[S] crawls free of the processor!") return for(var/i in 1 to (C+processor.rating_amount-1)) - new S.coretype(loc) + new S.coretype(processor.drop_location()) feedback_add_details("slime_core_harvested","[replacetext(S.colour," ","_")]") ..() diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm index d7881367d13..0f57ac11757 100644 --- a/code/modules/mob/living/carbon/alien/alien_defense.dm +++ b/code/modules/mob/living/carbon/alien/alien_defense.dm @@ -75,3 +75,12 @@ In all, this is a lot like the monkey code. /N adjustCloneLoss(damage) if(STAMINA) adjustStaminaLoss(damage) + +/mob/living/carbon/alien/attack_slime(mob/living/simple_animal/slime/M) + if(..()) //successful slime attack + var/damage = rand(5, 35) + if(M.is_adult) + damage = rand(10, 40) + adjustBruteLoss(damage) + add_attack_logs(src, M, "Slime'd for [damage] damage") + updatehealth("slime attack") \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index 788b8aa936d..d6bb6c6c1ac 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -65,15 +65,6 @@ take_overall_damage(b_loss, f_loss) -/mob/living/carbon/alien/humanoid/attack_slime(mob/living/carbon/slime/M) - ..() - var/damage = rand(5, 35) - if(M.is_adult) - damage = rand(10, 40) - adjustBruteLoss(damage) - add_attack_logs(src, M, "Slime'd for [damage] damage") - return - /mob/living/carbon/alien/humanoid/restrained() if(handcuffed) return 1 diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index 5ebaaffac0c..1ba5e4530ff 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -71,16 +71,6 @@ /mob/living/carbon/alien/larva/attack_ui(slot_id) return -/mob/living/carbon/alien/larva/attack_slime(mob/living/carbon/slime/M) - ..() - var/damage = rand(5, 35) - if(M.is_adult) - damage = rand(20, 40) - adjustBruteLoss(damage) - add_attack_logs(src, M, "Slime'd for [damage] damage") - updatehealth() - return - /mob/living/carbon/alien/larva/restrained() return 0 diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm index 8d17b84c724..34b5adf8dbf 100644 --- a/code/modules/mob/living/carbon/brain/brain.dm +++ b/code/modules/mob/living/carbon/brain/brain.dm @@ -41,7 +41,7 @@ return 1 if(istype(other, /mob/living/carbon/human)) return 1 - if(istype(other, /mob/living/carbon/slime)) + if(istype(other, /mob/living/simple_animal/slime)) return 1 return ..() diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index c583d9873b6..a89c73b6db2 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -48,16 +48,25 @@ return 1 return 0 -/mob/living/carbon/attack_slime(mob/living/carbon/slime/M) - if(..()) - var/power = M.powerlevel + rand(0,3) - Weaken(power) - Stuttering(power) - Stun(power) - var/stunprob = M.powerlevel * 7 + 10 - if(prob(stunprob) && M.powerlevel >= 8) - adjustFireLoss(M.powerlevel * rand(6,10)) - updatehealth("slime attack") +/mob/living/carbon/attack_slime(mob/living/simple_animal/slime/M) + if(..()) //successful slime attack + if(M.powerlevel > 0) + var/stunprob = M.powerlevel * 7 + 10 // 17 at level 1, 80 at level 10 + if(prob(stunprob)) + M.powerlevel -= 3 + if(M.powerlevel < 0) + M.powerlevel = 0 + + visible_message("The [M.name] has shocked [src]!", "The [M.name] has shocked you!") + + do_sparks(5, TRUE, src) + var/power = M.powerlevel + rand(0,3) + Stun(power) + if(stuttering < power) + stuttering = power + if (prob(stunprob) && M.powerlevel >= 8) + adjustFireLoss(M.powerlevel * rand(6,10)) + updatehealth("slime attack") return 1 /mob/living/carbon/is_mouth_covered(head_only = FALSE, mask_only = FALSE) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 87bc491f4ab..e2472513250 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -451,22 +451,22 @@ emp_act apply_damage(damage, M.melee_damage_type, affecting, armor) updatehealth("animal attack") -/mob/living/carbon/human/attack_slime(mob/living/carbon/slime/M) - ..() - var/damage = rand(1, 3) +/mob/living/carbon/human/attack_slime(mob/living/simple_animal/slime/M) + if(..()) //successful slime attack + var/damage = rand(5, 25) + if(M.is_adult) + damage = rand(10, 35) - if(M.is_adult) - damage = rand(10, 35) - else - damage = rand(5, 25) + if(check_shields(M, damage, "the [M.name]")) + return FALSE - var/dam_zone = pick("head", "chest", "groin", "l_arm", "l_hand", "r_arm", "r_hand", "l_leg", "l_foot", "r_leg", "r_foot") + var/dam_zone = pick("head", "chest", "groin", "l_arm", "l_hand", "r_arm", "r_hand", "l_leg", "l_foot", "r_leg", "r_foot") - var/obj/item/organ/external/affecting = get_organ(ran_zone(dam_zone)) - var/armor_block = run_armor_check(affecting, "melee") - apply_damage(damage, BRUTE, affecting, armor_block) - - return + var/obj/item/organ/external/affecting = get_organ(ran_zone(dam_zone)) + if(!affecting) + affecting = get_organ("chest") + var/armor_block = run_armor_check(affecting, "melee") + apply_damage(damage, BRUTE, affecting, armor_block) /mob/living/carbon/human/mech_melee_attack(obj/mecha/M) if(M.occupant.a_intent == INTENT_HARM) diff --git a/code/modules/mob/living/carbon/slime/death.dm b/code/modules/mob/living/carbon/slime/death.dm deleted file mode 100644 index 055f972df07..00000000000 --- a/code/modules/mob/living/carbon/slime/death.dm +++ /dev/null @@ -1,21 +0,0 @@ -/mob/living/carbon/slime/death(gibbed) - // Only execute the below if we successfully died - . = ..() - if(!.) - return FALSE - if(!gibbed) - if(is_adult) - var/mob/living/carbon/slime/M = new /mob/living/carbon/slime(loc) - M.colour = colour - M.rabid = 1 - is_adult = 0 - maxHealth = 150 - revive() - regenerate_icons() - number = rand(1, 1000) - name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])" - return - else - visible_message("The [name] seizes up and falls limp...") - icon_state = "[colour] baby slime dead" - overlays.Cut() diff --git a/code/modules/mob/living/carbon/slime/examine.dm b/code/modules/mob/living/carbon/slime/examine.dm deleted file mode 100644 index 4dd67695e2a..00000000000 --- a/code/modules/mob/living/carbon/slime/examine.dm +++ /dev/null @@ -1,45 +0,0 @@ -/mob/living/carbon/slime/examine(mob/user) - to_chat(user, "*---------*") - ..(user) - var/msg = "" - if(src.stat == DEAD) - msg += "It is limp and unresponsive.\n" - else - if(src.getBruteLoss()) - msg += "" - if(src.getBruteLoss() < 40) - msg += "It has some punctures in its flesh!" - else - msg += "It has severe punctures and tears in its flesh!" - msg += "\n" - - switch(powerlevel) - - if(2 to 3) - msg += "It is flickering gently with a little electrical activity.\n" - - if(4 to 5) - msg += "It is glowing gently with moderate levels of electrical activity.\n" - - if(6 to 9) - msg += "It is glowing brightly with high levels of electrical activity.\n" - - if(10) - msg += "It is radiating with massive levels of electrical activity!\n" - - msg += "" - switch(wetlevel) - if(1) - msg += "It looks a bit damp.\n" - if(2) - msg += "It looks a little bit wet.\n" - if(3) - msg += "It looks wet.\n" - if(4) - msg += "It looks very wet.\n" - if(5) - msg += "It looks absolutely soaked.\n" - msg += "" - - msg += "*---------*" - to_chat(user, msg) diff --git a/code/modules/mob/living/carbon/slime/life.dm b/code/modules/mob/living/carbon/slime/life.dm deleted file mode 100644 index e3bfcb74431..00000000000 --- a/code/modules/mob/living/carbon/slime/life.dm +++ /dev/null @@ -1,570 +0,0 @@ -/mob/living/carbon/slime - var/AIproc = 0 // determines if the AI loop is activated - var/Atkcool = 0 // attack cooldown - var/Tempstun = 0 // temporary temperature stuns - var/Discipline = 0 // if a slime has been hit with a freeze gun, or wrestled/attacked off a human, they become disciplined and don't attack anymore for a while - var/SStun = 0 // stun variable - -/mob/living/carbon/slime/Life(seconds, times_fired) - if(..()) - handle_nutrition() - handle_targets() - if(!ckey) - handle_speech_and_mood() - -/mob/living/carbon/slime/breathe() - return - -/mob/living/carbon/slime/proc/AIprocess() // the master AI process - - if(AIproc || stat == DEAD || client) return - - var/hungry = 0 - if(nutrition < get_starve_nutrition()) - hungry = 2 - else if(nutrition < get_grow_nutrition() && prob(25) || nutrition < get_hunger_nutrition()) - hungry = 1 - - AIproc = 1 - - while(AIproc && stat != 2 && (attacked || hungry || rabid || Victim)) - if(Victim) // can't eat AND have this little process at the same time - break - - if(!Target || client) - break - - if(Target.health <= -70 || Target.stat == 2) - Target = null - AIproc = 0 - break - - if(Target) - for(var/mob/living/carbon/slime/M in view(1,Target)) - if(M.Victim == Target) - Target = null - AIproc = 0 - break - if(!AIproc) - break - - if(Target in view(1,src)) - if(istype(Target, /mob/living/silicon)) - if(!Atkcool) - Atkcool = 1 - spawn(45) - Atkcool = 0 - - if(Target.Adjacent(src)) - Target.attack_slime(src) - return - if(!Target.lying && prob(80)) - - if(Target.client && Target.health >= 20) - if(!Atkcool) - Atkcool = 1 - spawn(45) - Atkcool = 0 - - if(Target.Adjacent(src)) - Target.attack_slime(src) - - else - if(!Atkcool && Target.Adjacent(src)) - Feedon(Target) - - else - if(!Atkcool && Target.Adjacent(src)) - Feedon(Target) - - else - if(Target in view(7, src)) - if(!Target.Adjacent(src)) // Bug of the month candidate: slimes were attempting to move to target only if it was directly next to them, which caused them to target things, but not approach them - step_to(src, Target) - sleep(5) - - else - Target = null - AIproc = 0 - break - - var/sleeptime = movement_delay() - if(sleeptime <= 0) sleeptime = 1 - - sleep(sleeptime + 2) // this is about as fast as a player slime can go - - AIproc = 0 - -/mob/living/carbon/slime/handle_environment(datum/gas_mixture/environment) - if(!environment) - adjustToxLoss(rand(10,20)) - return - - //var/environment_heat_capacity = environment.heat_capacity() - var/loc_temp = T0C - if(istype(get_turf(src), /turf/space)) - //environment_heat_capacity = loc:heat_capacity - var/turf/heat_turf = get_turf(src) - loc_temp = heat_turf.temperature - else if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell)) - loc_temp = loc:air_contents.temperature - else - loc_temp = environment.temperature - - //Account for massive pressure differences - if(bodytemperature < (T0C + 5)) // start calculating temperature damage etc - if(bodytemperature <= (T0C - 40)) // stun temperature - Tempstun = 1 - - if(bodytemperature <= (T0C - 50)) // hurt temperature - if(bodytemperature <= 50) // sqrting negative numbers is bad - adjustToxLoss(301) //The config.health_threshold_dead is -100 by default, and slimes have 150hp (200hp for adults), - else //so the ToxLoss needs to be 300 or above to guarrantee an instant death - adjustToxLoss(round(sqrt(bodytemperature)) * 2) - else - Tempstun = 0 - - - /*moved after the temperature damage code so freeze beams can instantly kill slimes -Deity Link*/ - if(loc_temp < 310.15) // a cold place - bodytemperature += adjust_body_temperature(bodytemperature, loc_temp, 1) - else // a hot place - bodytemperature += adjust_body_temperature(bodytemperature, loc_temp, 1) - - updatehealth("handle environment") - - return //TODO: DEFERRED - -/mob/living/carbon/slime/proc/adjust_body_temperature(current, loc_temp, boost) - var/temperature = current - var/difference = abs(current-loc_temp) //get difference - var/increments// = difference/10 //find how many increments apart they are - if(difference > 50) - increments = difference/5 - else - increments = difference/10 - var/change = increments*boost // Get the amount to change by (x per increment) - var/temp_change - if(current < loc_temp) - temperature = min(loc_temp, temperature+change) - else if(current > loc_temp) - temperature = max(loc_temp, temperature-change) - temp_change = (temperature - current) - return temp_change - -/mob/living/carbon/slime/handle_chemicals_in_body() - - if(reagents) - reagents.metabolize(src) - - if(reagents.get_reagent_amount("plasma")>=5) - mutation_chance = min(mutation_chance + 5,50) //Prevents mutation chance going >50% - reagents.remove_reagent("plasma", 5) - if(reagents.get_reagent_amount("epinephrine")>=5) - mutation_chance = max(mutation_chance - 5,0) //Prevents mutation chance going <0% - reagents.remove_reagent("epinephrine", 5) - updatehealth("handle chemicals in body") - - return //TODO: DEFERRED - -/mob/living/carbon/slime/handle_regular_status_updates() - - if(is_adult) - health = 200 - (getOxyLoss() + getToxLoss() + getFireLoss() + getBruteLoss() + getCloneLoss()) - else - health = 150 - (getOxyLoss() + getToxLoss() + getFireLoss() + getBruteLoss() + getCloneLoss()) - - if(health < HEALTH_THRESHOLD_DEAD && check_death_method() && stat != DEAD) - death() - return - - else if(src.health <= HEALTH_THRESHOLD_CRIT && check_death_method()) - - if(!src.reagents.has_reagent("epinephrine")) - src.adjustOxyLoss(10) - - if(src.stat != DEAD) - src.stat = UNCONSCIOUS - - if(prob(30)) //I think this is meant to allow slimes to starve to death - adjustOxyLoss(-1) - adjustToxLoss(-1) - adjustFireLoss(-1) - adjustCloneLoss(-1) - adjustBruteLoss(-1) - - if(src.stat == DEAD) - src.lying = 1 - else - if(src.paralysis || src.stunned || src.weakened || (status_flags && FAKEDEATH)) //Stunned etc. - if(src.stunned > 0) - AdjustStunned(-1) - src.stat = 0 - if(src.weakened > 0) - AdjustWeakened(-1) - src.lying = 0 - src.stat = 0 - if(src.paralysis > 0) - AdjustParalysis(-1) - src.lying = 0 - src.stat = 0 - - else - src.lying = 0 - src.stat = 0 - - if(src.stuttering) src.stuttering = 0 - - if(src.eye_blind) - src.SetEyeBlind(0) - - src.density = !( src.lying ) - - if(src.eye_blurry > 0) - SetEyeBlurry(0) - - if(src.druggy > 0) - SetDruggy(0) - - return 1 - -/mob/living/carbon/slime/proc/handle_nutrition() - - if(docile) //God as my witness, I will never go hungry again - nutrition = 700 - return - - if(prob(15)) - nutrition -= 1 + is_adult - - if(nutrition <= 0) - nutrition = 0 - if(prob(75)) - adjustToxLoss(rand(0,5)) - - else if(nutrition >= get_grow_nutrition() && amount_grown < 10) - nutrition -= 20 - amount_grown++ - update_action_buttons_icon() - - if(amount_grown >= 10 && !Victim && !Target && !ckey) - if(is_adult) - Reproduce() - else - Evolve() - -/mob/living/carbon/slime/proc/add_nutrition(nutrition_to_add = 0, lastnut = 0) - nutrition = min((nutrition + nutrition_to_add), get_max_nutrition()) - if(nutrition >= (lastnut + 50)) - if(prob(80)) - lastnut = nutrition - powerlevel++ - if(powerlevel > 10) - powerlevel = 10 - adjustToxLoss(-10) - -/mob/living/carbon/slime/proc/handle_targets() - if(Tempstun) - if(!Victim) // not while they're eating! - canmove = 0 - else - canmove = 1 - - if(attacked > 50) attacked = 50 - - if(attacked > 0) - attacked-- - - if(Discipline > 0) - - if(Discipline >= 5 && rabid) - if(prob(60)) rabid = 0 - - if(prob(10)) - Discipline-- - - if(!client) - if(!canmove) return - - if(Victim) return // if it's eating someone already, continue eating! - - if(Target) - --target_patience - if(target_patience <= 0 || SStun || Discipline || attacked || docile) // Tired of chasing or something draws out attention - target_patience = 0 - Target = null - - if(AIproc && SStun) return - - var/hungry = 0 // determines if the slime is hungry - - if(nutrition < get_starve_nutrition()) - hungry = 2 - else if(nutrition < get_grow_nutrition() && prob(25) || nutrition < get_hunger_nutrition()) - hungry = 1 - - if(hungry == 2 && !client) // if a slime is starving, it starts losing its friends - if(Friends.len > 0 && prob(1)) - var/mob/nofriend = pick(Friends) - --Friends[nofriend] - - if(!Target) - if(will_hunt() && hungry || attacked || rabid) // Only add to the list if we need to - var/list/targets = list() - - for(var/mob/living/L in view(7,src)) - - if(isslime(L) || L.stat == DEAD) // Ignore other slimes and dead mobs - continue - - if(L in Friends) // No eating friends! - continue - - if(issilicon(L) && (rabid || attacked)) // They can't eat silicons, but they can glomp them in defence - targets += L // Possible target found! - - if(istype(L, /mob/living/carbon/human)) //Ignore slime(wo)men - var/mob/living/carbon/human/H = L - if(isslimeperson(H)) - continue - - if(!L.canmove) // Only one slime can latch on at a time. - var/notarget = 0 - for(var/mob/living/carbon/slime/M in view(1,L)) - if(M.Victim == L) - notarget = 1 - if(notarget) - continue - - targets += L // Possible target found! - - if(targets.len > 0) - if(attacked || rabid || hungry == 2) - Target = targets[1] // I am attacked and am fighting back or so hungry I don't even care - else - for(var/mob/living/carbon/C in targets) - if(!Discipline && prob(5)) - if(ishuman(C) || isalienadult(C)) - Target = C - break - - if(islarva(C) || issmall(C)) - Target = C - break - - if(Target) - target_patience = rand(5,7) - if(is_adult) - target_patience += 3 - - if(!Target) // If we have no target, we are wandering or following orders - if(Leader) - if(holding_still) - holding_still = max(holding_still - 1, 0) - else if(canmove && isturf(loc)) - step_to(src, Leader) - - else if(hungry) - if(holding_still) - holding_still = max(holding_still - hungry, 0) - else if(canmove && isturf(loc) && prob(50)) - step(src, pick(cardinal)) - - else - if(holding_still) - holding_still = max(holding_still - 1, 0) - else if(docile && pulledby) - holding_still = 10 - else if(canmove && isturf(loc) && prob(33)) - step(src, pick(cardinal)) - else if(!AIproc) - spawn() - AIprocess() - -/mob/living/carbon/slime/proc/handle_speech_and_mood() - //Mood starts here - var/newmood = "" - if(rabid || attacked) - newmood = "angry" - else if(docile) - newmood = ":3" - else if(Target) - newmood = "mischevous" - - if(!newmood) - if(Discipline && prob(25)) - newmood = "pout" - else if(prob(1)) - newmood = pick("sad", ":3", "pout") - - if((mood == "sad" || mood == ":3" || mood == "pout") && !newmood) - if(prob(75)) newmood = mood - - if(newmood != mood) // This is so we don't redraw them every time - mood = newmood - regenerate_icons() - - //Speech understanding starts here - var/to_say - if(speech_buffer.len > 0) - var/who = speech_buffer[1] // Who said it? - var/phrase = speech_buffer[2] // What did they say? - if((findtext(phrase, num2text(number)) || findtext(phrase, "slimes"))) // Talking to us - if(findtext(phrase, "hello") || findtext(phrase, "hi")) - to_say = pick("Hello...", "Hi...") - else if(findtext(phrase, "follow")) - if(Leader) - if(Leader == who) // Already following him - to_say = pick("Yes...", "Lead...", "Following...") - else if(Friends[who] > Friends[Leader]) // VIVA - Leader = who - to_say = "Yes... I follow [who]..." - else - to_say = "No... I follow [Leader]..." - else - if(Friends[who] > 2) - Leader = who - to_say = "I follow..." - else // Not friendly enough - to_say = pick("No...", "I won't follow...") - else if(findtext(phrase, "stop")) - if(Victim) // We are asked to stop feeding - if(Friends[who] > 4) - Victim = null - Target = null - if(Friends[who] < 7) - --Friends[who] - to_say = "Grrr..." // I'm angry but I do it - else - to_say = "Fine..." - else if(Target) // We are asked to stop chasing - if(Friends[who] > 3) - Target = null - if(Friends[who] < 6) - --Friends[who] - to_say = "Grrr..." // I'm angry but I do it - else - to_say = "Fine..." - else if(Leader) // We are asked to stop following - if(Leader == who) - to_say = "Yes... I'll stay..." - Leader = null - else - if(Friends[who] > Friends[Leader]) - Leader = null - to_say = "Yes... I'll stop..." - else - to_say = "No... I'll keep following..." - else if(findtext(phrase, "stay")) - if(Leader) - if(Leader == who) - holding_still = Friends[who] * 10 - to_say = "Yes... Staying..." - else if(Friends[who] > Friends[Leader]) - holding_still = (Friends[who] - Friends[Leader]) * 10 - to_say = "Yes... Staying..." - else - to_say = "No... I'll keep following..." - else - if(Friends[who] > 2) - holding_still = Friends[who] * 10 - to_say = "Yes... Staying..." - else - to_say = "No... I won't stay..." - speech_buffer = list() - - //Speech starts here - if(to_say) - say (to_say) - else if(prob(1)) - emote(pick("bounce","sway","light","vibrate","jiggle")) - else - var/t = 10 - var/slimes_near = -1 // Don't count myself - var/dead_slimes = 0 - var/friends_near = list() - for(var/mob/living/carbon/M in view(7,src)) - if(isslime(M)) - ++slimes_near - if(M.stat == DEAD) - ++dead_slimes - if(M in Friends) - t += 20 - friends_near += M - if(nutrition < get_hunger_nutrition()) t += 10 - if(nutrition < get_starve_nutrition()) t += 10 - if(prob(2) && prob(t)) - var/phrases = list() - if(Target) phrases += "[Target]... looks tasty..." - if(nutrition < get_starve_nutrition()) - phrases += "So... hungry..." - phrases += "Very... hungry..." - phrases += "Need... food..." - phrases += "Must... eat..." - else if(nutrition < get_hunger_nutrition()) - phrases += "Hungry..." - phrases += "Where is the food?" - phrases += "I want to eat..." - phrases += "Rawr..." - phrases += "Blop..." - phrases += "Blorble..." - if(rabid || attacked) - phrases += "Hrr..." - phrases += "Nhuu..." - phrases += "Unn..." - if(mood == ":3") - phrases += "Purr..." - if(attacked) - phrases += "Grrr..." - if(getToxLoss() > 30) - phrases += "Cold..." - if(getToxLoss() > 60) - phrases += "So... cold..." - phrases += "Very... cold..." - if(getToxLoss() > 90) - phrases += "..." - phrases += "C... c..." - if(Victim) - phrases += "Nom..." - phrases += "Tasty..." - if(powerlevel > 3) phrases += "Bzzz..." - if(powerlevel > 5) phrases += "Zap..." - if(powerlevel > 8) phrases += "Zap... Bzz..." - if(mood == "sad") phrases += "Bored..." - if(slimes_near) phrases += "Brother..." - if(slimes_near > 1) phrases += "Brothers..." - if(dead_slimes) phrases += "What happened?" - if(!slimes_near) - phrases += "Lonely..." - for(var/M in friends_near) - phrases += "[M]... friend..." - if(nutrition < get_hunger_nutrition()) - phrases += "[M]... feed me..." - say (pick(phrases)) - -/mob/living/carbon/slime/proc/get_max_nutrition() // Can't go above it - if(is_adult) return 1200 - else return 1000 - -/mob/living/carbon/slime/proc/get_grow_nutrition() // Above it we grow, below it we can eat - if(is_adult) return 1000 - else return 800 - -/mob/living/carbon/slime/proc/get_hunger_nutrition() // Below it we will always eat - if(is_adult) return 600 - else return 500 - -/mob/living/carbon/slime/proc/get_starve_nutrition() // Below it we will eat before everything else - if(is_adult) return 300 - else return 200 - -/mob/living/carbon/slime/proc/will_hunt(hunger = -1) // Check for being stopped from feeding and chasing - if(docile) - return 0 - if(hunger == 2 || rabid || attacked) - return 1 - if(Leader) - return 0 - if(holding_still) - return 0 - return 1 diff --git a/code/modules/mob/living/carbon/slime/powers.dm b/code/modules/mob/living/carbon/slime/powers.dm deleted file mode 100644 index 40f9060ee63..00000000000 --- a/code/modules/mob/living/carbon/slime/powers.dm +++ /dev/null @@ -1,233 +0,0 @@ -/mob/living/carbon/slime/verb/Feed() - set category = "Slime" - set desc = "This will let you feed on any valid creature in the surrounding area. This should also be used to halt the feeding process." - if(Victim) - Feedstop() - return 0 - - if(docile) - to_chat(src, "I'm not hungry anymore...") - return 0 - - if(stat) - to_chat(src, "I must be conscious to do this...") - return 0 - - var/list/choices = list() - for(var/mob/living/C in view(1,src)) - if(C!=src && !istype(C,/mob/living/carbon/slime) && Adjacent(C)) - choices += C - - var/mob/living/M = input(src,"Who do you wish to feed on?") in null|choices - if(!M) - return 0 - if(Adjacent(M)) - if(isbrain(M)) - to_chat(src, "This subject does not have an edible life energy...") - return 0 - - if(iscarbon(M) && (M.health < -70)) - to_chat(src, "This subject does not have a strong enough life energy...") - return 0 - - if(isanimal(M) && (M.health < 1))//animals don't go into crit, stupid; fixes infinite energy exploit - to_chat(src, "This subject does not have a strong enough life energy...") - return 0 - - for(var/mob/living/carbon/slime/met in view()) - if(met.Victim == M && met != src) - to_chat(src, "The [met.name] is already feeding on this subject...") - return 0 - - to_chat(src, "I have latched onto the subject and begun feeding...") - to_chat(M, "The [name] has latched onto your head!") - - Feedon(M) - return 1 - -/mob/living/carbon/slime/proc/Feedon(var/mob/living/M) - Victim = M - forceMove(M.loc) - canmove = 0 - anchored = 1 - var/lastnut = nutrition - var/fed_succesfully = 0 - var/health_minimum = -70 - if(is_adult) - icon_state = "[colour] adult slime eat" - else - icon_state = "[colour] baby slime eat" - - if(isanimal(Victim)) - health_minimum = 0 - while(Victim && Victim.health > health_minimum && stat != DEAD) - canmove = 0 - - if(Adjacent(Victim)) - forceMove(M.loc) - - if(iscarbon(Victim)) - Victim.adjustCloneLoss(rand(5,6)) - Victim.adjustToxLoss(rand(1,2)) - if(Victim.health <= 0) - Victim.adjustToxLoss(rand(2,4)) - - if(prob(15) && Victim.client) - to_chat(Victim, "[pick("You can feel your body becoming weak!", \ - "You feel like you're about to die!", \ - "You feel every part of your body screaming in agony!", \ - "A low, rolling pain passes through your body!", \ - "Your body feels as if it's falling apart!", \ - "You feel extremely weak!", \ - "A sharp, deep pain bathes every inch of your body!")]") - - fed_succesfully = 1 - - else if(health_minimum == 0) //we already know it's a simple_animal from above - Victim.adjustBruteLoss(is_adult ? rand(7, 15) : rand(4, 12)) - fed_succesfully = 1 - - else - to_chat(src, "[pick("This subject is incompatable", \ - "This subject does not have a life energy", "This subject is empty", \ - "I am not satisified", "I can not feed from this subject", \ - "I do not feel nourished", "This subject is not food")]...") - - if(fed_succesfully) - add_nutrition(rand(15,30), lastnut) - - //Heal yourself. - adjustOxyLoss(-10) - adjustBruteLoss(-10) - adjustFireLoss(-10) - adjustCloneLoss(-10) - - updatehealth("slime feeding") - if(Victim) - Victim.updatehealth("slime feeding") - - sleep(rand(15,45)) - - else - break - - if(stat == 2) - if(!is_adult) - icon_state = "[colour] baby slime dead" - - else - if(is_adult) - icon_state = "[colour] adult slime" - else - icon_state = "[colour] baby slime" - - canmove = 1 - anchored = 0 - - if(M) - if(M.health <= health_minimum) - M.canmove = 0 - if(!client) - if(Victim && !rabid && !attacked) - if(Victim.LAssailant && Victim.LAssailant != Victim) - if(prob(50)) - if(!(Victim.LAssailant in Friends)) - Friends[Victim.LAssailant] = 1 - //Friends.Add(Victim.LAssailant) // no idea why i was using the |= operator - else - ++Friends[Victim.LAssailant] - - - if(M.client && istype(src, /mob/living/carbon/human)) - if(prob(85)) - rabid = 1 // UUUNNBGHHHH GONNA EAT JUUUUUU - - if(client) - to_chat(src, "This subject does not have a strong enough life energy anymore...") - else - M.canmove = 1 - if(client) - to_chat(src, "I have stopped feeding...") - else - if(client) - to_chat(src, "I have stopped feeding...") - - Victim = null - -/mob/living/carbon/slime/proc/Feedstop() - if(Victim) - if(Victim.client) - to_chat(Victim, "[src] has let go of your head!") - Victim = null - -/mob/living/carbon/slime/proc/UpdateFeed(var/mob/M) - if(Victim) - if(Victim == M) - forceMove(M.loc) // simple "attach to head" effect! - - -/mob/living/carbon/slime/verb/Evolve() - set category = "Slime" - set desc = "This will let you evolve from baby to adult slime." - - if(stat) - to_chat(src, "I must be conscious to do this...") - return - if(!is_adult) - if(amount_grown >= 10) - is_adult = 1 - maxHealth = 200 - amount_grown = 0 - regenerate_icons() - name = text("[colour] [is_adult ? "adult" : "baby"] slime ([number])") - else - to_chat(src, "I am not ready to evolve yet...") - else - to_chat(src, "I have already evolved...") - -/mob/living/carbon/slime/verb/Reproduce() - set category = "Slime" - set desc = "This will make you split into four Slimes." - - if(stat) - to_chat(src, "I must be conscious to do this...") - return - - if(is_adult) - if(amount_grown >= 10) - if(stat) - to_chat(src, "I must be conscious to do this...") - return - - var/list/babies = list() - var/new_nutrition = round(nutrition * 0.9) - var/new_powerlevel = round(powerlevel / 4) - for(var/i=1,i<=4,i++) - var/mob/living/carbon/slime/M = new /mob/living/carbon/slime/(loc) - if(mutation_chance >= 100) - M.colour = "rainbow" - else if(prob(mutation_chance)) - M.colour = slime_mutation[rand(1,4)] - else - M.colour = colour - if(ckey) - M.nutrition = new_nutrition //Player slimes are more robust at spliting. Once an oversight of poor copypasta, now a feature! - M.powerlevel = new_powerlevel - if(i != 1) - step_away(M,src) - M.Friends = Friends.Copy() - babies += M - M.mutation_chance = Clamp(mutation_chance+(rand(5,-5)),0,100) - feedback_add_details("slime_babies_born","slimebirth_[replacetext(M.colour," ","_")]") - - var/mob/living/carbon/slime/new_slime = pick(babies) - new_slime.universal_speak = universal_speak - if(src.mind) - src.mind.transfer_to(new_slime) - else - new_slime.key = src.key - qdel(src) - else - to_chat(src, "I am not ready to reproduce yet...") - else - to_chat(src, "I am not old enough to reproduce yet...") diff --git a/code/modules/mob/living/carbon/slime/say.dm b/code/modules/mob/living/carbon/slime/say.dm deleted file mode 100644 index 2096da01360..00000000000 --- a/code/modules/mob/living/carbon/slime/say.dm +++ /dev/null @@ -1,29 +0,0 @@ -/mob/living/carbon/slime/say_quote(var/text, var/datum/language/speaking) - var/verb = "telepathically chirps" - var/ending = copytext(text, length(text)) - - if(ending == "?") - verb = "telepathically asks" - else if(ending == "!") - verb = "telepathically cries" - - return verb - -/mob/living/carbon/slime/say_understands(var/other) - if(istype(other, /mob/living/carbon/slime)) - return 1 - return ..() - -/mob/living/carbon/slime/hear_say(list/message_pieces, var/verb = "says", var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol) - if(speaker in Friends) - speech_buffer = list() - speech_buffer.Add(speaker) - speech_buffer.Add(lowertext(html_decode(multilingual_to_message(message_pieces)))) - ..() - -/mob/living/carbon/slime/hear_radio(list/message_pieces, var/verb="says", var/part_a, var/part_b, var/mob/speaker = null, var/hard_to_hear = 0, var/vname ="", var/atom/follow_target) - if(speaker in Friends) - speech_buffer = list() - speech_buffer.Add(speaker) - speech_buffer.Add(lowertext(html_decode(multilingual_to_message(message_pieces)))) - ..() diff --git a/code/modules/mob/living/carbon/slime/slime.dm b/code/modules/mob/living/carbon/slime/slime.dm deleted file mode 100644 index afd358ab99f..00000000000 --- a/code/modules/mob/living/carbon/slime/slime.dm +++ /dev/null @@ -1,546 +0,0 @@ -/mob/living/carbon/slime - name = "baby slime" - icon = 'icons/mob/slimes.dmi' - icon_state = "grey baby slime" - pass_flags = PASSTABLE - ventcrawler = 2 - speak_emote = list("telepathically chirps") - layer = 5 - maxHealth = 150 - health = 150 - gender = NEUTER - nutrition = 700 - see_in_dark = 8 - update_slimes = 0 - faction = list("slime","neutral") - // canstun and canweaken don't affect slimes because they ignore stun and weakened variables - // for the sake of cleanliness, though, here they are. - status_flags = CANPARALYSE|CANPUSH - - var/cores = 1 // the number of /obj/item/slime_extract's the slime has left inside - var/mutation_chance = 30 // Chance of mutating, should be between 25 and 35 - - var/powerlevel = 0 // 1-10 controls how much electricity they are generating - var/amount_grown = 0 // controls how long the slime has been overfed, if 10, grows or reproduces - - var/number = 0 // Used to understand when someone is talking to it - - var/mob/living/Victim = null // the person the slime is currently feeding on - var/mob/living/Target = null // AI variable - tells the slime to hunt this down - var/mob/living/Leader = null // AI variable - tells the slime to follow this person - - var/attacked = 0 // Determines if it's been attacked recently. Can be any number, is a cooloff-ish variable - var/rabid = 0 // If set to 1, the slime will attack and eat anything it comes in contact with - var/holding_still = 0 // AI variable, cooloff-ish for how long it's going to stay in one place - var/target_patience = 0 // AI variable, cooloff-ish for how long it's going to follow its target - - var/list/Friends = list() // A list of friends; they are not considered targets for feeding; passed down after splitting - - var/list/speech_buffer = list() // Last phrase said near it and person who said it - - var/mood = "" // To show its face - var/is_adult = 0 - var/docile = 0 - var/core_removal_stage = 0 //For removing cores. - var/mutator_used = FALSE //So you can't shove a dozen mutators into a single slime - - ///////////TIME FOR SUBSPECIES - - var/colour = "grey" - var/coretype = /obj/item/slime_extract/grey - var/list/slime_mutation[4] - -/mob/living/carbon/slime/New() - create_reagents(100) - spawn (0) - number = rand(1, 1000) - name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])" - icon_state = "[colour] [is_adult ? "adult" : "baby"] slime" - real_name = name - slime_mutation = mutation_table(colour) - var/sanitizedcolour = replacetext(colour, " ", "") - coretype = text2path("/obj/item/slime_extract/[sanitizedcolour]") - ..() - -/mob/living/carbon/slime/random/New() - colour = pick("grey","orange", "metal", "blue", "purple", "dark purple", "dark blue", "green", "silver", "yellow", "gold", "yellow", "red", "silver", "pink", "cerulean", "sepia", "bluespace", "pyrite", "light pink", "oil", "adamantine", "black") - ..() - -/mob/living/carbon/slime/Destroy() - for(var/obj/machinery/computer/camera_advanced/xenobio/X in GLOB.machines) - if(src in X.stored_slimes) - X.stored_slimes -= src - return ..() - -/mob/living/carbon/slime/can_unbuckle() - return FALSE - -/mob/living/carbon/slime/can_buckle() - return FALSE - -/mob/living/carbon/slime/get_mob_buckling_height(mob/seat) - if(..()) - return 3 - -/mob/living/carbon/slime/regenerate_icons() - icon_state = "[colour] [is_adult ? "adult" : "baby"] slime" - overlays.len = 0 - if(mood) - overlays += image('icons/mob/slimes.dmi', icon_state = "aslime-[mood]") - ..() - -/mob/living/carbon/slime/movement_delay() - if(bodytemperature >= 330.23) // 135 F - return -1 // slimes become supercharged at high temperatures - - . = ..() - - var/health_deficiency = (100 - health) - if(health_deficiency >= 45) - . += (health_deficiency / 25) - - if(bodytemperature < 183.222) - . += (283.222 - bodytemperature) / 10 * 1.75 - - if(reagents) - if(reagents.has_reagent("methamphetamine")) // Meth slows slimes down - . *= 2 - - if(reagents.has_reagent("frostoil")) // Frostoil also makes them move VEEERRYYYYY slow - . *= 5 - - if(health <= 0) // if damaged, the slime moves twice as slow - . *= 2 - - . += config.slime_delay - -/mob/living/carbon/slime/ObjBump(obj/O) - if(!client && powerlevel > 0) - var/chance = 10 - switch(powerlevel) - if(1 to 2) chance = 20 - if(3 to 4) chance = 30 - if(5 to 6) chance = 40 - if(7 to 8) chance = 60 - if(9) chance = 70 - if(10) chance = 95 - if(prob(chance)) - if(istype(O, /obj/structure/window) || istype(O, /obj/structure/grille)) - if(nutrition <= get_hunger_nutrition() && !Atkcool) - if(is_adult || prob(5)) - O.attack_slime(src) - Atkcool = 1 - spawn(45) - Atkcool = 0 - -/mob/living/carbon/slime/Process_Spacemove(var/movement_dir = 0) - return 2 - -/mob/living/carbon/slime/Stat() - ..() - - statpanel("Status") - if(is_adult) - stat(null, "Health: [round((health / 200) * 100)]%") - else - stat(null, "Health: [round((health / 150) * 100)]%") - - if(client.statpanel == "Status") - if(!docile) - stat(null, "Nutrition: [nutrition]/[get_max_nutrition()]") - if(amount_grown >= 10) - if(is_adult) - stat(null, "You can reproduce!") - else - stat(null, "You can evolve!") - - stat(null,"Power Level: [powerlevel]") - -/mob/living/carbon/slime/updatehealth(reason) - . = ..() - update_health_hud() - -/mob/living/carbon/slime/proc/update_health_hud() - if(hud_used) - var/severity = 0 - var/healthpercent = (health/maxHealth) * 100 - if(stat != DEAD) - switch(healthpercent) - if(100 to INFINITY) - healths.icon_state = "slime_health0" - if(80 to 100) - healths.icon_state = "slime_health1" - severity = 1 - if(60 to 80) - healths.icon_state = "slime_health2" - severity = 2 - if(40 to 60) - healths.icon_state = "slime_health3" - severity = 3 - if(20 to 40) - healths.icon_state = "slime_health4" - severity = 4 - if(0 to 20) - healths.icon_state = "slime_health5" - severity = 5 - if(-199 to 0) - healths.icon_state = "slime_health6" - severity = 6 - else - healths.icon_state = "slime_health7" - severity = 6 - if(severity > 0) - overlay_fullscreen("brute", /obj/screen/fullscreen/brute, severity) - else - clear_fullscreen("brute") - -/mob/living/carbon/slime/adjustFireLoss(amount) - ..(-abs(amount)) // Heals them - return - -/mob/living/carbon/slime/bullet_act(var/obj/item/projectile/Proj) - attacked += 10 - ..(Proj) - return 0 - -/mob/living/carbon/slime/emp_act(severity) - powerlevel = 0 // oh no, the power! - ..() - -/mob/living/carbon/slime/ex_act(severity) - ..() - - var/b_loss = null - var/f_loss = null - switch(severity) - if(1.0) - qdel(src) - return - - if(2.0) - - b_loss += 60 - f_loss += 60 - - - if(3.0) - b_loss += 30 - - adjustBruteLoss(b_loss) - adjustFireLoss(f_loss) - - updatehealth() - - -/mob/living/carbon/slime/blob_act() - show_message(" The blob attacks you!") - adjustBruteLoss(20) - updatehealth() - return - -/mob/living/carbon/slime/MouseDrop(atom/movable/A) - if(isliving(A) && A != src && usr == src) - var/mob/living/Food = A - if(Food.Adjacent(src) && !stat && Food.stat != DEAD) //messy - Feedon(Food) - ..() - -/mob/living/carbon/slime/unEquip(obj/item/W as obj, force) - return - -/mob/living/carbon/slime/attack_ui(slot) - return - -/mob/living/carbon/slime/attack_slime(mob/living/carbon/slime/M) - ..() - if(Victim) - Victim = null - visible_message("[M] pulls [src] off!") - return - attacked += 5 - if(nutrition >= 100) //steal some nutrition. negval handled in life() - nutrition -= (50 + (5 * M.amount_grown)) - M.add_nutrition(50 + (5 * M.amount_grown)) - if(health > 0) - adjustBruteLoss(4 + (2 * M.amount_grown)) //amt_grown isn't very linear but it works - updatehealth() - M.adjustBruteLoss(-4 + (-2 * M.amount_grown)) - M.updatehealth() - -/mob/living/carbon/slime/attack_animal(mob/living/simple_animal/M) - . = ..() - if(.) - var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) - attacked += 10 - adjustBruteLoss(damage) - updatehealth() - -/mob/living/carbon/slime/attack_larva(mob/living/carbon/alien/larva/L) - if(..()) //successful larva bite. - var/damage = rand(1, 3) - if(stat != DEAD) - L.amount_grown = min(L.amount_grown + damage, L.max_grown) - adjustBruteLoss(damage) - updatehealth() - -/mob/living/carbon/slime/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE) - if(user.a_intent == INTENT_HARM) - if(Victim || Target) - Victim = null - Target = null - anchored = 0 - if(prob(80) && !client) - Discipline++ - spawn(0) - step_away(src, user, 15) - sleep(3) - step_away(src, user, 15) - ..(user, TRUE) - playsound(loc, "punch", 25, 1, -1) - visible_message("[user] has punched [src]!", "[user] has punched [src]!") - adjustBruteLoss(15) - return TRUE - -/mob/living/carbon/slime/attack_hand(mob/living/carbon/human/M) - if(Victim) - M.do_attack_animation(src, ATTACK_EFFECT_DISARM) - if(Victim == M) - if(prob(60)) - visible_message("[M] attempts to wrestle \the [name] off!") - playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - - else - visible_message(" [M] manages to wrestle \the [name] off!") - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - - if(prob(90) && !client) - Discipline++ - - SStun = 1 - spawn(rand(45,60)) - SStun = 0 - - Victim = null - anchored = 0 - step_away(src,M) - - return - - else - if(prob(30)) - visible_message("[M] attempts to wrestle \the [name] off of [Victim]!") - playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - - else - visible_message(" [M] manages to wrestle \the [name] off of [Victim]!") - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - - if(prob(80) && !client) - Discipline++ - - if(!is_adult) - if(Discipline == 1) - attacked = 0 - - SStun = 1 - spawn(rand(55,65)) - SStun = 0 - - Victim = null - anchored = 0 - step_away(src,M) - - return - - if(..()) //To allow surgery to return properly. - return - - switch(M.a_intent) - - if(INTENT_HELP) - help_shake_act(M) - - if(INTENT_GRAB) - grabbedby(M) - - else - M.do_attack_animation(src, ATTACK_EFFECT_PUNCH) - var/damage = rand(1, 9) - attacked += 10 - if(prob(90)) - playsound(loc, "punch", 25, 1, -1) - add_attack_logs(M, src, "Melee attacked with fists") - visible_message("[M] has punched [src]!", \ - "[M] has punched [src]!") - if(stat != DEAD) - adjustBruteLoss(damage) - updatehealth() - else - playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - visible_message("[M] has attempted to punch [src]!") - return - -/mob/living/carbon/slime/attack_alien(mob/living/carbon/alien/humanoid/M) - if(..()) //if harm or disarm intent. - if(M.a_intent == INTENT_HARM) - if(prob(95)) - attacked += 10 - playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1) - var/damage = rand(15, 30) - if(damage >= 25) - damage = rand(20, 40) - visible_message("[M] has slashed [name]!", \ - "[M] has slashed [name]!") - else - visible_message("[M] has wounded [name]!", \ - ")[M] has wounded [name]!") - add_attack_logs(M, src, "Alien attacked") - if(stat != DEAD) - adjustBruteLoss(damage) - updatehealth() - else - playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1) - visible_message("[M] has attempted to lunge at [name]!", \ - "[M] has attempted to lunge at [name]!") - - if(M.a_intent == INTENT_DISARM) - playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1) - var/damage = 5 - attacked += 10 - - if(prob(95)) - visible_message("[M] has tackled [name]!", \ - "[M] has tackled [name]!") - - if(Victim || Target) - Victim = null - Target = null - anchored = 0 - if(prob(80) && !client) - Discipline++ - if(!isslime(src)) - if(Discipline == 1) - attacked = 0 - - SStun = 1 - spawn(rand(5,20)) - SStun = 0 - - spawn(0) - - step_away(src,M,15) - sleep(3) - step_away(src,M,15) - - else - drop_item() - visible_message("[M] has disarmed [name]!", - "[M] has disarmed [name]!") - add_attack_logs(M, src, "Alien disarmed") - adjustBruteLoss(damage) - updatehealth() - return - -/mob/living/carbon/slime/attackby(obj/item/W, mob/living/user, params) - if(istype(W,/obj/item/stack/sheet/mineral/plasma)) //Lets you feed slimes plasma. - if(user in Friends) - ++Friends[user] - else - Friends[user] = 1 - to_chat(user, "You feed the slime the plasma. It chirps happily.") - var/obj/item/stack/sheet/mineral/plasma/S = W - S.use(1) - return - else if(W.force > 0) - attacked += 10 - if(prob(25)) - user.do_attack_animation(src) - to_chat(user, "[W] passes right through [src]!") - return - if(Discipline && prob(50)) // wow, buddy, why am I getting attacked?? - Discipline = 0 - else if(W.force >= 3) - if(is_adult) - if(prob(5 + round(W.force/2))) - if(Victim || Target) - if(prob(80) && !client) - Discipline++ - - Victim = null - Target = null - anchored = 0 - - SStun = 1 - spawn(rand(5,20)) - SStun = 0 - - spawn(0) - if(user) - canmove = 0 - step_away(src, user) - if(prob(25 + W.force)) - sleep(2) - if(user) - step_away(src, user) - canmove = 1 - - else - if(prob(10 + W.force*2)) - if(Victim || Target) - if(prob(80) && !client) - Discipline++ - if(Discipline == 1) - attacked = 0 - SStun = 1 - spawn(rand(5,20)) - SStun = 0 - - Victim = null - Target = null - anchored = 0 - - spawn(0) - if(user) - canmove = 0 - step_away(src, user) - if(prob(25 + W.force*4)) - sleep(2) - if(user) - step_away(src, user) - canmove = 1 - ..() - -/mob/living/carbon/slime/restrained() - return 0 - -mob/living/carbon/slime/var/temperature_resistance = T0C+75 - -/mob/living/carbon/slime/show_inv(mob/user) - return - -/mob/living/carbon/slime/toggle_throw_mode() - return - -/mob/living/carbon/slime/water_act(volume, temperature, source, method = TOUCH) - . = ..() - - var/water_damage = rand(10, 15) * volume - adjustToxLoss(water_damage) - - if(!client && Target && volume >= 3) - Target = null - ++Discipline - -/mob/living/carbon/slime/can_use_vents() - if(Victim) - return "You cannot ventcrawl while feeding." - ..() - -/mob/living/carbon/slime/forceFed(var/obj/item/reagent_containers/food/toEat, mob/user, fullness) - if(istype(toEat, /obj/item/reagent_containers/food/drinks)) - return 1 - to_chat(user, "This creature does not seem to have a mouth!") - return 0 - -/mob/living/carbon/slime/can_hear() - . = TRUE //honestly fuck slimes and organ bullshit \ No newline at end of file diff --git a/code/modules/mob/living/carbon/slime/update_icons.dm b/code/modules/mob/living/carbon/slime/update_icons.dm deleted file mode 100644 index 2310f32a76e..00000000000 --- a/code/modules/mob/living/carbon/slime/update_icons.dm +++ /dev/null @@ -1 +0,0 @@ -//no special icon processing diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index ea3db60383d..3d3fb2b3d49 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -541,10 +541,6 @@ if(s_active && !(s_active in contents) && get_turf(s_active) != get_turf(src)) //check !( s_active in contents ) first so we hopefully don't have to call get_turf() so much. s_active.close(src) - if(update_slimes) - for(var/mob/living/carbon/slime/M in view(1,src)) - M.UpdateFeed(src) - /mob/living/proc/handle_footstep(turf/T) if(istype(T)) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index e9cfac7ae0a..ce758f0e856 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -277,33 +277,21 @@ return G -/mob/living/attack_slime(mob/living/carbon/slime/M) +/mob/living/attack_slime(mob/living/simple_animal/slime/M) if(!SSticker) to_chat(M, "You cannot attack people before the game has started.") return - if(M.Victim) + if(M.buckled) + if(M in buckled_mobs) + M.Feedstop() return // can't attack while eating! if(stat != DEAD) + add_attack_logs(src, M, "Slime'd") M.do_attack_animation(src) - visible_message("The [M.name] glomps [src]!", \ - "The [M.name] glomps [src]!") - - if(M.powerlevel > 0) - var/stunprob = M.powerlevel * 7 + 10 // 17 at level 1, 80 at level 10 - if(prob(stunprob)) - M.powerlevel -= 3 - if(M.powerlevel < 0) - M.powerlevel = 0 - - visible_message("The [M.name] has shocked [src]!", \ - "The [M.name] has shocked [src]!") - - do_sparks(5, 1, src) - return 1 - add_attack_logs(src, M, "Slime'd") - return + visible_message("\The [M.name] glomps [src]!", "\The [M.name] glomps you!") + return TRUE /mob/living/attack_animal(mob/living/simple_animal/M) M.face_atom(src) diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 1e3343f90f7..5bc42caab14 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -28,7 +28,6 @@ var/on_fire = 0 //The "Are we on fire?" var var/fire_stacks = 0 //Tracks how many stacks of fire we have on, max is usually 20 - var/update_slimes = 1 var/implanting = 0 //Used for the mind-slave implant var/floating = 0 var/mob_size = MOB_SIZE_HUMAN diff --git a/code/modules/mob/living/silicon/ai/ai_defense.dm b/code/modules/mob/living/silicon/ai/ai_defense.dm index c8ffebc6647..702b745e4fc 100644 --- a/code/modules/mob/living/silicon/ai/ai_defense.dm +++ b/code/modules/mob/living/silicon/ai/ai_defense.dm @@ -4,5 +4,5 @@ return ..() -/mob/living/silicon/ai/attack_slime(mob/living/carbon/slime/user) +/mob/living/silicon/ai/attack_slime(mob/living/simple_animal/slime/user) return //immune to slimes diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm index 85cc2ad5786..9b4f1089f46 100644 --- a/code/modules/mob/living/silicon/robot/robot_defense.dm +++ b/code/modules/mob/living/silicon/robot/robot_defense.dm @@ -19,7 +19,7 @@ ..() return -/mob/living/silicon/robot/attack_slime(mob/living/carbon/slime/M) +/mob/living/silicon/robot/attack_slime(mob/living/simple_animal/slime/M) if(..()) //successful slime shock flash_eyes(affect_silicon = 1) var/stunprob = M.powerlevel * 7 + 10 diff --git a/code/modules/mob/living/simple_animal/animal_defense.dm b/code/modules/mob/living/simple_animal/animal_defense.dm index 119eb1b29c0..d827bf03692 100644 --- a/code/modules/mob/living/simple_animal/animal_defense.dm +++ b/code/modules/mob/living/simple_animal/animal_defense.dm @@ -58,12 +58,12 @@ var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) return attack_threshold_check(damage, M.melee_damage_type) -/mob/living/simple_animal/attack_slime(mob/living/carbon/slime/M) - ..() - var/damage = rand(15, 25) - if(M.is_adult) - damage = rand(20, 35) - attack_threshold_check(damage) +/mob/living/simple_animal/attack_slime(mob/living/simple_animal/slime/M) + if(..()) //successful slime attack + var/damage = rand(15, 25) + if(M.is_adult) + damage = rand(20, 35) + return attack_threshold_check(damage) /mob/living/simple_animal/proc/attack_threshold_check(damage, damagetype = BRUTE, armorcheck = "melee") var/temp_damage = damage diff --git a/code/modules/mob/living/simple_animal/friendly/slime.dm b/code/modules/mob/living/simple_animal/friendly/slime.dm deleted file mode 100644 index ac913170c86..00000000000 --- a/code/modules/mob/living/simple_animal/friendly/slime.dm +++ /dev/null @@ -1,60 +0,0 @@ -/mob/living/simple_animal/slime - name = "pet slime" - desc = "A lovable, domesticated slime." - icon = 'icons/mob/slimes.dmi' - icon_state = "grey baby slime" - icon_living = "grey baby slime" - icon_dead = "grey baby slime dead" - speak_emote = list("chirps") - health = 100 - maxHealth = 100 - response_help = "pets" - response_disarm = "shoos" - response_harm = "stomps on" - emote_see = list("jiggles", "bounces in place") - pass_flags = PASSTABLE - var/colour = "grey" - -/mob/living/simple_animal/slime/adult - health = 200 - maxHealth = 200 - icon_state = "grey adult slime" - icon_living = "grey adult slime" - -/mob/living/simple_animal/slime/New() - ..() - overlays += "aslime-:33" - -/mob/living/simple_animal/slime/updatehealth(reason) - . = ..() - update_health_hud() - -/mob/living/simple_animal/slime/proc/update_health_hud() - if(hud_used) - var/severity = 0 - var/healthpercent = (health/maxHealth) * 100 - switch(healthpercent) - if(100 to INFINITY) - healths.icon_state = "slime_health0" - if(80 to 100) - healths.icon_state = "slime_health1" - severity = 1 - if(60 to 80) - healths.icon_state = "slime_health2" - severity = 2 - if(40 to 60) - healths.icon_state = "slime_health3" - severity = 3 - if(20 to 40) - healths.icon_state = "slime_health4" - severity = 4 - if(1 to 20) - healths.icon_state = "slime_health5" - severity = 5 - else - healths.icon_state = "slime_health7" - severity = 6 - if(severity > 0) - overlay_fullscreen("brute", /obj/screen/fullscreen/brute, severity) - else - clear_fullscreen("brute") diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 2e126412580..502adb937e3 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -605,7 +605,7 @@ real_name = P.tagname /mob/living/simple_animal/regenerate_icons() - cut_overlays() if(pcollar && collar_type) + cut_overlays() add_overlay("[collar_type]collar") add_overlay("[collar_type]tag") \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/slime/death.dm b/code/modules/mob/living/simple_animal/slime/death.dm new file mode 100644 index 00000000000..29a1adbd347 --- /dev/null +++ b/code/modules/mob/living/simple_animal/slime/death.dm @@ -0,0 +1,32 @@ +/mob/living/simple_animal/slime/death(gibbed) + if(stat == DEAD) + return + if(!gibbed) + if(is_adult) + var/mob/living/simple_animal/slime/M = new(loc, colour) + M.rabid = TRUE + M.regenerate_icons() + + is_adult = FALSE + maxHealth = 150 + for(var/datum/action/innate/slime/reproduce/R in actions) + R.Remove(src) + var/datum/action/innate/slime/evolve/E = new + E.Grant(src) + revive() + regenerate_icons() + update_name() + return + + if(buckled) + Feedstop(silent = TRUE) //releases ourselves from the mob we fed on. + + stat = DEAD //Temporarily set to dead for icon updates + regenerate_icons() + stat = CONSCIOUS + + return ..(gibbed) + +/mob/living/simple_animal/slime/gib() + death(TRUE) + qdel(src) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/slime/emote.dm b/code/modules/mob/living/simple_animal/slime/emote.dm similarity index 95% rename from code/modules/mob/living/carbon/slime/emote.dm rename to code/modules/mob/living/simple_animal/slime/emote.dm index c938ac17214..7fc7f4c5f87 100644 --- a/code/modules/mob/living/carbon/slime/emote.dm +++ b/code/modules/mob/living/simple_animal/slime/emote.dm @@ -1,4 +1,7 @@ -/mob/living/carbon/slime/emote(act, m_type = 1, message = null, force) +/mob/living/simple_animal/slime/emote(act, m_type = 1, message = null, force) + if(stat) + return + if(findtext(act, "-", 1, null)) var/t1 = findtext(act, "-", 1, null) //param = copytext(act, t1 + 1, length(act) + 1) @@ -99,6 +102,4 @@ loc.audible_message(message) if(regenerate_icons) - regenerate_icons() - - return \ No newline at end of file + regenerate_icons() \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm new file mode 100644 index 00000000000..efd4c19d55c --- /dev/null +++ b/code/modules/mob/living/simple_animal/slime/life.dm @@ -0,0 +1,617 @@ + +/mob/living/simple_animal/slime + var/AIproc = 0 // determines if the AI loop is activated + var/Atkcool = 0 // attack cooldown + var/Tempstun = 0 // temporary temperature stuns + var/Discipline = 0 // if a slime has been hit with a freeze gun, or wrestled/attacked off a human, they become disciplined and don't attack anymore for a while + var/SStun = 0 // stun variable + + +/mob/living/simple_animal/slime/Life() + set invisibility = 0 + if(notransform) + return + if(..()) + if(buckled) + handle_feeding() + if(!stat) // Slimes in stasis don't lose nutrition, don't change mood and don't respond to speech + handle_nutrition() + if(QDELETED(src)) // Stop if the slime split during handle_nutrition() + return + reagents.remove_all(0.5 * REAGENTS_METABOLISM * reagents.reagent_list.len) //Slimes are such snowflakes + handle_targets() + if(!ckey) + handle_mood() + handle_speech() + +// Unlike most of the simple animals, slimes support UNCONSCIOUS +/mob/living/simple_animal/slime/update_stat() + if(stat == UNCONSCIOUS && health > 0) + return + ..() + +/mob/living/simple_animal/slime/proc/AIprocess() // the master AI process + + if(AIproc || stat || client) + return + + var/hungry = 0 + if (nutrition < get_starve_nutrition()) + hungry = 2 + else if (nutrition < get_grow_nutrition() && prob(25) || nutrition < get_hunger_nutrition()) + hungry = 1 + + AIproc = 1 + + while(AIproc && stat != DEAD && (attacked || hungry || rabid || buckled)) + if(!canmove) //also covers buckling. Not sure why buckled is in the while condition if we're going to immediately break, honestly + break + + if(!Target || client) + break + + if(Target.health <= -70 || Target.stat == DEAD) + Target = null + AIproc = 0 + break + + if(Target) + if(locate(/mob/living/simple_animal/slime) in Target.buckled_mobs) + Target = null + AIproc = 0 + break + if(!AIproc) + break + + if(Target in view(1,src)) + if(!CanFeedon(Target)) //If they're not able to be fed upon, ignore them. + if(!Atkcool) + Atkcool = TRUE + addtimer(VARSET_CALLBACK(src, Atkcool, FALSE), 4.5 SECONDS) + + if(Target.Adjacent(src)) + Target.attack_slime(src) + break + if(!Target.lying && prob(80)) + + if(Target.client && Target.health >= 20) + if(!Atkcool) + Atkcool = TRUE + addtimer(VARSET_CALLBACK(src, Atkcool, FALSE), 4.5 SECONDS) + + if(Target.Adjacent(src)) + Target.attack_slime(src) + + else + if(!Atkcool && Target.Adjacent(src)) + Feedon(Target) + + else + if(!Atkcool && Target.Adjacent(src)) + Feedon(Target) + + else if(Target in view(7, src)) + if(!Target.Adjacent(src)) + // Bug of the month candidate: slimes were attempting to move to target only if it was directly next to them, which caused them to target things, but not approach them + step_to(src, Target) + else + Target = null + AIproc = 0 + break + + var/sleeptime = movement_delay() + if(sleeptime <= 0) + sleeptime = 1 + + sleep(sleeptime + 2) // this is about as fast as a player slime can go + + AIproc = 0 + +/mob/living/simple_animal/slime/handle_environment(datum/gas_mixture/environment) + if(!environment) + return + + var/loc_temp = get_temperature(environment) + + adjust_bodytemperature(adjust_body_temperature(bodytemperature, loc_temp, 1)) + + //Account for massive pressure differences + + if(bodytemperature < (T0C + 5)) // start calculating temperature damage etc + if(bodytemperature <= (T0C - 40)) // stun temperature + Tempstun = 1 + + if(bodytemperature <= (T0C - 50)) // hurt temperature + if(bodytemperature <= 50) // sqrting negative numbers is bad + adjustBruteLoss(200) + else + adjustBruteLoss(round(sqrt(bodytemperature)) * 2) + + else + Tempstun = 0 + + updatehealth("handle environment") + + + return //TODO: DEFERRED + +/mob/living/simple_animal/slime/proc/adjust_body_temperature(current, loc_temp, boost) + var/temperature = current + var/difference = abs(current - loc_temp) //get difference + var/increments// = difference/10 //find how many increments apart they are + if(difference > 50) + increments = difference / 5 + else + increments = difference / 10 + var/change = increments * boost // Get the amount to change by (x per increment) + var/temp_change + if(current < loc_temp) + temperature = min(loc_temp, temperature+change) + else if(current > loc_temp) + temperature = max(loc_temp, temperature-change) + temp_change = (temperature - current) + return temp_change + +/mob/living/simple_animal/slime/handle_status_effects() + ..() + if(prob(30) && !stat) + adjustBruteLoss(-1) + +/mob/living/simple_animal/slime/proc/handle_feeding() + if(!ismob(buckled)) + return + var/mob/M = buckled + + if(stat) + Feedstop(silent = TRUE) + + if(M.stat == DEAD) // our victim died + if(!client) + if(!rabid && !attacked) + if(M.LAssailant && M.LAssailant != M) + if(prob(50)) + if(!(M.LAssailant in Friends)) + Friends[M.LAssailant] = 1 + else + ++Friends[M.LAssailant] + else + to_chat(src, "This subject does not have a strong enough life energy anymore...") + + if(M.client && ishuman(M)) + if(prob(85)) + rabid = 1 //we go rabid after finishing to feed on a human with a client. + + Feedstop() + return + + if(iscarbon(M)) + var/mob/living/carbon/C = M + C.adjustCloneLoss(rand(2, 4)) + C.adjustToxLoss(rand(1, 2)) + + if(prob(10) && C.client) + to_chat(C, "[pick("You can feel your body becoming weak!", \ + "You feel like you're about to die!", \ + "You feel every part of your body screaming in agony!", \ + "A low, rolling pain passes through your body!", \ + "Your body feels as if it's falling apart!", \ + "You feel extremely weak!", \ + "A sharp, deep pain bathes every inch of your body!")]") + + else if(isanimal(M)) + var/mob/living/simple_animal/SA = M + + var/totaldamage = 0 //total damage done to this unfortunate animal + totaldamage += SA.adjustCloneLoss(rand(2, 4)) + totaldamage += SA.adjustToxLoss(rand(1, 2)) + + if(totaldamage <= 0) //if we did no(or negative!) damage to it, stop + Feedstop(0, 0) + return + + else + Feedstop(0, 0) + return + + add_nutrition(rand(7, 15)) + + //Heal yourself. + adjustBruteLoss(-3) + +/mob/living/simple_animal/slime/proc/handle_nutrition() + + if(docile) //God as my witness, I will never go hungry again + set_nutrition(700) //fuck you for using the base nutrition var + return + + if(prob(15)) + adjust_nutrition(-(1 + is_adult)) + + if(nutrition <= 0) + set_nutrition(0) + if(prob(75)) + adjustBruteLoss(rand(0, 5)) + + else if(nutrition >= get_grow_nutrition() && amount_grown < SLIME_EVOLUTION_THRESHOLD) + adjust_nutrition(-20) + amount_grown++ + update_action_buttons_icon() + + if(amount_grown >= SLIME_EVOLUTION_THRESHOLD && !buckled && !Target && !ckey) + if(is_adult) + Reproduce() + else + Evolve() + +/mob/living/simple_animal/slime/proc/add_nutrition(nutrition_to_add = 0) + set_nutrition(min((nutrition + nutrition_to_add), get_max_nutrition())) + if(nutrition >= get_grow_nutrition()) + if(powerlevel<10) + if(prob(30-powerlevel*2)) + powerlevel++ + else if(nutrition >= get_hunger_nutrition() + 100) //can't get power levels unless you're a bit above hunger level. + if(powerlevel<5) + if(prob(25-powerlevel*5)) + powerlevel++ + + + + +/mob/living/simple_animal/slime/proc/handle_targets() + update_canmove() + if(Tempstun) + if(!buckled) // not while they're eating! + canmove = 0 + else + canmove = 1 + + if(attacked > 50) + attacked = 50 + + if(attacked > 0) + attacked-- + + if(Discipline > 0) + + if(Discipline >= 5 && rabid) + if(prob(60)) + rabid = 0 + + if(prob(10)) + Discipline-- + + if(!client) + if(!canmove) + return + + if(buckled) + return // if it's eating someone already, continue eating! + + if(Target) + --target_patience + if (target_patience <= 0 || SStun > world.time || Discipline || attacked || docile) // Tired of chasing or something draws out attention + target_patience = 0 + Target = null + + if(AIproc && SStun > world.time) + return + + var/hungry = 0 // determines if the slime is hungry + + if (nutrition < get_starve_nutrition()) + hungry = 2 + else if (nutrition < get_grow_nutrition() && prob(25) || nutrition < get_hunger_nutrition()) + hungry = 1 + + if(hungry == 2 && !client) // if a slime is starving, it starts losing its friends + if(Friends.len > 0 && prob(1)) + var/mob/nofriend = pick(Friends) + --Friends[nofriend] + + if(!Target) + if(will_hunt() && hungry || attacked || rabid) // Only add to the list if we need to + var/list/targets = list() + + for(var/mob/living/L in view(7,src)) + + if(isslime(L) || L.stat == DEAD) // Ignore other slimes and dead mobs + continue + + if(L in Friends) // No eating friends! + continue + + var/ally = FALSE + for(var/F in faction) + if(F == "neutral") //slimes are neutral so other mobs not target them, but they can target neutral mobs + continue + if(F in L.faction) + ally = TRUE + break + if(ally) + continue + + if(issilicon(L) && (rabid || attacked)) // They can't eat silicons, but they can glomp them in defence + targets += L // Possible target found! + + if(locate(/mob/living/simple_animal/slime) in L.buckled_mobs) // Only one slime can latch on at a time. + continue + + targets += L // Possible target found! + + if(targets.len > 0) + if(attacked || rabid || hungry == 2) + Target = targets[1] // I am attacked and am fighting back or so hungry I don't even care + else + for(var/mob/living/carbon/C in targets) + if(!Discipline && prob(5)) + if(ishuman(C) || isalienadult(C)) + Target = C + break + + if(islarva(C) || issmall(C)) + Target = C + break + + if (Target) + target_patience = rand(5, 7) + if(is_adult) + target_patience += 3 + + if(!Target) // If we have no target, we are wandering or following orders + if (Leader) + if(holding_still) + holding_still = max(holding_still - 1, 0) + else if(canmove && isturf(loc)) + step_to(src, Leader) + + else if(hungry) + if (holding_still) + holding_still = max(holding_still - hungry, 0) + else if(canmove && isturf(loc) && prob(50)) + step(src, pick(cardinal)) + + else + if(holding_still) + holding_still = max(holding_still - 1, 0) + else if (docile && pulledby) + holding_still = 10 + else if(canmove && isturf(loc) && prob(33)) + step(src, pick(cardinal)) + else if(!AIproc) + INVOKE_ASYNC(src, .proc/AIprocess) + +/mob/living/simple_animal/slime/handle_automated_movement() + return //slime random movement is currently handled in handle_targets() + +/mob/living/simple_animal/slime/handle_automated_speech() + return //slime random speech is currently handled in handle_speech() + +/mob/living/simple_animal/slime/proc/handle_mood() + var/newmood = "" + if (rabid || attacked) + newmood = "angry" + else if (docile) + newmood = ":3" + else if (Target) + newmood = "mischievous" + + if (!newmood) + if (Discipline && prob(25)) + newmood = "pout" + else if (prob(1)) + newmood = pick("sad", ":3", "pout") + + if ((mood == "sad" || mood == ":3" || mood == "pout") && !newmood) + if(prob(75)) + newmood = mood + + if(newmood != mood) // This is so we don't redraw them every time + mood = newmood + regenerate_icons() + +/mob/living/simple_animal/slime/proc/handle_speech() + //Speech understanding starts here + var/to_say + if(speech_buffer.len > 0) + var/who = speech_buffer[1] // Who said it? + var/phrase = speech_buffer[2] // What did they say? + if((findtext(phrase, num2text(number)) || findtext(phrase, "slimes"))) // Talking to us + if(findtext(phrase, "hello") || findtext(phrase, "hi")) + to_say = pick("Hello...", "Hi...") + else if(findtext(phrase, "follow")) + if(Leader) + if(Leader == who) // Already following him + to_say = pick("Yes...", "Lead...", "Follow...") + else if(Friends[who] > Friends[Leader]) // VIVA + Leader = who + to_say = "Yes... I follow [who]..." + else + to_say = "No... I follow [Leader]..." + else + if(Friends[who] >= SLIME_FRIENDSHIP_FOLLOW) + Leader = who + to_say = "I follow..." + else // Not friendly enough + to_say = pick("No...", "I no follow...") + else if(findtext(phrase, "stop")) + if(buckled) // We are asked to stop feeding + if (Friends[who] >= SLIME_FRIENDSHIP_STOPEAT) + Feedstop() + Target = null + if (Friends[who] < SLIME_FRIENDSHIP_STOPEAT_NOANGRY) + --Friends[who] + to_say = "Grrr..." // I'm angry but I do it + else + to_say = "Fine..." + else if(Target) // We are asked to stop chasing + if(Friends[who] >= SLIME_FRIENDSHIP_STOPCHASE) + Target = null + if(Friends[who] < SLIME_FRIENDSHIP_STOPCHASE_NOANGRY) + --Friends[who] + to_say = "Grrr..." // I'm angry but I do it + else + to_say = "Fine..." + else if(Leader) // We are asked to stop following + if(Leader == who) + to_say = "Yes... I stay..." + Leader = null + else + if(Friends[who] > Friends[Leader]) + Leader = null + to_say = "Yes... I stop..." + else + to_say = "No... keep follow..." + else if(findtext(phrase, "stay")) + if(Leader) + if (Leader == who) + holding_still = Friends[who] * 10 + to_say = "Yes... stay..." + else if(Friends[who] > Friends[Leader]) + holding_still = (Friends[who] - Friends[Leader]) * 10 + to_say = "Yes... stay..." + else + to_say = "No... keep follow..." + else + if(Friends[who] >= SLIME_FRIENDSHIP_STAY) + holding_still = Friends[who] * 10 + to_say = "Yes... stay..." + else + to_say = "No... won't stay..." + else if(findtext(phrase, "attack")) + if(rabid && prob(20)) + Target = who + AIprocess() //Wake up the slime's Target AI, needed otherwise this doesn't work + to_say = "ATTACK!?!?" + else if(Friends[who] >= SLIME_FRIENDSHIP_ATTACK) + for(var/mob/living/L in view(7,src)-list(src,who)) + if(findtext(phrase, lowertext(L.name))) + if(isslime(L)) + to_say = "NO... [L] slime friend" + --Friends[who] //Don't ask a slime to attack its friend + else if(!Friends[L] || Friends[L] < 1) + Target = L + AIprocess()//Wake up the slime's Target AI, needed otherwise this doesn't work + to_say = "Ok... I attack [Target]" + else + to_say = "No... like [L] ..." + --Friends[who] //Don't ask a slime to attack its friend + break + else + to_say = "No... no listen" + + speech_buffer = list() + + //Speech starts here + if(to_say) + say (to_say) + else if(prob(1)) + emote(pick("bounce", "sway", "light", "vibrate", "jiggle")) + else + var/t = 10 + var/slimes_near = 0 + var/dead_slimes = 0 + var/friends_near = list() + for(var/mob/living/L in view(7,src)) + if(isslime(L) && L != src) + ++slimes_near + if (L.stat == DEAD) + ++dead_slimes + if(L in Friends) + t += 20 + friends_near += L + if(nutrition < get_hunger_nutrition()) + t += 10 + if(nutrition < get_starve_nutrition()) + t += 10 + if(prob(2) && prob(t)) + var/phrases = list() + if(Target) + phrases += "[Target]... look yummy..." + if(nutrition < get_starve_nutrition()) + phrases += "So... hungry..." + phrases += "Very... hungry..." + phrases += "Need... food..." + phrases += "Must... eat..." + else if(nutrition < get_hunger_nutrition()) + phrases += "Hungry..." + phrases += "Where food?" + phrases += "I want to eat..." + phrases += "Rawr..." + phrases += "Blop..." + phrases += "Blorble..." + if(rabid || attacked) + phrases += "Hrr..." + phrases += "Nhuu..." + phrases += "Unn..." + if(mood == ":3") + phrases += "Purr..." + if(attacked) + phrases += "Grrr..." + if(bodytemperature < T0C) + phrases += "Cold..." + if(bodytemperature < T0C - 30) + phrases += "So... cold..." + phrases += "Very... cold..." + if(bodytemperature < T0C - 50) + phrases += "..." + phrases += "C... c..." + if(buckled) + phrases += "Nom..." + phrases += "Yummy..." + if(powerlevel > 3) + phrases += "Bzzz..." + if(powerlevel > 5) + phrases += "Zap..." + if(powerlevel > 8) + phrases += "Zap... Bzz..." + if(mood == "sad") + phrases += "Bored..." + if(slimes_near) + phrases += "Slime friend..." + if(slimes_near > 1) + phrases += "Slime friends..." + if(dead_slimes) + phrases += "What happened?" + if(!slimes_near) + phrases += "Lonely..." + for(var/M in friends_near) + phrases += "[M]... friend..." + if(nutrition < get_hunger_nutrition()) + phrases += "[M]... feed me..." + if(!stat) + say (pick(phrases)) + +/mob/living/simple_animal/slime/proc/get_max_nutrition() // Can't go above it + if(is_adult) + return 1200 + else + return 1000 + +/mob/living/simple_animal/slime/proc/get_grow_nutrition() // Above it we grow, below it we can eat + if(is_adult) + return 1000 + else + return 800 + +/mob/living/simple_animal/slime/proc/get_hunger_nutrition() // Below it we will always eat + if(is_adult) + return 600 + else + return 500 + +/mob/living/simple_animal/slime/proc/get_starve_nutrition() // Below it we will eat before everything else + if(is_adult) + return 300 + else + return 200 + +/mob/living/simple_animal/slime/proc/will_hunt(hunger = -1) // Check for being stopped from feeding and chasing + if(docile) + return 0 + if(hunger == 2 || rabid || attacked) + return 1 + if(Leader) + return 0 + if(holding_still) + return 0 + return 1 \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/slime/powers.dm b/code/modules/mob/living/simple_animal/slime/powers.dm new file mode 100644 index 00000000000..bd9d001f12f --- /dev/null +++ b/code/modules/mob/living/simple_animal/slime/powers.dm @@ -0,0 +1,215 @@ +#define SIZE_DOESNT_MATTER -1 +#define BABIES_ONLY 0 +#define ADULTS_ONLY 1 + +#define NO_GROWTH_NEEDED 0 +#define GROWTH_NEEDED 1 + +/datum/action/innate/slime + check_flags = AB_CHECK_CONSCIOUS + icon_icon = 'icons/mob/actions/actions_slime.dmi' + background_icon_state = "bg_alien" + var/needs_growth = NO_GROWTH_NEEDED + +/datum/action/innate/slime/IsAvailable() + if(..()) + var/mob/living/simple_animal/slime/S = owner + if(needs_growth == GROWTH_NEEDED) + if(S.amount_grown >= SLIME_EVOLUTION_THRESHOLD) + return 1 + return 0 + return 1 + +/mob/living/simple_animal/slime/verb/Feed() + set category = "Slime" + set desc = "This will let you feed on any valid creature in the surrounding area. This should also be used to halt the feeding process." + + if(stat) + return 0 + + var/list/choices = list() + for(var/mob/living/C in view(1,src)) + if(C!=src && Adjacent(C)) + choices += C + + var/mob/living/M = input(src,"Who do you wish to feed on?") in null|choices + if(!M) + return 0 + if(CanFeedon(M)) + Feedon(M) + return 1 + +/datum/action/innate/slime/feed + name = "Feed" + button_icon_state = "slimeeat" + + +/datum/action/innate/slime/feed/Activate() + var/mob/living/simple_animal/slime/S = owner + S.Feed() + +/mob/living/simple_animal/slime/proc/CanFeedon(mob/living/M, silent = FALSE) + if(!Adjacent(M)) + return FALSE + + if(buckled) + Feedstop() + return FALSE + + if(issilicon(M)) + return FALSE + + if(isanimal(M)) + var/mob/living/simple_animal/S = M + if(S.damage_coeff[TOX] <= 0 && S.damage_coeff[CLONE] <= 0) //The creature wouldn't take any damage, it must be too weird even for us. + if(silent) + return FALSE + to_chat(src, "[pick("This subject is incompatible", \ + "This subject does not have life energy", "This subject is empty", \ + "I am not satisified", "I can not feed from this subject", \ + "I do not feel nourished", "This subject is not food")]!") + return FALSE + + if(isslime(M)) + if(silent) + return FALSE + to_chat(src, "I can't latch onto another slime...") + return FALSE + + if(docile) + if(silent) + return FALSE + to_chat(src, "I'm not hungry anymore...") + return FALSE + + if(stat) + if(silent) + return FALSE + to_chat(src, "I must be conscious to do this...") + return FALSE + + if(M.stat == DEAD) + if(silent) + return FALSE + to_chat(src, "This subject does not have a strong enough life energy...") + return FALSE + + if(locate(/mob/living/simple_animal/slime) in M.buckled_mobs) + if(silent) + return FALSE + to_chat(src, "Another slime is already feeding on this subject...") + return FALSE + return TRUE + +/mob/living/simple_animal/slime/proc/Feedon(mob/living/M) + M.unbuckle_all_mobs(force = TRUE) //Slimes rip other mobs (eg: shoulder parrots) off (Slimes Vs Slimes is already handled in CanFeedon()) + if(M.buckle_mob(src, force = TRUE)) + layer = M.layer + 0.01 //appear above the target mob + M.visible_message("[name] has latched onto [M]!", \ + "[name] has latched onto [M]!") + else + to_chat(src, "I have failed to latch onto the subject!") + +/mob/living/simple_animal/slime/proc/Feedstop(silent = FALSE, living = 1) + if(buckled) + if(!living) + to_chat(src, "[pick("This subject is incompatible", \ + "This subject does not have life energy", "This subject is empty", \ + "I am not satisified", "I can not feed from this subject", \ + "I do not feel nourished", "This subject is not food")]!") + if(!silent) + visible_message("[src] has let go of [buckled]!", \ + "I stopped feeding.") + layer = initial(layer) + buckled.unbuckle_mob(src,force=TRUE) + +/mob/living/simple_animal/slime/verb/Evolve() + set category = "Slime" + set desc = "This will let you evolve from baby to adult slime." + + if(stat) + to_chat(src, "I must be conscious to do this...") + return + if(!is_adult) + if(amount_grown >= SLIME_EVOLUTION_THRESHOLD) + is_adult = 1 + maxHealth = 200 + amount_grown = 0 + for(var/datum/action/innate/slime/evolve/E in actions) + E.Remove(src) + regenerate_icons() + update_name() + else + to_chat(src, "I am not ready to evolve yet...") + else + to_chat(src, "I have already evolved...") + +/datum/action/innate/slime/evolve + name = "Evolve" + button_icon_state = "slimegrow" + needs_growth = GROWTH_NEEDED + +/datum/action/innate/slime/evolve/Activate() + var/mob/living/simple_animal/slime/S = owner + S.Evolve() + if(S.is_adult) + var/datum/action/innate/slime/reproduce/A = new + A.Grant(S) + +/mob/living/simple_animal/slime/verb/Reproduce() + set category = "Slime" + set desc = "This will make you split into four Slimes." + + if(stat) + to_chat(src, "I must be conscious to do this...") + return + + if(is_adult) + if(amount_grown >= SLIME_EVOLUTION_THRESHOLD) + if(stat) + to_chat(src, "I must be conscious to do this...") + return + + var/list/babies = list() + var/new_nutrition = round(nutrition * 0.9) + var/new_powerlevel = round(powerlevel / 4) + for(var/i=1,i<=4,i++) + var/child_colour + if(mutation_chance >= 100) + child_colour = "rainbow" + else if(prob(mutation_chance)) + child_colour = slime_mutation[rand(1,4)] + else + child_colour = colour + var/mob/living/simple_animal/slime/M + M = new(loc, child_colour) + if(ckey) + M.set_nutrition(new_nutrition) //Player slimes are more robust at spliting. Once an oversight of poor copypasta, now a feature! + M.powerlevel = new_powerlevel + if(i != 1) + step_away(M,src) + M.Friends = Friends.Copy() + babies += M + M.mutation_chance = Clamp(mutation_chance+(rand(5,-5)),0,100) + feedback_add_details("slime_babies_born", "slimebirth_[replacetext(M.colour," ","_")]") + + var/mob/living/simple_animal/slime/new_slime = pick(babies) + new_slime.a_intent = INTENT_HARM + if(src.mind) + src.mind.transfer_to(new_slime) + else + new_slime.key = src.key + qdel(src) + else + to_chat(src, "I am not ready to reproduce yet...") + else + to_chat(src, "I am not old enough to reproduce yet...") + +/datum/action/innate/slime/reproduce + name = "Reproduce" + button_icon_state = "slimesplit" + needs_growth = GROWTH_NEEDED + +/datum/action/innate/slime/reproduce/Activate() + var/mob/living/simple_animal/slime/S = owner + S.Reproduce() diff --git a/code/modules/mob/living/simple_animal/slime/say.dm b/code/modules/mob/living/simple_animal/slime/say.dm new file mode 100644 index 00000000000..01269aab8aa --- /dev/null +++ b/code/modules/mob/living/simple_animal/slime/say.dm @@ -0,0 +1,18 @@ +/mob/living/simple_animal/slime/say_quote(text, datum/language/speaking) + var/verb = "blorbles" + var/ending = copytext(text, length(text)) + + if(ending == "?") + verb = "inquisitively blorbles" + else if(ending == "!") + verb = "loudly blorbles" + + return verb + +/mob/living/simple_animal/slime/hear_say(list/message_pieces, verb = "says", italics = 0, mob/speaker = null, sound/speech_sound, sound_vol) + if(speaker != src && !stat) + if(speaker in Friends) + speech_buffer = list() + speech_buffer.Add(speaker) + speech_buffer.Add(lowertext(html_decode(multilingual_to_message(message_pieces)))) + ..() diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm new file mode 100644 index 00000000000..a325ecfdefe --- /dev/null +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -0,0 +1,505 @@ +/mob/living/simple_animal/slime + name = "grey baby slime (123)" + icon = 'icons/mob/slimes.dmi' + icon_state = "grey baby slime" + pass_flags = PASSTABLE | PASSGRILLE + ventcrawler = VENTCRAWLER_ALWAYS + gender = NEUTER + var/is_adult = 0 + var/docile = 0 + faction = list("slime", "neutral") + + harm_intent_damage = 5 + icon_living = "grey baby slime" + icon_dead = "grey baby slime dead" + response_help = "pets" + response_disarm = "shoos" + response_harm = "stomps on" + emote_see = list("jiggles", "bounces in place") + speak_emote = list("blorbles") + + atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + + maxHealth = 150 + health = 150 + healable = 0 + gender = NEUTER + + see_in_dark = 8 + + // canstun and canknockdown don't affect slimes because they ignore stun and knockdown variables + // for the sake of cleanliness, though, here they are. + status_flags = CANPARALYSE | CANPUSH + + var/cores = 1 // the number of /obj/item/slime_extract's the slime has left inside + var/mutation_chance = 30 // Chance of mutating, should be between 25 and 35 + + var/powerlevel = 0 // 1-10 controls how much electricity they are generating + var/amount_grown = 0 // controls how long the slime has been overfed, if 10, grows or reproduces + + var/number = 0 // Used to understand when someone is talking to it + + var/mob/living/Target = null // AI variable - tells the slime to hunt this down + var/mob/living/Leader = null // AI variable - tells the slime to follow this person + + var/attacked = 0 // Determines if it's been attacked recently. Can be any number, is a cooloff-ish variable + var/rabid = 0 // If set to 1, the slime will attack and eat anything it comes in contact with + var/holding_still = 0 // AI variable, cooloff-ish for how long it's going to stay in one place + var/target_patience = 0 // AI variable, cooloff-ish for how long it's going to follow its target + + var/list/Friends = list() // A list of friends; they are not considered targets for feeding; passed down after splitting + + var/list/speech_buffer = list() // Last phrase said near it and person who said it + + var/mood = "" // To show its face + var/mutator_used = FALSE //So you can't shove a dozen mutators into a single slime + var/force_stasis = FALSE + + var/static/regex/slime_name_regex = new("\\w+ (baby|adult) slime \\(\\d+\\)") + ///////////TIME FOR SUBSPECIES + + var/colour = "grey" + var/coretype = /obj/item/slime_extract/grey + var/list/slime_mutation[4] + + var/static/list/slime_colours = list("rainbow", "grey", "purple", "metal", "orange", + "blue", "dark blue", "dark purple", "yellow", "silver", "pink", "red", + "gold", "green", "adamantine", "oil", "light pink", "bluespace", + "cerulean", "sepia", "black", "pyrite") + + ///////////CORE-CROSSING CODE + + var/effectmod //What core modification is being used. + var/applied = 0 //How many extracts of the modtype have been applied. + + +/mob/living/simple_animal/slime/Initialize(mapload, new_colour = "grey", new_is_adult = FALSE) + var/datum/action/innate/slime/feed/F = new + F.Grant(src) + + is_adult = new_is_adult + + if(is_adult) + var/datum/action/innate/slime/reproduce/R = new + R.Grant(src) + health = 200 + maxHealth = 200 + else + var/datum/action/innate/slime/evolve/E = new + E.Grant(src) + create_reagents(100) + set_colour(new_colour) + . = ..() + set_nutrition(700) + add_language("Bubblish") + +/mob/living/simple_animal/slime/Destroy() + for(var/A in actions) + var/datum/action/AC = A + AC.Remove(src) + for(var/obj/machinery/computer/camera_advanced/xenobio/X in GLOB.machines) + if(src in X.stored_slimes) + X.stored_slimes -= src + return ..() + +/mob/living/simple_animal/slime/proc/set_colour(new_colour) + colour = new_colour + update_name() + slime_mutation = mutation_table(colour) + var/sanitizedcolour = replacetext(colour, " ", "") + coretype = text2path("/obj/item/slime_extract/[sanitizedcolour]") + regenerate_icons() + +/mob/living/simple_animal/slime/proc/update_name() + if(slime_name_regex.Find(name)) + number = rand(1, 1000) + name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])" + real_name = name + +/mob/living/simple_animal/slime/proc/random_colour() + set_colour(pick(slime_colours)) + +/mob/living/simple_animal/slime/regenerate_icons() + cut_overlays() + var/icon_text = "[colour] [is_adult ? "adult" : "baby"] slime" + icon_dead = "[icon_text] dead" + if(stat != DEAD) + icon_state = icon_text + if(mood && !stat) + add_overlay("aslime-[mood]") + else + icon_state = icon_dead + ..() + +/mob/living/simple_animal/slime/movement_delay() + if(bodytemperature >= 330.23) // 135 F or 57.08 C + return -1 // slimes become supercharged at high temperatures + + . = ..() + + var/health_deficiency = (maxHealth - health) + if(health_deficiency >= 45) + . += (health_deficiency / 25) + + if(bodytemperature < 183.222) + . += (283.222 - bodytemperature) / 10 * 1.75 + + if(reagents) + if(reagents.has_reagent("morphine")) // morphine slows slimes down + . *= 2 + + if(reagents.has_reagent("frostoil")) // Frostoil also makes them move VEEERRYYYYY slow + . *= 5 + + if(health <= 0) // if damaged, the slime moves twice as slow + . *= 2 + + . += config.slime_delay + +/mob/living/simple_animal/slime/handle_hud_icons_health() + if(hud_used) + if(!client) + return + + if(healths) + var/severity = 0 + var/healthpercent = (health / maxHealth) * 100 + switch(healthpercent) + if(100 to INFINITY) + healths.icon_state = "slime_health0" + if(80 to 100) + healths.icon_state = "slime_health1" + severity = 1 + if(60 to 80) + healths.icon_state = "slime_health2" + severity = 2 + if(40 to 60) + healths.icon_state = "slime_health3" + severity = 3 + if(20 to 40) + healths.icon_state = "slime_health4" + severity = 4 + if(1 to 20) + healths.icon_state = "slime_health5" + severity = 5 + else + healths.icon_state = "slime_health7" + severity = 6 + if(severity > 0) + overlay_fullscreen("brute", /obj/screen/fullscreen/brute, severity) + else + clear_fullscreen("brute") + +/mob/living/simple_animal/slime/ObjBump(obj/O) + if(!client && powerlevel > 0) + var/probab = 10 + switch(powerlevel) + if(1 to 2) + probab = 20 + if(3 to 4) + probab = 30 + if(5 to 6) + probab = 40 + if(7 to 8) + probab = 60 + if(9) + probab = 70 + if(10) + probab = 95 + if(prob(probab)) + if(istype(O, /obj/structure/window) || istype(O, /obj/structure/grille)) + if(nutrition <= get_hunger_nutrition() && !Atkcool) + if (is_adult || prob(5)) + O.attack_slime(src) + Atkcool = TRUE + addtimer(VARSET_CALLBACK(src, Atkcool, FALSE), 4.5 SECONDS) + +/mob/living/simple_animal/slime/Process_Spacemove(movement_dir = 0) + return 2 + +/mob/living/simple_animal/slime/Stat() + if(..()) + + if(!docile) + stat(null, "Nutrition: [nutrition]/[get_max_nutrition()]") + if(amount_grown >= SLIME_EVOLUTION_THRESHOLD) + if(is_adult) + stat(null, "You can reproduce!") + else + stat(null, "You can evolve!") + + if(stat == UNCONSCIOUS) + stat(null,"You are knocked out by high levels of BZ!") + else + stat(null,"Power Level: [powerlevel]") + + +/mob/living/simple_animal/slime/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE) + if(!forced) + amount = -abs(amount) + return ..() //Heals them + +/mob/living/simple_animal/slime/bullet_act(obj/item/projectile/Proj) + if(!Proj) + return + attacked += 10 + if((Proj.damage_type == BURN)) + adjustBruteLoss(-abs(Proj.damage)) //fire projectiles heals slimes. + Proj.on_hit(src) + else + ..(Proj) + return FALSE + +/mob/living/simple_animal/slime/emp_act(severity) + ..() + powerlevel = 0 // oh no, the power! + +/mob/living/simple_animal/slime/MouseDrop(atom/movable/A) + if(isliving(A) && A != src && usr == src) + var/mob/living/Food = A + if(CanFeedon(Food)) + Feedon(Food) + return ..() + +/mob/living/simple_animal/slime/unEquip(obj/item/I) + return + +/mob/living/simple_animal/slime/start_pulling(atom/movable/AM, state, force = move_force, supress_message = FALSE) + return + +/mob/living/simple_animal/slime/attack_ui(slot) + return + +/mob/living/simple_animal/slime/attack_slime(mob/living/simple_animal/slime/M) + if(..()) //successful slime attack + if(M == src) + return + if(buckled) + Feedstop(silent = TRUE) + visible_message("[M] pulls [src] off!", \ + "You pull [src] off!") + return + attacked += 5 + if(nutrition >= 100) //steal some nutrition. negval handled in life() + adjust_nutrition(-(50 + (40 * M.is_adult))) + M.add_nutrition(50 + (40 * M.is_adult)) + if(health > 0) + M.adjustBruteLoss(-10 + (-10 * M.is_adult)) + M.updatehealth() + +/mob/living/simple_animal/slime/attack_animal(mob/living/simple_animal/M) + . = ..() + if(.) + attacked += 10 + +/mob/living/simple_animal/slime/attack_larva(mob/living/carbon/alien/larva/L) + if(..()) //successful larva bite. + attacked += 10 + +/mob/living/simple_animal/slime/attack_hulk(mob/living/carbon/human/user) + if(user.a_intent == INTENT_HARM) + discipline_slime(user) + return ..() + +/mob/living/simple_animal/slime/attack_hand(mob/living/carbon/human/M) + if(buckled) + M.do_attack_animation(src, ATTACK_EFFECT_DISARM) + if(buckled == M) + if(prob(60)) + M.visible_message("[M] attempts to wrestle \the [name] off!", \ + "You attempt to wrestle \the [name] off!") + playsound(loc, 'sound/weapons/punchmiss.ogg', 25, TRUE, -1) + + else + M.visible_message("[M] manages to wrestle \the [name] off!", \ + "You manage to wrestle \the [name] off!") + playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1) + + discipline_slime(M) + + else + if(prob(30)) + buckled.visible_message("[M] attempts to wrestle \the [name] off of [buckled]!", \ + "[M] attempts to wrestle \the [name] off of you!") + playsound(loc, 'sound/weapons/punchmiss.ogg', 25, TRUE, -1) + + else + buckled.visible_message("[M] manages to wrestle \the [name] off of [buckled]!", \ + "[M] manage to wrestle \the [name] off of you!") + playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1) + + discipline_slime(M) + else + if(stat == DEAD && surgeries.len) + if(M.a_intent == INTENT_HELP || M.a_intent == INTENT_DISARM) + for(var/datum/surgery/S in surgeries) + if(S.next_step(M, src)) + return 1 + if(..()) //successful attack + attacked += 10 + +/mob/living/simple_animal/slime/attack_alien(mob/living/carbon/alien/humanoid/M) + if(..()) //if harm or disarm intent. + attacked += 10 + discipline_slime(M) + + +/mob/living/simple_animal/slime/attackby(obj/item/I, mob/living/user, params) + if(stat == DEAD && surgeries.len) + if(user.a_intent == INTENT_HELP || user.a_intent == INTENT_DISARM) + for(var/datum/surgery/S in surgeries) + if(S.next_step(user, src)) + return 1 + if(istype(I, /obj/item/stack/sheet/mineral/plasma) && !stat) //Let's you feed slimes plasma. + if(user in Friends) + ++Friends[user] + else + Friends[user] = 1 + to_chat(user, "You feed the slime the plasma. It chirps happily.") + var/obj/item/stack/sheet/mineral/plasma/S = I + S.use(1) + return + if(I.force > 0) + attacked += 10 + if(prob(25)) + user.do_attack_animation(src) + user.changeNext_move(CLICK_CD_MELEE) + to_chat(user, "[I] passes right through [src]!") + return + if(Discipline && prob(50)) // wow, buddy, why am I getting attacked?? + Discipline = 0 + if(I.force >= 3) + var/force_effect = 2 * I.force + if(is_adult) + force_effect = round(I.force / 2) + if(prob(10 + force_effect)) + discipline_slime(user) +/* if(istype(I, /obj/item/storage/bag/bio)) + var/obj/item/storage/P = I + if(!effectmod) + to_chat(user, "The slime is not currently being mutated.") + return + var/hasOutput = FALSE //Have we outputted text? + var/hasFound = FALSE //Have we found an extract to be added? + for(var/obj/item/slime_extract/S in P.contents) + if(S.effectmod == effectmod) + SEND_SIGNAL(P, COMSIG_TRY_STORAGE_TAKE, S, get_turf(src), TRUE) + qdel(S) + applied++ + hasFound = TRUE + if(applied >= SLIME_EXTRACT_CROSSING_REQUIRED) + to_chat(user, "You feed the slime as many of the extracts from the bag as you can, and it mutates!") + playsound(src, 'sound/effects/attackblob.ogg', 50, TRUE) + spawn_corecross() + hasOutput = TRUE + break + if(!hasOutput) + if(!hasFound) + to_chat(user, "There are no extracts in the bag that this slime will accept!") + else + to_chat(user, "You feed the slime some extracts from the bag.") + playsound(src, 'sound/effects/attackblob.ogg', 50, TRUE) + return */ + ..() +/* +/mob/living/simple_animal/slime/proc/spawn_corecross() + var/static/list/crossbreeds = subtypesof(/obj/item/slimecross) + visible_message("[src] shudders, its mutated core consuming the rest of its body!") + playsound(src, 'sound/magic/smoke.ogg', 50, TRUE) + var/crosspath + for(var/X in crossbreeds) + var/obj/item/slimecross/S = X + if(initial(S.colour) == colour && initial(S.effect) == effectmod) + crosspath = S + break + if(crosspath) + new crosspath(loc) + else + visible_message("The mutated core shudders, and collapses into a puddle, unable to maintain its form.") + qdel(src) +*/ +/mob/living/simple_animal/slime/water_act(volume, temperature, source, method = TOUCH) + . = ..() + var/water_damage = rand(10, 15) * volume + adjustBruteLoss(water_damage) + if(!client && Target && volume >= 3) // Like cats + Target = null + ++Discipline + +/mob/living/simple_animal/slime/examine(mob/user) + to_chat(user, "*---------*\nThis is [bicon(src)] \a [src]!") + if(stat == DEAD) + to_chat(user, "It is limp and unresponsive.") + else + if(stat == UNCONSCIOUS) // Slime stasis + to_chat(user, "It appears to be alive but unresponsive.") + if(getBruteLoss()) + to_chat(user, "") + if (getBruteLoss() < 40) + to_chat(user, "It has some punctures in its flesh!") + else + to_chat(user, "It has severe punctures and tears in its flesh!") + to_chat(user, "\n") + + switch(powerlevel) + if(2 to 3) + to_chat(user, "It is flickering gently with a little electrical activity.") + + if(4 to 5) + to_chat(user, "It is glowing gently with moderate levels of electrical activity.") + + if(6 to 9) + to_chat(user, "It is glowing brightly with high levels of electrical activity.") + + if(10) + to_chat(user, "It is radiating with massive levels of electrical activity!") + + to_chat(user, "*---------*") + +/mob/living/simple_animal/slime/proc/discipline_slime(mob/user) + if(stat) + return + + if(prob(80) && !client) + Discipline++ + + if(!is_adult) + if(Discipline == 1) + attacked = 0 + + if(Target) + Target = null + if(buckled) + Feedstop(silent = TRUE) //we unbuckle the slime from the mob it latched onto. + + SStun = world.time + rand(20,60) + spawn(0) + canmove = FALSE + if(user) + step_away(src,user,15) + sleep(3) + if(user) + step_away(src,user,15) + update_canmove() + +/mob/living/simple_animal/slime/pet + docile = TRUE + +/mob/living/simple_animal/slime/can_unbuckle() + return FALSE + +/mob/living/simple_animal/slime/can_buckle() + return FALSE + +/mob/living/simple_animal/slime/get_mob_buckling_height(mob/seat) + if(..()) + return 3 + +/mob/living/simple_animal/slime/random/Initialize(mapload, new_colour, new_is_adult) + . = ..(mapload, pick(slime_colours), prob(50)) + +/mob/living/simple_animal/slime/handle_ventcrawl(atom/A) + if(buckled) + to_chat(src, "I can't vent crawl while feeding...") + return + ..() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/slime/subtypes.dm b/code/modules/mob/living/simple_animal/slime/subtypes.dm similarity index 96% rename from code/modules/mob/living/carbon/slime/subtypes.dm rename to code/modules/mob/living/simple_animal/slime/subtypes.dm index 35d38e31a48..b5720c62250 100644 --- a/code/modules/mob/living/carbon/slime/subtypes.dm +++ b/code/modules/mob/living/simple_animal/slime/subtypes.dm @@ -1,4 +1,4 @@ -proc/mutation_table(var/colour) +/mob/living/simple_animal/slime/proc/mutation_table(colour) var/list/slime_mutation[4] switch(colour) //Tier 1 @@ -76,4 +76,4 @@ proc/mutation_table(var/colour) slime_mutation[2] = colour slime_mutation[3] = colour slime_mutation[4] = colour - return(slime_mutation) \ No newline at end of file + return(slime_mutation) diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 5154f19fda7..a03b7745d0a 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -135,41 +135,38 @@ qdel(src) return -/mob/living/carbon/human/proc/slimeize(adult as num, reproduce as num) +/mob/living/carbon/human/proc/slimeize(reproduce as num) if(notransform) return - for(var/obj/item/W in src) - unEquip(W) + notransform = TRUE + canmove = FALSE + for(var/obj/item/I in src) + unEquip(I) regenerate_icons() - notransform = 1 - canmove = 0 icon = null - invisibility = 101 + invisibility = INVISIBILITY_MAXIMUM for(var/t in bodyparts) qdel(t) - var/mob/living/carbon/slime/new_slime + var/mob/living/simple_animal/slime/new_slime if(reproduce) var/number = pick(14;2,3,4) //reproduce (has a small chance of producing 3 or 4 offspring) var/list/babies = list() for(var/i=1,i<=number,i++) - var/mob/living/carbon/slime/M = new/mob/living/carbon/slime(loc) + var/mob/living/simple_animal/slime/M = new/mob/living/simple_animal/slime(loc) M.set_nutrition(round(nutrition / number)) step_away(M,src) babies += M new_slime = pick(babies) else - new_slime = new /mob/living/carbon/slime(loc) - if(adult) - new_slime.is_adult = 1 - else + new_slime = new /mob/living/simple_animal/slime(loc) + new_slime.a_intent = INTENT_HARM new_slime.key = key to_chat(new_slime, "You are now a slime. Skreee!") new_slime.update_pipe_vision() - spawn(0)//To prevent the proc from returning null. - qdel(src) - return + . = new_slime + qdel(src) /mob/living/carbon/human/proc/corgize() if(notransform) diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 4bf6c98fc50..76d7c513bcc 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -202,7 +202,7 @@ if(ishuman(M)) Robot.mmi.transfer_identity(M) //Does not transfer key/client. if("slime") - new_mob = new /mob/living/carbon/slime/random(M.loc) + new_mob = new /mob/living/simple_animal/slime/random(M.loc) new_mob.universal_speak = TRUE if("xeno") if(prob(50)) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 331e5d9ca8f..b594743baef 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -74,6 +74,18 @@ var/const/INGEST = 2 handle_reactions() return total_transfered +/datum/reagents/proc/remove_all(amount = 1) + var/list/cached_reagents = reagent_list + if(total_volume > 0) + var/part = amount / total_volume + for(var/reagent in cached_reagents) + var/datum/reagent/R = reagent + remove_reagent(R.id, R.volume * part) + + update_total() + handle_reactions() + return amount + /datum/reagents/proc/get_master_reagent() var/the_reagent = null var/the_volume = 0 @@ -803,7 +815,7 @@ var/const/INGEST = 2 if(!R.taste_mult) continue //nutriment carries a list of tastes that originates from the snack food that the nutriment came from - if(istype(R, /datum/reagent/consumable/nutriment)) + if(istype(R, /datum/reagent/consumable/nutriment)) var/list/nutriment_taste_data = R.data for(var/nutriment_taste in nutriment_taste_data) var/ratio = nutriment_taste_data[nutriment_taste] diff --git a/code/modules/reagents/chemistry/reagents/food.dm b/code/modules/reagents/chemistry/reagents/food.dm index afc4c4f2f8f..5353dc54b88 100644 --- a/code/modules/reagents/chemistry/reagents/food.dm +++ b/code/modules/reagents/chemistry/reagents/food.dm @@ -279,8 +279,8 @@ /datum/reagent/consumable/frostoil/reaction_turf(turf/T, volume) if(volume >= 5) - for(var/mob/living/carbon/slime/M in T) - M.adjustToxLoss(rand(15,30)) + for(var/mob/living/simple_animal/slime/M in T) + M.adjustToxLoss(rand(15, 30)) /datum/reagent/consumable/sodiumchloride name = "Salt" diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic.dm index a01c034a4ae..17eee91080e 100644 --- a/code/modules/reagents/chemistry/reagents/pyrotechnic.dm +++ b/code/modules/reagents/chemistry/reagents/pyrotechnic.dm @@ -356,7 +356,7 @@ if(volume >= 3) T.MakeSlippery(TURF_WET_ICE) if(volume >= 5) - for(var/mob/living/carbon/slime/M in T) + for(var/mob/living/simple_animal/slime/M in T) M.adjustToxLoss(rand(15,30)) /datum/reagent/pyrosium diff --git a/code/modules/reagents/chemistry/reagents/water.dm b/code/modules/reagents/chemistry/reagents/water.dm index 5a831aa91de..ef836462543 100644 --- a/code/modules/reagents/chemistry/reagents/water.dm +++ b/code/modules/reagents/chemistry/reagents/water.dm @@ -76,8 +76,8 @@ if(floor_only) T.clean_blood() - for(var/mob/living/carbon/slime/M in T) - M.adjustToxLoss(rand(5,10)) + for(var/mob/living/simple_animal/slime/M in T) + M.adjustToxLoss(rand(5, 10)) if(istype(T, /turf/simulated)) var/turf/simulated/S = T S.dirt = 0 diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index a1e96ea35f5..1767d3964a1 100644 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm @@ -11,9 +11,8 @@ /datum/chemical_reaction/slimespawn/on_reaction(datum/reagents/holder) feedback_add_details("slime_cores_used","[type]") - var/mob/living/carbon/slime/S = new /mob/living/carbon/slime - S.forceMove(get_turf(holder.my_atom)) - S.visible_message("Infused with plasma, the core begins to quiver and grow, and soon a new baby slime emerges from it!") + var/mob/living/simple_animal/slime/S = new(get_turf(holder.my_atom), "grey") + S.visible_message("Infused with plasma, the core begins to quiver and grow, and a new baby slime emerges from it!") /datum/chemical_reaction/slimeinaprov name = "Slime epinephrine" @@ -425,7 +424,12 @@ /datum/chemical_reaction/slimebloodlust/on_reaction(datum/reagents/holder) feedback_add_details("slime_cores_used","[type]") - for(var/mob/living/carbon/slime/slime in viewers(get_turf(holder.my_atom), null)) + for(var/mob/living/simple_animal/slime/slime in viewers(get_turf(holder.my_atom), null)) + if(slime.docile) //Undoes docility, but doesn't make rabid. + slime.visible_message("[slime] forgets its training, becoming wild once again!") + slime.docile = FALSE + slime.update_name() + continue slime.rabid = 1 slime.visible_message("The [slime] is driven into a frenzy!") @@ -667,9 +671,8 @@ /datum/chemical_reaction/slimeRNG/on_reaction(datum/reagents/holder) feedback_add_details("slime_cores_used","[type]") - var/mob/living/carbon/slime/random/S = new /mob/living/carbon/slime/random - S.forceMove(get_turf(holder.my_atom)) - S.visible_message("Infused with plasma, the core begins to quiver and grow, and soon a new baby slime emerges from it!") + var/mob/living/simple_animal/slime/random/S = new (get_turf(holder.my_atom)) + S.visible_message("Infused with plasma, the core begins to quiver and grow, and a new baby slime emerges from it!") /datum/chemical_reaction/slime_transfer name = "Transfer Potion" diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 6a5d85e0631..2182df4c9a8 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -175,7 +175,7 @@ // mouse drop another mob or self // /obj/machinery/disposal/MouseDrop_T(mob/target, mob/user) - if(!istype(target) || target.buckled || get_dist(user, src) > 1 || get_dist(user, target) > 1 || user.stat || istype(user, /mob/living/silicon/ai)) + if(!istype(target) || target.buckled || target.has_buckled_mobs() || get_dist(user, src) > 1 || get_dist(user, target) > 1 || user.stat || istype(user, /mob/living/silicon/ai)) return if(isanimal(user) && target != user) return //animals cannot put mobs other than themselves into disposal src.add_fingerprint(user) diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm index 785c03b13a1..f6df6ece19b 100644 --- a/code/modules/research/xenobiology/xenobio_camera.dm +++ b/code/modules/research/xenobiology/xenobio_camera.dm @@ -48,7 +48,7 @@ /obj/machinery/computer/camera_advanced/xenobio/Destroy() QDEL_NULL(current_potion) - for(var/mob/living/carbon/slime/S in stored_slimes) + for(var/mob/living/simple_animal/slime/S in stored_slimes) S.forceMove(drop_location()) stored_slimes.Cut() return ..() @@ -173,7 +173,7 @@ var/obj/machinery/computer/camera_advanced/xenobio/X = target if(cameranet.checkTurfVis(remote_eye.loc)) - for(var/mob/living/carbon/slime/S in X.stored_slimes) + for(var/mob/living/simple_animal/slime/S in X.stored_slimes) S.forceMove(remote_eye.loc) S.visible_message("[S] warps in!") X.stored_slimes -= S @@ -192,14 +192,13 @@ var/obj/machinery/computer/camera_advanced/xenobio/X = target if(cameranet.checkTurfVis(remote_eye.loc)) - for(var/mob/living/carbon/slime/S in remote_eye.loc) + for(var/mob/living/simple_animal/slime/S in remote_eye.loc) if(X.stored_slimes.len >= X.max_slimes) break if(!S.ckey) if(S.buckled) - S.buckled.unbuckle_mob(S, force = TRUE) - S.Feedstop() - S.visible_message("[S] vanishes in a flash of light!") + S.Feedstop(silent = TRUE) + S.visible_message("[S] vanishes in a flash of light!") S.forceMove(X) X.stored_slimes += S else @@ -265,7 +264,7 @@ var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control if(cameranet.checkTurfVis(remote_eye.loc)) - for(var/mob/living/carbon/slime/S in remote_eye.loc) + for(var/mob/living/simple_animal/slime/S in remote_eye.loc) slime_scan(S, C) else to_chat(owner, "Target is not near a camera. Cannot proceed.") @@ -287,7 +286,7 @@ return if(cameranet.checkTurfVis(remote_eye.loc)) - for(var/mob/living/carbon/slime/S in remote_eye.loc) + for(var/mob/living/simple_animal/slime/S in remote_eye.loc) X.current_potion.attack(S, C) break else @@ -310,17 +309,17 @@ // Alternate clicks for slime, monkey and open turf if using a xenobio console // Scans slime -/mob/living/carbon/slime/CtrlClick(mob/user) +/mob/living/simple_animal/slime/CtrlClick(mob/user) SEND_SIGNAL(user, COMSIG_XENO_SLIME_CLICK_CTRL, src) ..() //Feeds a potion to slime -/mob/living/carbon/slime/AltClick(mob/user) +/mob/living/simple_animal/slime/AltClick(mob/user) SEND_SIGNAL(user, COMSIG_XENO_SLIME_CLICK_ALT, src) ..() //Picks up slime -/mob/living/carbon/slime/ShiftClick(mob/user) +/mob/living/simple_animal/slime/ShiftClick(mob/user) SEND_SIGNAL(user, COMSIG_XENO_SLIME_CLICK_SHIFT, src) ..() @@ -341,7 +340,7 @@ ..() // Scans slime -/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickCtrl(mob/living/user, mob/living/carbon/slime/S) +/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickCtrl(mob/living/user, mob/living/simple_animal/slime/S) if(!cameranet.checkTurfVis(S.loc)) to_chat(user, "Target is not near a camera. Cannot proceed.") return @@ -352,7 +351,7 @@ slime_scan(S, C) //Feeds a potion to slime -/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickAlt(mob/living/user, mob/living/carbon/slime/S) +/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickAlt(mob/living/user, mob/living/simple_animal/slime/S) if(!cameranet.checkTurfVis(S.loc)) to_chat(user, "Target is not near a camera. Cannot proceed.") return @@ -367,7 +366,7 @@ X.current_potion.attack(S, C) //Picks up slime -/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickShift(mob/living/user, mob/living/carbon/slime/S) +/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickShift(mob/living/user, mob/living/simple_animal/slime/S) if(!cameranet.checkTurfVis(S.loc)) to_chat(user, "Target is not near a camera. Cannot proceed.") return @@ -377,14 +376,16 @@ var/area/mobarea = get_area(S.loc) if(mobarea.name == E.allowed_area || mobarea.xenobiology_compatible) if(X.stored_slimes.len >= X.max_slimes) + to_chat(C, "Slime storage is full.") return - if(!S.ckey) - if(S.buckled) - S.buckled.unbuckle_mob(S, force = TRUE) - S.Feedstop() - S.visible_message("[S] vanishes in a flash of light!") - S.forceMove(X) - X.stored_slimes += S + if(S.ckey) + to_chat(C, "The slime wiggled free!") + return + if(S.buckled) + S.Feedstop(silent = TRUE) + S.visible_message("[S] vanishes in a flash of light!") + S.forceMove(X) + X.stored_slimes += S //Place slimes /obj/machinery/computer/camera_advanced/xenobio/proc/XenoTurfClickShift(mob/living/user, turf/T) @@ -396,9 +397,9 @@ var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin var/area/turfarea = get_area(T) if(turfarea.name == E.allowed_area || turfarea.xenobiology_compatible) - for(var/mob/living/carbon/slime/S in X.stored_slimes) + for(var/mob/living/simple_animal/slime/S in X.stored_slimes) S.forceMove(T) - S.visible_message("[S] warps in!") + S.visible_message("[S] warps in!") X.stored_slimes -= S //Place monkey diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 1dd4f05eb97..f7798df7892 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -139,7 +139,7 @@ icon_state = "bottle19" var/being_used = 0 -/obj/item/slimepotion/slime/docility/attack(mob/living/carbon/slime/M, mob/user) +/obj/item/slimepotion/slime/docility/attack(mob/living/simple_animal/slime/M, mob/user) if(!isslime(M)) to_chat(user, "The potion only works on slimes!") return @@ -149,7 +149,12 @@ if(being_used) to_chat(user, "You're already using this on another slime!") return - + if(M.rabid) //Stops being rabid, but doesn't become truly docile. + to_chat(M, "You absorb the potion, and your rabid hunger finally settles to a normal desire to feed.") + to_chat(user, "You feed the slime the potion, calming its rabid rage.") + M.rabid = FALSE + qdel(src) + return M.docile = 1 M.set_nutrition(700) to_chat(M, "You absorb the potion and feel your intense desire to feed melt away.") @@ -272,7 +277,7 @@ icon = 'icons/obj/chemical.dmi' icon_state = "bottle16" -/obj/item/slimepotion/slime/steroid/attack(mob/living/carbon/slime/M, mob/user) +/obj/item/slimepotion/slime/steroid/attack(mob/living/simple_animal/slime/M, mob/user) if(!isslime(M))//If target is not a slime. to_chat(user, "The steroid only works on baby slimes!") return ..() @@ -302,7 +307,7 @@ icon = 'icons/obj/chemical.dmi' icon_state = "bottle15" -/obj/item/slimepotion/slime/stabilizer/attack(mob/living/carbon/slime/M, mob/user) +/obj/item/slimepotion/slime/stabilizer/attack(mob/living/simple_animal/slime/M, mob/user) if(!isslime(M)) to_chat(user, "The stabilizer only works on slimes!") return ..() @@ -323,7 +328,7 @@ icon = 'icons/obj/chemical.dmi' icon_state = "bottle3" -/obj/item/slimepotion/slime/mutator/attack(mob/living/carbon/slime/M, mob/user) +/obj/item/slimepotion/slime/mutator/attack(mob/living/simple_animal/slime/M, mob/user) if(!isslime(M)) to_chat(user, "The mutator only works on slimes!") return ..() diff --git a/code/modules/spacepods/spacepod.dm b/code/modules/spacepods/spacepod.dm index 0bc9a074179..be21fe0ef9a 100644 --- a/code/modules/spacepods/spacepod.dm +++ b/code/modules/spacepods/spacepod.dm @@ -765,10 +765,9 @@ obj/spacepod/proc/add_equipment(mob/user, var/obj/item/spacepod_equipment/SPE, v to_chat(user, "The nuke-disk is locking the door every time you try to open it. You get the feeling that it doesn't want to go into the spacepod.") return 0 - for(var/mob/living/carbon/slime/S in range(1,usr)) - if(S.Victim == user) - to_chat(user, "You're too busy getting your life sucked out of you.") - return 0 + if(user.has_buckled_mobs()) //mob attached to us + to_chat(user, "[user] will not fit into [src] because [user.p_they()] [user.p_have()] creatures attached to [user.p_them()]!") + return move_inside(user) diff --git a/code/modules/surgery/core_removal.dm b/code/modules/surgery/core_removal.dm new file mode 100644 index 00000000000..21458720978 --- /dev/null +++ b/code/modules/surgery/core_removal.dm @@ -0,0 +1,61 @@ +/datum/surgery/core_removal + name = "core removal" + steps = list(/datum/surgery_step/slime/cut_flesh, /datum/surgery_step/slime/extract_core) + allowed_mob = list(/mob/living/simple_animal/slime) + possible_locs = list("chest", "head", "l_arm", "l_hand", "r_arm", "r_hand", "r_leg", "r_foot", "l_leg", "l_foot", "groin") + +/datum/surgery_step/slime + +/datum/surgery_step/slime/is_valid_target(mob/living/simple_animal/slime/target) + return istype(target, /mob/living/simple_animal/slime) + +/datum/surgery_step/slime/can_use(mob/living/user, mob/living/simple_animal/slime/target, target_zone, obj/item/tool) + return istype(target) && target.stat == DEAD + +/datum/surgery_step/slime/cut_flesh + allowed_tools = list(/obj/item/scalpel = 100, /obj/item/melee/energy/sword = 75, /obj/item/kitchen/knife = 65, /obj/item/shard = 45) + time = 16 + +/datum/surgery_step/slime/cut_flesh/begin_step(mob/user, mob/living/simple_animal/slime/target, target_zone, obj/item/tool) + user.visible_message("[user] starts cutting through [target]'s flesh with \the [tool].", "You start cutting through [target]'s flesh with \the [tool].") + +/datum/surgery_step/slime/cut_flesh/end_step(mob/living/user, mob/living/simple_animal/slime/target, target_zone, obj/item/tool) + user.visible_message(" [user] cuts through [target]'s flesh with \the [tool].", + " You cut through [target]'s flesh with \the [tool], revealing its silky innards.") + return TRUE + +/datum/surgery_step/slime/cut_flesh/fail_step(mob/living/user, mob/living/simple_animal/slime/target, target_zone, obj/item/tool) + user.visible_message(" [user]'s hand slips, tearing [target]'s flesh with \the [tool]!", \ + " Your hand slips, tearing [target]'s flesh with \the [tool]!") + return FALSE + +/datum/surgery_step/slime/extract_core + name = "extract core" + allowed_tools = list(/obj/item/hemostat = 100, /obj/item/crowbar = 100) + time = 16 + +/datum/surgery_step/slime/extract_core/begin_step(mob/user, mob/living/simple_animal/slime/target, target_zone, obj/item/tool) + user.visible_message("[user] begins to extract a core from [target].", + "You begin to extract a core from [target]...") + +/datum/surgery_step/slime/extract_core/end_step(mob/user, mob/living/simple_animal/slime/slime, target_zone, obj/item/tool) + if(slime.cores > 0) + slime.cores-- + user.visible_message("[user] successfully extracts a core from [slime]!", + "You successfully extract a core from [slime]. [slime.cores] core\s remaining.") + + new slime.coretype(slime.loc) + + if(slime.cores <= 0) + slime.icon_state = "[slime.colour] baby slime dead-nocore" + return TRUE + else + return FALSE + else + to_chat(user, "There aren't any cores left in [slime]!") + return TRUE + +/datum/surgery_step/slime/extract_core/fail_step(mob/living/user, mob/living/simple_animal/slime/target, target_zone, obj/item/tool) + user.visible_message(" [user]'s hand slips, tearing [target]'s flesh with \the [tool]!", \ + " Your hand slips, tearing [target]'s flesh with \the [tool]!") + return FALSE \ No newline at end of file diff --git a/code/modules/surgery/slime.dm b/code/modules/surgery/slime.dm deleted file mode 100644 index 77614d41430..00000000000 --- a/code/modules/surgery/slime.dm +++ /dev/null @@ -1,103 +0,0 @@ -////////////////////////////////////////////////////////////////// -// SLIME CORE EXTRACTION // -////////////////////////////////////////////////////////////////// -/datum/surgery/core_removal - name = "core removal" - steps = list(/datum/surgery_step/slime/cut_flesh, /datum/surgery_step/slime/cut_innards, /datum/surgery_step/slime/saw_core) - allowed_mob = list(/mob/living/carbon/slime) - possible_locs = list("chest")//urgghhhhhhhhhhhh - - -/datum/surgery_step/slime - is_valid_target(mob/living/carbon/slime/target) - return istype(target, /mob/living/carbon/slime/) - - can_use(mob/living/user, mob/living/carbon/slime/target, target_zone, obj/item/tool) - return target.stat == DEAD - -/datum/surgery_step/slime/cut_flesh - allowed_tools = list( - /obj/item/scalpel = 100, \ - /obj/item/kitchen/knife = 90, \ - /obj/item/shard = 60, \ - ) - - time = 16 - -/datum/surgery_step/slime/cut_flesh/can_use(mob/living/user, mob/living/carbon/slime/target, target_zone, obj/item/tool) - return ..() && istype(target) && target.core_removal_stage == 0 - -/datum/surgery_step/slime/cut_flesh/begin_step(mob/user, mob/living/carbon/slime/target, target_zone, obj/item/tool) - user.visible_message("[user] starts cutting through [target]'s flesh with \the [tool].", \ - "You start cutting through [target]'s flesh with \the [tool].") - -/datum/surgery_step/slime/cut_flesh/end_step(mob/living/user, mob/living/carbon/slime/target, target_zone, obj/item/tool) - user.visible_message(" [user] cuts through [target]'s flesh with \the [tool].", \ - " You cut through [target]'s flesh with \the [tool], revealing its silky innards.") - target.core_removal_stage = 1 - - return 1 - -/datum/surgery_step/slime/cut_flesh/fail_step(mob/living/user, mob/living/carbon/slime/target, target_zone, obj/item/tool) - user.visible_message(" [user]'s hand slips, tearing [target]'s flesh with \the [tool]!", \ - " Your hand slips, tearing [target]'s flesh with \the [tool]!") - return 0 - -/datum/surgery_step/slime/cut_innards - allowed_tools = list( - /obj/item/scalpel = 100, \ - /obj/item/kitchen/knife = 90, \ - /obj/item/shard = 60, \ - ) - - time = 16 - -/datum/surgery_step/slime/cut_innards/can_use(mob/living/user, mob/living/carbon/slime/target, target_zone, obj/item/tool) - return ..() && istype(target) && target.core_removal_stage == 1 - -/datum/surgery_step/slime/cut_innards/begin_step(mob/user, mob/living/carbon/slime/target, target_zone, obj/item/tool) - user.visible_message("[user] starts cutting [target]'s silky innards apart with \the [tool].", \ - "You start cutting [target]'s silky innards apart with \the [tool].") - -/datum/surgery_step/slime/cut_innards/end_step(mob/living/user, mob/living/carbon/slime/target, target_zone, obj/item/tool) - user.visible_message(" [user] cuts [target]'s innards apart with \the [tool], exposing the cores.", \ - " You cut [target]'s innards apart with \the [tool], exposing the cores.") - target.core_removal_stage = 2 - return 1 - -/datum/surgery_step/slime/cut_innards/fail_step(mob/living/user, mob/living/carbon/slime/target, target_zone, obj/item/tool) - user.visible_message(" [user]'s hand slips, tearing [target]'s innards with \the [tool]!", \ - " Your hand slips, tearing [target]'s innards with \the [tool]!") - return 0 - -/datum/surgery_step/slime/saw_core - allowed_tools = list( - /obj/item/circular_saw = 100, \ - /obj/item/hatchet = 90 - ) - - time = 16 - -/datum/surgery_step/slime/saw_core/can_use(mob/living/user, mob/living/carbon/slime/target, target_zone, obj/item/tool) - return ..() && (istype(target) && target.core_removal_stage == 2 && target.cores > 0) //This is being passed a human as target, unsure why. - -/datum/surgery_step/slime/saw_core/begin_step(mob/user, mob/living/carbon/slime/target, target_zone, obj/item/tool) - user.visible_message("[user] starts cutting out one of [target]'s cores with \the [tool].", \ - "You start cutting out one of [target]'s cores with \the [tool].") - -/datum/surgery_step/slime/saw_core/end_step(mob/living/user, mob/living/carbon/slime/target, target_zone, obj/item/tool) - target.cores-- - user.visible_message(" [user] cuts out one of [target]'s cores with \the [tool].", \ - " You cut out one of [target]'s cores with \the [tool]. [target.cores] cores left.") - - if(target.cores >= 0) - new target.coretype(target.loc) - if(target.cores <= 0) - target.icon_state = "[target.colour] baby slime dead-nocore" - - return 1 - -/datum/surgery_step/slime/saw_core/fail_step(mob/living/user, mob/living/carbon/slime/target, target_zone, obj/item/tool) - user.visible_message(" [user]'s hand slips, causing [user.p_them()] to miss the core!", \ - " Your hand slips, causing you to miss the core!") - return 0 diff --git a/icons/mob/actions/actions_slime.dmi b/icons/mob/actions/actions_slime.dmi new file mode 100644 index 0000000000000000000000000000000000000000..acf7a31c6ed9f353ddd8c63149619c3c4d8ff8b6 GIT binary patch literal 4717 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 literal 0 HcmV?d00001 diff --git a/icons/mob/slimes.dmi b/icons/mob/slimes.dmi index 0ef5ac0bee4c0c3cfd1d6279d67b7688e53da218..f9998d6f1061312c3bbbc7b469f419df86ba9d9d 100644 GIT binary patch literal 86112 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