From d532ec9712b52f2a8620ffe76d136b367df356cb Mon Sep 17 00:00:00 2001 From: Cael_Aislinn Date: Mon, 14 Jan 2013 23:29:53 +1000 Subject: [PATCH 1/4] add+fix missing files for jungle away mission, re-add missing atmos and security rigs, refactor and cleanup rigs Signed-off-by: Cael_Aislinn --- baystation12.dme | 8 ++++ .../Cael_Aislinn/Jungle/jungle_temple.dm | 2 +- code/modules/clothing/spacesuits/rig.dm | 41 ++++++++++++++++-- icons/mob/head.dmi | Bin 121604 -> 121562 bytes icons/mob/suit.dmi | Bin 264528 -> 264525 bytes maps/RandomZLevels/jungle.dmm | 4 +- 6 files changed, 49 insertions(+), 6 deletions(-) diff --git a/baystation12.dme b/baystation12.dme index 44326b7ee9..b897555fc3 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -1163,6 +1163,14 @@ #include "code\WorkInProgress\Cael_Aislinn\sculpture.dm" #include "code\WorkInProgress\Cael_Aislinn\shield_capacitor.dm" #include "code\WorkInProgress\Cael_Aislinn\shield_gen.dm" +#include "code\WorkInProgress\Cael_Aislinn\Jungle\falsewall.dm" +#include "code\WorkInProgress\Cael_Aislinn\Jungle\jungle.dm" +#include "code\WorkInProgress\Cael_Aislinn\Jungle\jungle_animals.dm" +#include "code\WorkInProgress\Cael_Aislinn\Jungle\jungle_plants.dm" +#include "code\WorkInProgress\Cael_Aislinn\Jungle\jungle_temple.dm" +#include "code\WorkInProgress\Cael_Aislinn\Jungle\jungle_tribe.dm" +#include "code\WorkInProgress\Cael_Aislinn\Jungle\jungle_turfs.dm" +#include "code\WorkInProgress\Cael_Aislinn\Jungle\misc_helpers.dm" #include "code\WorkInProgress\Cael_Aislinn\Rust\areas.dm" #include "code\WorkInProgress\Cael_Aislinn\Rust\core_field.dm" #include "code\WorkInProgress\Cael_Aislinn\Rust\core_gen.dm" diff --git a/code/WorkInProgress/Cael_Aislinn/Jungle/jungle_temple.dm b/code/WorkInProgress/Cael_Aislinn/Jungle/jungle_temple.dm index 81de9f02a7..c34cce4e3d 100644 --- a/code/WorkInProgress/Cael_Aislinn/Jungle/jungle_temple.dm +++ b/code/WorkInProgress/Cael_Aislinn/Jungle/jungle_temple.dm @@ -235,7 +235,7 @@ var/obj/structure/closet/crate/secure/gear/C = new(src.loc) var/num = rand(2,6) for(var/i=0,i!^9FD9#5XM?)HG57_a)JxnfEe4sBjsHqCy`6%AF$X5 z2rFsNOh+P__~}v|sgf8GC%@1(bBtkJKjO&9y19HXIb(4y=JIbD^{>5@cdTzO6AHwB zHhHSPw+5QV_M5^p`E;fBC0nulEae`J&Q?QCx>Dy3y*s+`Kb*K8MfKHxt>dzSliMK4 z+zs20GJ{*4HU1RT7dCK){dM}YwwK^@V=Q-+nqP2>LW$-w4%$wEIAWwX^jYCJK#H(R zF=#x$bk)9mw8O}8R;}%*QZnl>U05Uie*FDRzW{K&Eh=T+e)|q9g|8X6Aiv~Z{>wgU zf4eWLR+cx{B{RB&DFz7ZH5+B0{(3;e`;6-)T14i9JgME%DVt+L`3+?>jxq4UX4Yw$z3c&xHyctjI%X8ET{bayh80qF&8{sD zRvg6u7d31BuP>btbFZp3+tN;%{f=*prLBe& zBmo~|Z(_L0yw`&DH;I#-)Pwa4Y~_bGDU_VKM3`?F)(zz=wd9VkcoBPQ+^M!|Jmp#H zCWs1V3pD%5;!60H$;6+CZ?(9$ z*HQ;M3$FpKAChIi)2??F%9%cdsCJ&!*<|4kR*3JSdg)YX^VdQZyMKIWe=YIh1#A@6 zkBFK#i{Gvi8Mh*Bk~Pt@>=Anp*>DghUAsDs4fC25PT{0PmJ09%w@!XxR4jL}xe;vy zOb>}`H-)$=2uq1{&Cs%q@VANn*&4HKdg#Vf*YN6Wgj@f|PDnZwmH*QrQd^N!8MwKl@IdeOAz^iIuZ=EUG?J{D6HG$9k z?|uQ(wL)Ku4n4Q!Cn`S86l5hN*CcM20*rztdiBq&CT;Jw6btb2?xia))(@K(nT62I zagkl?jM}57b-b{)e7HvcQMFS6aVt3K@x#4;Z$gIayt{Adr$!zTq~LD3ykwdx&m)y> zC)choxAp-0h3V|nf<77(y78y83MN8uKsffkDoftzMjU1e((pSzNKkK{NkoMah{NVn zRPKM9xn)!!ET+ng7&o1h7Z9yNsc_RJBbzfGo+t0!CY3r~6E%G8+mrkJmV;({9l%@Q zdQloP-_LM zc!h+7gPYGVx7zZV+vKD5l;S750Cu9xuDoWlJXk>aFNfpg-#Bb_*0f#rA&c}czi9J` zMxJIdW2cX6=sCje)P^@-#qP=XYzQ9G{PDFfnNuAPFV!?<-H__@djc(xL>lSKeJ;Dp z%5K0EImMZ9Aj-AGbNLak>q7H>tncipK6Q(6bFPrvX>wXs^5L&>BAzU>T50c)2bgGO zX=auct4JT_z&zWcc3@(_&M1KQgZUXn?|Kz%ePHSNHmW-bne}-X(YA=EwU&jfX-h=V zhK-X#$4Ln`gMdYp9L_)~@{awd&~M_eUuz0J@4rULXysQt{-ogUAIYIhB(W_yVHSPQTSQKq|fUYrs-Q}fdR|Lp8!|4>sIRiqCh*kgl|Fewi zOiUB7I@TY8&WG1E0t_aJ=Y` z{I!c&=&6$3b1pVOmO!48sWKG0Osb*ij! z%&3AxCzyvSCO=1K9X{9w6v^`f@mSQ3>q#Lm@uIs384dG0eB)-@YuF6>2_awjA;pOe zEO(t_W_RD3oa6rgj)Uj)aCUyR-Z$S$G`o!$G?<2domm((?M^tINtOL&;i7XW9gzFj z&?LzJ&+7S`|GDipAwOvAWXs88jcuTx&P815;^96%ZX9`bebG6RE|;bl=I`8U?HY+% z21hd_yX5<#I)wA$?M^>={NV^0Q^bwVp|}_)@$pg0l?-TrqjD9A{dDAkTFVNGwTb^fLTl>YkXC0V|ki)j3<`wO! zO}n|vwu+KEhtOtH1Tcg{p4|WZ8iQ#yHuXVF<8S3B+Ga49*1KWy+|_{nR(;@fZyG4M zT5>wy;(l!x1>Kz{9>Wja$0Em!CuG_wC@AcIf4si7zHSbM+buNJVXEF0suP$&;S|)= z_hn?#p@^Wg9h&ycGkCqzwczpX(l;=>@q$_xMBCgh(Y*%`ivRq1(b?5CTWL;|laup3 zF|pcf-@v)`OvjtG{bo-|O}#p8vmbC_T<^#dh&j(!2qT@@_wqa2d2V9DE-5L=XVg$R z<=ON3`q8Mw&GUgD1C(KaFk4Ve-r}m@wudaW^~Noncv9TwH{%sls{?W&tYep^4}`=x zjtes%pxRPQ%7&*%*V-;}bDTcn z&0>E{iI4cHI(t3vx4^jfH8sIvshr>W?oNsWt&SceMgSyQ&Uo|lvK2>#7Q5x%9WD|wSPI>)`va+%$P3aNg36pxh$!cCMH_i zR@l-a;|*~d$qtbY_S%{Fq@E!qg?}!lghBjKr5gqC%%$=U)FUpX>B~+5d5pSH?k>Nd`gL%V zV}|TKR{Ut7?s<8z*&A}#$zg7oyfl=$U3g!Zstif(=B9x13Bn)T%r{I;M4ZX>T-%B0QiFi_}??9Sw4i1Xrh}ZHD)L??+s{uK`0*6a3zh>{AZj$Gwj^yX$ zuuM6Q$;-B1DV}9`V=V~j5Jlkq`}YredC7#ho+&F^R5hsUdr4*3rbfOk5BySKcX4@n zgh9gSSy=2|1VR7+Kz*!Hr-kVnd;T!@e7fx^<+<~_-U(jp_}*A-wKw1{<3w-JJ35$E zX;{Yd?*JS2D@uLim`bc`7nUR!)``AOT)IemUbdI_{X0_i5BBI@{q@Ksm>E_f@y*;V zBe|M}WS5{?|1;6U`XbYnAHq~pfmB1s$eOtnaYB|e)s_#B2@gm%?+Q!`;4xu@IcvmU zTy#8{hUXT2sKbv=+fB8X%5O`Y$=iD@P3&rwy8s(ego{tM`{T9prufY{WCSgV>U-|X zxXOH_5SAJ%@>K0oDzd?zJayIz96r>n#oyt_oDv&xmTLAhI?j2(}?Yx`L~l`#atjf(K1_6y$@S2ux{e-<(XEwlr8Yv5^NcpGMaq;D)4JPdpiKgE-x{MpRk)-JaB4uw`D-Xh?84Y~397k;2nEPfgqzq|YRMMMAhW0MMm*SX`M z@QUB6=wSh99&I!KB4B;iikpbjK1q^bpe6{mzW58t$8qLjfJ-sOK3WFIH^Sev21U&E zwzE9ooJrE6N%y-W`oz^QPFeS+PhbbmQ_jt_0%L>_A&XNgG(lDUlp#;mlxvD!e~zI| zeQUaj>ehvb>`cYZ1R~x^ndLbILT(Ed*p-B)KIPK~nFd5e_8{?r(hxFQ zCe7Zst}!LO&xz(?1mpnnEX?7P3cmjlK=tJGpsFwxPDj0o1Te$r0M|}d7xHsOga6jx zUJ8!mMt$4I^(G&KT33#5^Q0qq7Mc%UYzHlWOpz=>3wSN@L_Ch;Ame3cB9l29u*L2( z$l`sh%JzXI5$dt|uGnPUH0FeNi0n!ozcX7&*B+ z@N}NMd0{B&GouiI3(zUm%VA*&^7PBNJlQ;1&wUPJ1j=t3UI5i5*9<&8)W*MhA-7Fw zu+2SQi`LDgHnW~YS?UC8D1_XE4VSx^9F`iDd@y{rF#2>OmC|(cz4e{eH)WrlT%2mn zttp*oIDnO}4VzV>UTg%m4o00^Zo}gnhn!*quZ3!HlX7??&b0$mR01X_FOk0iy_rQ_ z2D6(MvOonQot2t(%pH?cRw!XmW`m|&!)(iTjWs@8x>s4}n}^Zo2i#r=l;s+`a201k z(?RzkRTK6U#fve8X5ofDFS9_@sEQG5cQILj=GpKzu^Eu4 z4PBu54;n^qRKzhTedg~ei)S=65_PWqBZXoV4%^sNWwiS&ckxY)g>2rGi89H$wygM8 zrqi+G?h0*N={u%QKaZIO$bbeA_kC3X^7A&WMG)HkCcF6Cf$P$zwfPt{nP@$)Q2tKW9>!1GyS01O)1nfQ-K9| znmcbM)855F8i#~mZBZW%1s}cJhS?wsW+R=Hqhy-I#}otV_IuS-Bp5|ifRq+0uwzIbmR=s_PT786Y<)*CC4%QhHW{n2{WwcaYHTe`10BwjpIyDd;KA;2T)_p)DL z`rmvu*IQLOr0uoPPt zC2KGNx+NIIbG0zy@?dzGp*R?Cbbsf0H#9r4)iG0~xm5MOw|J_|a6I6+fA13R0|~-o zy~`U`07_JMWx6`IO5ANBONN;f5Mq*yr(+tlu&DEOmRo3uv^qvOOczUC`7GgHJd4}oCtS=^Zy`9ml zXqi&b;l=WCTeB69TG^Lq6c?JkI7NQ4K+Z$Ej9A?hIGtuQj#@uVj#e@;G=ycd%L1pK zZw(*IdkFEGlH8h+yeJSdavWq=9`NqaoWhG7VB@SY!d3Caz=i1x!Bs;{@~PuJ=F7@EPJIbdU{v_ zRa2~_>)8o-VxoWGZ5%N>aAN9^JH)*@SHK8Qzxky9j18#$*M4MI*TH>u;{E9`bbwAf0ZfeP8!vv0N=DZ z-gRGvOq;_pH;IW3?igio&bYH}@sgPhU!S3%f51E@WDr{?Yt!`K{RH=en7#~E@3Z54?0uJx$f%_2elP6{IZ=5#2L2c2Kk)05|P2cCXYUAWIG}fR!CqD=!_AR3VI48CqJu!W? zAV;}3c^{;n_wU^+`u+Qv)l|d?_$o<(V8;c3Z!`ZteyT>##Kd5H*?)5MxsCF)BaF#g z6xiRP3H}l0{PHD5NJxktpG_J&1H&^nwdoU%vD;RQb%U+=s8^9^t@u<&6D!WK7SOCFL0ncW&Nq=@0>E_& z*}A^r%-N=}pi+~-gYYvTkv-It$$&{Ya;P}Sd;N@tnLUUg=;}zt`{E3R>UD-T%OxMm zkm&<$vQN^JlZ$TLxH0kZI@b`z@P7pdHx?;~Q?U8NgNOK?{mbxcCd3Zi(Kih&EOHIN zZiz^#F1mn|S5N;fyDclz2p{m`+)UMb?N+}tSBcvX^FjFez3uVgcBq(>*6S=RFF|$<$_$o$-+2n^v_bu2!186hZiZpwflb{>t6f?+>NPVy`Z&G# zZ$i5C-j2r^j6n_6#JxS4rFLqqnKii$dX ztV~5EG)-g$*Y24C+R#BD%xjv-0~>U+E#nM)dULUA$WQpSe1R#??6KnP%?_u$yAwW)?Ruyz)(_V#U3u zx}6n*>YE9mhDo<$x{b!I*-2EXDpm?k8HXWt#TU+r)zWaC1u;b0vW1{VaU(P$$67}2 zWu3!KWmLKGj2=Mvw9mvG9@+h7an%{{C_jB_o?L?!h>j(o-_kty*2O>a2Bn|6cH z@Y64AEa7J*Z-LztWWDWZ=b@n0srCb$d)8R(2aV?1X+E3iE*ak3cz;+7j8l22u3c@rg`7NDG5J0 zhh0QtD|Cp>GT6P&Fxvd$25M}^lW^^Xic-fZhkL&-OIHMp*rv#Wx3?$$;H@+<`Ug>t zWP$`21S`%l-Y%GG4(|o!g_{-kh(GU46=`z0h%1m!zd-WKpBy7O2x;tIXWUTkmwh@5 z!*Dx;@z3rvWAE!=eZK|(@O@=?G#$+HCXe|p-os(mRk@_K+favteMgT?29zNiscV>lOF$I@5Eu_G+BK=|lgUiAwR+FnYaT_{r$cfZ3Rc?3k(mPkW%|<3`HbB8mcMbgZm;PwVm!Vg_f^gzxDub*+StgLKeinzP_(ho;(+e1h;7b#Eg&qH$YsZ_JGV~ zlPj%CF+@;45siKNoova#_d4Hlp!mEi(Z3xN6mCI{Z6|b@X{gn&K8XAb3~yiCRs0X; z(B-O+pY&uN`(N5-cVtp(e7kOTWOE;c|K^1_*&9?gw7%uP#-CIC2cdQzU~0YJub9n=qx!$1 zbygE)?V$BLYC^(!L{j39uiw6{&~FCKIo3ar&+&?o8$?s7WIXP!!n#uej}*s6g7bKI zcsfX@1OVbx5NFz&t_QIp6`QLGqNZEJ&{zg}*H^FlH1l@AOwJ*@3liXtVJ+kp@b}z! z{cZ;iJ`~w4Ti~$MIF{Vef<16ArPpbdl21boi~07tn4{tpqZMUuwt<~d;Fs#|7 zpFE?YopZLp7T@)9#D_Y;p+qB4jjRVcC3O!)Me8&@r=bRA&j&%i+~Bn!1+nl)0534k zZl?!`kAQQs##Ft0lZULnZO!bh{GUG=biJ{uiU1Z!EgThonSvu7fxE~*h36n#=;+Mm z(ncs&dwz{oKS80|j+c`jJKKF*Ay^uu7koe`8-5yc^4gHhZCdSZ`XU4m=^@fRzZ=-= zak2wt-rDh&^N?X-uJZf8uR_Cq~KH*~mSh zOvhoAwZ>Ysh2kMUfBy9bRO^C?FU97ScaEB?qUaM)`LWrYVe{jK@{-F_9d@iUr|J{0sX(Ym-Y4OrJCmt+J36}HHrW9*etgL{UOf*nelVQfJ*DO z4_&H9n1X!&P@ITM>*n$F2YBHA0%7THhos2442W+&GECa|Q@_0&dL z_^kF`9#rrzG~dDj$=|>KobudhhXD(NE1_WnzT5Y$<2i=?1zOrqVfYL%Fjw0BpE*FE zZZk0596bQ$9DMKOvaLGXKeM#7@!Fqz-W5qLX`n~mvj;4|YP!ei36f8`Sg+Q9Btd3s zY-q(7JQ9{MCTW8O8v`j_hAyzdXe7*LHu`1&?sBsLiT7Ld;o?$``?(n_?&pa|T_JEi zAg34rZ*-c&A$9Cn*+zT`kIsS1uTVok%-l&`?p%!3+8#2`bX-|4i((8lB(3o? zeOJ+PKKz(+Gpe15!g)3vbO1G%u9%1j-UciBAo75(HcSy|#%*&(W7^r^f~2IS-2^!j zpJCg4>s0{(5ji>e9RY#i5sfZJKE0)&9FRk#>|cBx4H9?VnczXWM^XzPWOY0}24{Pr>6Xm|x;v1w~$H~L&b&r)@mNV^~F4x92 zKJ88Xt(;!8uKAVj1aGkULnoVZ1w4u$IC!^|P|FQvJNKZ$(Pu?SKrWiblHe z%ssjuQO>9E3(c8^;gy>ic}q!r4~Ynay)?gMJV!4)h;2W}_-Q-Kl3Q(jt&PCT1tJ*0 zAmMD~I|8dudUQo-=^2Tg{RtIwVVGxi6ib@}Q(++ZJbU&m`@6+-xv|II4DeMciblwG zb1Ky784vS-`Ceio_Tl=qGFQrS9ngtkO3oez84#{`Xvlu)?W(suNdGo1@*)Ou4kP zMRS$dm~fw^8S?R#$mDmlK0+oBLfTvF4J9z*pi0(+Ng0oEj_?3HJO&>=R1v1J`r~* zQ1g)hr?q4T59pL;yKfGai$Cv*k!C0$J%v$91FmHW>a>}V>g|atE@hVxDbGFf*;x-i zx==!67e$RsiDlfqmLV8LvTto)SH`OK10K@UiO4;^t=lBAO3MukXRRSC=jw0KoI?kP z&2p^gMB=#De!Ka%%BY<}(`?$~q@$u7`u0BA|QX{6~IicHM-1ebo956vv!j(Ra& zC!hZ9Tke9-YV0Pq7O{mz)-5m3<6-#zPxRbxUX5legi*$O$3{P?midkZ&JM37H{r|d z5hZeojlMO@n8ks?v_>h3WC9{*sm&_D+B&rff3k)|BI~e-Dn#69p$p$D9-VTdzd#^x zd|jpVZ{$SW=Xez&1FR<{Bn58dausNg-?Vzqbk^DU>pMbG>bt;p`y`3E<gL=v;va{7i&^v?y943p)0LcOLluN#lXm9O(nW_vSf%k6J(FaOzcX%ww%jOZG^h zj)eR!1+I9_nDUC|rX?H7ZDm(gT?k5fD?ORHbUR9+S(f-B1)4&CJft%AWm3v5nDpM`Bs@i~C`Pve<-!MOF zy%aV;XN$x_UT}ObU;)6~j@u*SjwgZgsXFv3I^%{K)2HXYq@J3A_MPVy1^d9@JSs8q zhmg%sIxh-H5t?50HGjZ05k75-z;6S)1!`$}Q0rLTbHI=FRezr)-X`=~MC+$d9jOis zV-iDZh(<7AV?2=CF)2sfvIE1J#I+-W_Rb?|stRA(%(?_1^Yw^5d`n=W8Zr-EXL-=N zH#ZY>IQHV^lp8Tei^yAo*M5>}yYS-}J11Y)K0^byUv}${iy9^-*WPCWz?4P_(p&c0MgH2enw!)Z)uJd#%a9qWU5oQFBaT z2@l3p7}W~)>H^d6{8(=D;=pcsP`jcDcG?@OMQ;KOyO*l=_kE0u+b9Sp{^oCxjFv0Y z*R(dG3_@oXQSKTd@C4O(;f_uUX@T9Ne$l{&3_v=q?SKZZ%XBp`Ng|hUY8mQfGd`Un zJMU~8sBx_qX*LzO`&VY7*8#IWpcGiEk19jilf#UXJg%3f$|IHtB@EAct6hFzgj~Yg z?Gjce*X$Pk-M9A9)~{Z@ddtblSsK(jaHhHU@D2~D#gi>m5Ff~P2hwcza*9NM;kP%H zfQZP*5ANHO&Ei2pL5}kcqhGwhoPDvV z!}JX}R6zHsWMbO+UJ^Eou1>E^TK9Awh%NO!0ko}-Yek&q)_k;mZkuE{Ee^SMZu#7t zpV3B?riv=ZQ|TT~#y`JB@;mii(}OeE_wNjYU=T4$`@?Oxx;`M3qBl6CWU36-q!OgY z!yA6slv;}=Lhb>rjmZ7U5+)34fA!*MmC6TiYyfG&KSs!%3SQOzJw%IcpG^ZO;Ayk> zDqbxpb)ngNe4PUz3ws<|=L8pX#;K;R;pDoT@Pi3ihi1t0%uzUG( z{iJN@5v~6^)H((?_3WP~BFP{dY(ej#@NHBOghr*xPBelpm)9BzwALXrKz#H9YsgC0 z`;*2CoD3AOnE|S;t|j!uoy}qqZcFMO?F^)h zp}@yoFbE?6?M1v8IXUDG8okRR=9s(}7O|XbP^$Z>!YkXZ|3OU5_|UdHSQGa;0R(@r z`e=Kh8S1aZ7k(X-3AJ9lAV=#C)yp%JICXZV2s)>K!vWj_j8Ku6-JY30R}wS*Z<=z3 z3%&&d614T-8)DA$wilR+f4(;;j;OR9z01gN@Y@u3%=Ah<-E7g&MQ9DcsVw3t-dVEk zmDw%nHsBwg=<-a8I<|J5xKXrsYJr;;r=Z{$+}|2Yu7^}#L2}@=H~)7>)IksH$5O&! z&{YI9y0g@|J)WJNZIN;>VC3Ksz-lD(1}@3Orl^=3(cdG!#yP+^*CI(1)ir`Lefjd` z&L{57J0c?AS8^@x-o1OVz5}AlApxz-A;j=WjUJfb-2)J zABw`Rs?!8u7leZ6*y;8VqAK|Q1qM^&ywF4$zi^2FaT^~ri>Dly$()$IG<+c*+VrgQ z1E7j}SV?SV-j*yE6it`pWI`Il3(J2CW&P2iak3_IZ~4AU=AqZMa5~usj~;!7lLFLF zT855Rd+pAqc_37JhcvEUc*D0wijIz@%TA#8HhUwXU{U)P1e{LRCoKz*WqOd%nXdaU zQZ6_27BF$@zP<}iS4(y;c|tC(7PhjA~q`T-o6c`E;c3?(R_71z?17rYB9pg ziioDdpX?076TI~O`}aKMiE@gS)zzEwNso>H_<5K3`%ZKj&ooV*wSHBYsF9TiOCTfy zE(C)Co-z-(|_k(~KtM1nJSx>x& zWs9F=AsQ39iEMonm}k6nCSHQqheY{@kPZSo*PvErd1h+6H6=0>9*i$IcVCQY4m3Tr83}uwX(;? zO<*SYa<4`sO|OhC`t7@StlBnCC6fl<;kGti&2Xv?iz?T{cG)@a&w1W>^lnQ;ES;mBz9>dpaKx8cGNn^)yt-{0s&!RVT~t4(wFGn3Kn7Om_9$IX}_1kxlOy?y^aHB1Ia?g`Zd=7 zd`bXzb)0@axqip7&R|mAY^gou_vS{Ei?m)@-%oLQlL{E0cvAh3L_FoZy*g`pzq`BL zJ3DiBTTty&6y-ILL(%iP~J4ec#)ftk}lzPHpsxe?)Ppg1eAE; z_3QFfbVOB>*w=<+^(VJLfvSJG zOGG3$fCJwaFy+A?So3~VBo+!iU*1P$C%jW2wG>Wd_4~<4;8`Hh)7x9}dJLDFdB_QuawmtRS`EGu;Jii17>*68mpl?o_0)zWd05K$uY*E@; zqT6E?ej)HHu6Q$gHdz5YR#aR%hr4X8GU2bFePaft zzj5o8o*r{QB4GT3DjPu40XhZAJ?pPomk`K(HI2q;C3y=*9S5x+T=L?UhGn)*X)l>1({N>VW^_sO0kHe|- zBxL#0y#dSB-i*Kw@hm0?`02hzP>?Jr03EDfUS1YB<6HCrV0$coAYHPiZyzz1uL=$q zeLh?xt2K|~H*A`C3s*e6PpvPYS1B(F>S^6VtQKZ}zF5%_@x;xFkdvErgpx!$LssQt z-nIIpHeiN}B=R~sjF#;m5ga+*$i?3PvyE+F278c3mMk^Pm*Z8(NGkoFdMC-7$`P?e z%}#K7Di+`aEmxB)Axq_h52A3w*fPU}+fp7M4Ue7IH%e{<`_2bw6B2!JSsBSuDwsfO zSBP6#S^XwG4f8$uNWG=v<|ect-jn^kNJ%Vwm5V-niA%4E1L>SmCs4 z<6E^--?&ubBw}YE1qB86V4;tjmjTnlN4&*^60)XDTYfZY$4F?q^*eVv8!GOfz6GSkBo~xM0AA>py=2 zqglwq$B#DN6jJH!2hR#yw&&4{a;3=CkYI~en%CmMIiha?Xe;f;AE2g*Xl2ZH&NZMQRPZLTTFuqky-pTfZh^zV%5Nd3Igze< z094%HgTKuMoLaJA$o6=_WN}xvfE}@f`-$~jc+|V-`jCdH*L*OMMjez2$rfzM&kCTBcp1h z1>)(s)w93nDn$XnQi^bs@^cn__I9_@qCW!Q_`s(Gt7S{^7N}SCwSD;V`t@fan8D<)Aox>m z!FNq(hk z7J++-ZE$CGz(f6qBO>V(pQ{2!A|g4lM;H60N8wq4z2ug#tI8n!-$%;6bUzq2Z=Q~j4DFFu@cGDi* zDUItW_);4O8v$KV8%GHvn4Q$sE7Pgt5>MK_D+Lj>8JcA?e)TGPd3n61CtcFLR#T^> zDUN1MTqe9g6x9Cmhm7@c0p`4|!~+eHW}cC=a=R8pR(^loBkMR@@2U9@HJF+{diMPJ z=;8QnKldpAS--YipBF!OKLQWwcWkVzG~c{gY9iOkUsq0T@+y;Fiu@jR$F=oxw`M$k zalXT^&BDj;49SJwJFI~WfhVNSZthmN)7>zrqP`_K?P)Gpfrs7dPQxNWo__!bqn&gL zjs$J?mRKZkD=HTs0h(J+hwA>lpDZ~!gAi^K#DWTvjS>AF1p_?4YVC4n|N8Z7Ct~2I zUs;ddPy@!aH)kDB#JRR{@VnaLA;}VD&!dB1L&u`8)MjyNnKIy4nhl*FxSn3FB^-P) zd*k)R1}t{xA1?KKp5(GBPKY>6mFBo1$o2fs(|fxD zxn?{AsAE~h#qwp_RY*u`yFJ+t1AF5W($XAkv7l63%t1+cQI{QzQB?c`#zc4TuI%Lm z2mY#5FNPnUO73hA9c3HsO5Z!(%K^ZIv2DZDONS9ZYPRAXd-BUXoXrHH)#nJX07(aL zD;|u1u20NoeN!s@ld&*&i1ThK`ZJ3ok?uZ!cbm6DHwS;FS?Qc+eil_Y?51-7*xKMZ z+`ad6FSlB2fg*M#B(?TuIou34CX3~a0MsSOsj0i2q5nn-PJKlqxTW4|#O|`PekPq8 zF{s5h|MU$8vt6Jd1CTqg8w>_N7a#rklKx*!a2xZLWEB$S&c-O}l9>a5X*$>Xop>t* zFX}z5x)3V10TVs(QqVGGw-Qu%Zg&;juby=*1`z^M8gs$^BzyeRi>y@Azi|7vc%o!6 zNfWh9>&4sYqWSf7ZMIt@IlN+G^_|OJ=%Qp67b$St9s_8fpG|?{6=&*MC;vPEk_v1 zu-F9@cC71WsD{$e8rk?j%I)Sk8v+bQ)JtNo{RD}ElYgfu2?I;d)Q!5{+P_D|hY~GP z@N_{bbB`8EXQ~@P5rSEpIj+HW%XtsR5Db2Ce;61Tn2$-{$RX7^&InK>D^a4a_n4OF^+yMwaxs*&h+7lufMPW6xMltD|Kjj7wYUt6+gCSszqyp-2E5F zh87l&A49`STzn+5xkppv=Rslcs=Ovi(0(_Pzc)eaipB%bu4K>rVts%YnH1l=!a1aS zjEvU2?&B8|bCQ>Dw&~w&R=iJz(aFO*Tf+5z&(qJ>EnUHt@s8qgG9bO<2g|Xb$nL`B z#ahLf`*cpjjDQxnkmU3#umj$=0CeuWf9p-b8+0wP9dFsq1F=K2?6=pVz$lji%0!EJ z!2otx@c)u#495pk|CpXtB%@4&g6gB<4)O2C&niFd{*w_5hl}=s$*n2C1UjizCTE!A z0`Gt5hv*%E3vW@K!4E$)%hc15&vo)5BMVDQnjpOZ$}VflaA=Jf`pEQ8ecju#Y>%$#z!`E?f=1-p7diz22{g8|4r}Qkf0uWZ?>i=@hSof^MRLXhzjWDRz zWpe>ZkgU1`95(hR{8yS==+C0JB`jxnczC%uf*b^V2A;E|09pQ;s2}B23m3fyIMCUG z`(m2Mdpy5RNA} ze%vZ#jsNhdB9=n{{IU}aoZ@|UHg6{&HgBS$`m?iba3T^CCecw*l@@<$V8#%2)WDL4 z6LX1xb@%m~A9HIj?h!B~l~q-vAesa@9h5vRUI25>bPss+Dfzz#mDWYmh?BP^zBP&a z8)o0V{bM3rZRI7fzEYzM;DFN_1@aODTpr z{_m9t_`e86`=2k2-U(camDNsv-Q0y4x@G&VCx6H)I%`iig6SC}D{BV`&rl{FQf7lP z0fZaUHqZ13FF4<>;1i9N)lmJd9%^c&mZO#u)+zTQF?xHRQ$4bZngbF}J)g7y8N{wt z^-2H?cX^ks-^cRRHL+$vn=I@=jCBLtFE}&ac=9x2wMTTbS{2KR`pXieK+CN-aqkO* zVvbRp-;;H#G06R;#IE&~Al*E?@AZJ&?OEvOpKF!$I$1Fv%u}xgMHYEcl^ap%zVOzO zA+=(=`bHnd<+dco>{z3Bt`1mVZR?iO_X=jb68`2Z7k!mj*oU_lHy+J(#vMM0hQsyy zly~p)7#|;;1wOkYAH=SztNB$pwD6m(z@@60O#d49#e{A|1b{>4kKZYR2`O!!O_qg5 z$Sa-)jwfgBt+>FXA*ox6wWk?*%BE{&_0jhdf6)7Ze_rI6{#&5zUOo)T*_L>riKinN zyKCklr8TIF00UAi=*>#_7+S5)3bpmXg1RO1fQpyddb@vs-hvzngT4zEfz^a`h0}{Y z4bo-wDbCxo?LA=J%c#S-W<%840>J+}CDAsmplkkuX@C91L&FRI%wNU^H*vf2nzza? zk5n+F%lSI#-{%5w_ZG`rQB&YKF6dHD0AT0pHXD-w|JPyS<}Ty%!w`W8fe0=0;}&hA zXcR)2L)op#0;;@KML|o+19*E$iO}N0qSf7dNzA-OlSju$@foH|;Xave4$PUBz^(HL zZ(P7I+5Y~psYFOcRTY#^^W3=c=bx8s86c=MS9YQ3R1J{6Hzn%S#g^AgLStZH05B`e zwvrXeRSCk>rr-aZ&hE2GscJe&u$dH=^v(d@^qJa?@agzJtQLqCi2~ttcV%m)6$m}Z z5CzIu|07mQ1cI3Eo^4E^)AOJFKpHRXmP7SZ@ATapGv+|jw$8FT!PO3#Qqw`kBovgC z+djr;P#4J$1L64JOEp`RXL|{Nqu~GlxojR@5$pqlqi)^JlwZ>tnbWB0jCrn zvqxD;He0r<3Q9^2@hkRO;FcAZN(czTaobmPQ~r=tRkbF&;Gyc!rXBJwVfV)|Sa6Vn zCkboU$;y}8YxDP1t5)Bnt~Uf`7(wvSJd5#h*yz4m_ifK3Nh-`2>+>J_xw}f8bMG}$ zoXIJ0`uVqYQ}Y$Qo!>lw*t(cOdjYt-xFyD^irJm|bhrefkSeL(eG$1^kn z8(E(eQR6VbU-__UIvv zhlu6I+F_agiU}b)nmX#-hp~m~oA4kZWAxbFJY;V#v1=FCxKd1d}swXD!K_Rd(vZ+lqApclyRxo2^l<#J!+tOSaH0O7X6^ zv`@Pu8^)S4ekQ}@ZIirm9N>^k@x7lm~?O6(IP+xmI zd?{oy@Nmc8bt32aS&Lm{2;EoJQ)rE>@`jFS)FiR zQ}`NK{P^775~w{ly+^TM0*m1`Kf09KjkfPKecPcgts(SQw~C+2_M9SmB1Ibe2=f1C ziXZmYo_uGm_&WhS#}utP!u^FL=V<2`-HHay)$1=*ZFuj@(*D1%%pLyKIzv-z_mK&I z$_!Cr;kHpqR^%GRuJ9@$k))jKm=9(rV*cjQosFLU+A29)_wP~>P0rBSf<%0LWAiBH zBH+2DtM^4L86r>)J5mhF?^n}yo-U4_3qh|13t)#=N?eynHb<*8U#{xnH`W?#*iGo3 zk;P43bDr?{dAK&311Od8Iw3p&*A{v#MDzSrJTR}v=3KBMBlQZql^u65f~PKov)d}^ zbcA%Vep^s36}1@F5cra}l(wjIBT+med<)#n#y5F3Ori5m7-#nw6fb`uVC2-$LLPXy z?Y2bkK9h4Oz1nj0forBp_x{wjc~au$;>o7fc1vhn&p+5bax!v%F=Kv#lOQc$za74V zY$~B&fi2-5p=;(daVOKEWTV`4?8CKID}moZv2tA?xgI%Q&p*vuj-Ye4EdVDZ5v?va zRC%qAq!bgTD;JziFkQg*kksQw{w%rKY1D7;`O|e5>%|&3nO}rB3lLH{@)#>}2!SuH z5h>IX`EZcGih3FM-PLjlXZmv013hknegq?>JJO>wl$?WMf5LA5UQ^Qfd+&(0a$D=+ z!!@Q(hm~u_Apn1QhZp`G66T9wNChJ2#woeZgg$=Bf8OKg6~eAO zG2i!|SC&m;(O`9?b%kFEzD@M(6|KTEzbSo$Td2eSORAaHDg`2@Lng3Y*%AAWAGSe+ z#($j~u}Qs87_UQTe(sT@!Su=~tCRm2`bH{R%5Le9JmkXj?z*j#n!8T+MUrAl4V~_Q zoF{TxYZ7`A8g8<0(nn&i8Jf#s!e1+!yk0cwS0nYf=8}+l`R*@SVmL}8l!r`R8dv`5 z5mEc+z@Gbl2=Umpi$dNX)Akr=6vb%+E<^4xZ?=&<-sd~f){kR$ zQDv3TC%g~lI;Otj!8`8{2?mmL*LMR)239<_FsmaKFRnN#UW)r!Q^eq3eyQc;$l~zL z{v$}XKqN^s7v9^lfqS>8p=_kI=X&S38I>G0z2&K045I3iIQQGm*mQO=zb$WMnbK%? zi-#RL_}A&sy}UbP4zcLrYpbM^tseRc5lA)#acr~G;7&}+tnvS-CHFCHT5>!RuREAW?CX%9;%5!Qq zWO$C#Z@*+nr(NyVrVCUV5!hu+gg<2UN1vF!PkNn4P2)UKX6H;Rs?h?ToOl}WrGLPq zYM`3Jlj5DG9nlHJGT~CAsXJ{+!K>g}C6~7?b${0L(Si!N+t)n8;y->f>c9L`?3fB3 z(Nt#lkSMM`H$2eNIKhq5n3-Jg8E}1N8452d5>y|T zO6%_bD@iN;9GvO%#L(1~EbK?0B+L>(6{5;ggH!Zft_`f7JHVpQ1tkkL9dP0m1s=Tu8!g)5a$C_2n*qf3k^F?@_VrQH5u`5eNpE<1bi zR+0b(MDzErDu0PxRe=usQ{~~t-oPQGPd?GYC~{`VJDR^)(bLkuY#=Uu-0s`6iSUJ9 zmgLD&{QY3ZPk+WXf7Rk)72+$;|An4oaTdw>vPUC~TX1}gLOW2F1lH~j*s`>&Pir!J z-HFq;u5FNXQ*Fh*V#AMXGKj9-u{ruBATcO4YtwFtELPIL8i`4>^)(;QQ0b0@aPK%m zpXVHU4~-odxG0h?m(9}$RjqEgj2nMGqHi|cz_R6*ULNswH)0lr{nJ@p!iA&Tc_k$! z_rG&7GG=2L)SRkn&9^Vo93+hN^%*3mq{x-leHUSkR!{5VS^3z=Puddqgu*$gjsu2W7oM^R1jZ=#Y9oh`P7nGc@WFW9JT$#M<^>fQ8|1w zGM%)UD~MM+8dDFemKC2EeM-H4v+qeRvaOABTuD&Pc1?tyVOVB2`|s1z?H?8mEE;RC6Hl7s zZd#wxl$s(t@ZXCqDo-YJdqj%s)9`zr&NX;%>`ZjFhULK_KiM314-QXEasGlRso z7JOrAYm+IOcT%T8l8J1n2QXCo+i7G_>}2MPV2RV;mEyOx81mHb4nK*157Wp5A8ZmBV)m}53A^+=mm&UWt_{NsMars_;W55lWpnY;DGS&~s#qznhY0bcD~3>x zfBpLP^8HC~D1WMps;t2la@FEw_p%`Fvi~zsD0C@@h?z$k`OQr$C z=Q&E6HY{KeZ_m@Rg}izFnt8T9!ukzr6ddt#4%+y}0dTH<-$ev%xyPbp$3rS3d~*Oe zw8BIp%D|8iE%VBbviWBZY)JD1T(RNZxdbsW_*18K^ASHTD=d6@zbsO(U_z!_P2p~c zg{9&1S|MqR%f5)he+>$w?K}n`qzdojc(!bi%LX z#ZLc_&wexb{^PfPL-_2kgCK|S9Q>!a$Fn()jdT)6g@C*LU~^=Kfj<$2WDdEI<@~*F zCG_6M_b@KV8ZlVR>e;8PP-^Z1jm6W#+K-p~h4jw~4#9={&R4KOPxr{QeZOvRGYx=>9gohlTi_ zZ1h?v&az89-Ppid4}NpS+-hRXZbu6N4|Th*mnZ>)?roQBp7&(LTximZ9(jyum&n}N zK}+)nQ9vVp52(x#iWizjPh3lm+c1k6iDj0_AK_MbFpOwvPN$ja4Fyu1>WdvGITe`+ zp|3-rFZVNe2u^$s*WRibTo9)!NZNC|>dZmqUp~V$6Zsy#42mChVjG!i21^ zK-g=!OV6+Hde)Mpp`#tpsbga9=TugUFj5N+K}Tf+6eCrgp!3ZTf4ie<;JGg!r@}k*<>rtU!zGxb_=z{it2SVk{s*J49@t|-(zp&C zP*z9h?naFfI#W)Y;@E~*8E$hF6TV(df}O&zkHo2@{(cdnibD2l|Yf* zu>umtDBZ>@$sK>+^FJ?H7_|f?$!&Akdlp!ylK{I{Q(T1&{wken#zeUk{~xVjiZW(W zk3CK7*U8V^UYC*$FRGfx$w^zZ0Y2dM9dos?p`mjA*{T3=)Yq>+H_h@{sLfa9e{h;8 zA9dq}C_-^RxLZXE)wXso(1MvkH{=yt%nPqGGBDIKY5qsw>~E3jLYVq-yGMqG;yRiz z(7cJ)b;?W(3<8;-KiASIvxI1io`MVfNqgFXVHn+Yrr-mgbUzsE!3TJ)T)@*A;Hauz TSc*_U;H9Omr&g+BANs!lC^Dpo9n#lA?q(NOvkBA<|va-OZsvM7kR(rIpShMY_AYJ7$1k<~#iF zeeb&OTHm+U=R($*IfoN_Kfk@7{p@|_YcWIWFk@+fB5yS1On&^Zk?YFb_|iGD%r7?VZMJl^Nm75r0IlfEO1mW` z&AP%U_jo#*r!mB4V@1q*io<)?*W6qNXR7&2?OddPK-yDlEO-Q;q+Y)KTL8qy8BrGa znxGmlX!<9@^n`*NzIa*Eaj^Lg$ZR5~&gO&x)3XK(lGkMP{Y7!*Z_FmJ7)~%FU}iRQ;953Lt^tA$KAO!@z@1I}kWg2wF>uL!Zcj4U|V1Skr=_Tyq&#eOt1 zBH9$l?!taDh{h{1Co1}j9*;>HT@KDI>?Dq1wF;xO%?%7(Ao11hc8DAq|7s}kH z`THO63TdW1flPd_AlEqBR%V-@k_PKf;u!i!ezqjg*I#H1EKoShVoae~eEG!6;dwxW zdnTbuF#lHJ>k+O2<$*?t^QLGC;+mf7CsgT&xVrFuE zu@c(naCd@El_=E6E#{|#Y}2)==6?OlRyN^88R|D~`L29toR^#3y?nh-(Aj|Jjn6OM zRCufhXj?o^wbKaDF0vFK-gzQr|AyO=K(%iAuaw@XlM`1^lLh|VA6xhfN0UIQ_NZa5 zaUA~Of7q457|A;!5-HjaQ1N<`b)ydFN;A^f<(>E#AxnyC37aGV9AXr+_dJf@GJZR) z<=6%w{wedydKB!e#`gHH2MB%#(7EN5DgJ0i9y1z1Gx?3MU%Ius#}G!yI=}bcnh1p$ z2q;iThOe(ptzfgj7Wcr5O-P<{6H?(B_Aw(0_`Iww#Y~oR0Y= zCsy=cq;)oAz3m6%AIC#>#en93ORYl-{FIQ5HXanVvwU)HVknVfTqs})SfSZA(-xtn z>_sUO{Doeo@Q!{|JiH%!`DpvjpFNV2UMM^;TDUPCw@BD@?DcmWmG)YIsmKxbBWl|9 ztv+XCVBr2H4jL;YTXRxr2q!aJ6gU^an` zx0EBX<}I5~A%&_oZ7Yz|#Pj``vDNQ6qSKzYjroj1bJe=g3qjl$qNWUH${jIo*8Ryv z8MtwJ?5wdBU$5w<(jWbsrNCH5)t0f-7O*1A;odJaF3B%oaIr~0A5J>3;50KDlCrrU z)%h~sYW_%=j^q@%KV+<+GuOtTitaE&%uOFn<-$cwDC*(;YKu!a>Y8oz3%g}aaNH{c z+K9U`p2#o)xXe)I-=5;vBpNx6dQ^A1!#D;>{yBa(2!T8J(ZM}Z>i}g_jmDHCcpRgC z90PU7ADAZ>L(Ij#j?np$yNOGv`a*H+JSgaWn&?y|!+`e>VJp0M<{H*9>288ah1var z)6bL263luJots3GQ$Dw7nmi36;XV(;i)17@8y~#A=R7nP=Vq^lqFnev3|h?1PmJ5X zwUYRpoRrnh+%hQw$4B=kUmHCt)$CS~wMn$?k^mM>2)-m1jc*W65Z!;aLhye~M|{IR zHf+QUuK1u7O#9#8N;bHB^lnaW#n8*oKp#hA`9BATxsW%MGY>Z=R^|&ocdy0xh+Xw? z!iU{4sW+Wp#M<%x4v!rT`%OBBca0rqAPc@fZm{`>;+I}l?&Jh?+)s>0YJLRIclsnI z+Fu8CFz3ExBu0m6kl{+%GhtGUCZzAsuzc~;wdl(YKI(0 zPlmuOe1{sNq87sg3U0;(&wPJz-J8Ekldkehz*o%LxS8 z)|9tW-g4g0tOZz*I34*7z+m&FS7)`HMHIk?DA*36jPj)M+_@pl(+*u;D*T-{^y<=l zyd4GQ6^fj+gqm{Hvfn++y+}L?c4aKBmS@5;+3OHK*?Yoe+AC!&<3wtIm_)7ZT>P7% zY;)vPj1bAPPTTS>E$n6ol0Nmv>?3cMeuk><< zUx?wt)Ap;kA=(9qCl2wq3?Urz&&1%l(cC^wlAS)$=Is)u>taZ_rWFafp-w<3zNj(c zP_wor_^w4CXD$DK{wOrtm)FI|R>Ml0CxZP+6@F)NnL*Xq!h6s&m0GQEE(a0`EI=iL zmEA}9@Y=Is{Es!hA!tg_b@bZc?%Nf??u8zFQTaOv;iZpDNc}gOke{LZM`^mnjG0^L z{Nsmv=S0W)@wf^>>~w84pe^1S)XEo`;2VqqTI>bPxu?m9db~K$?nNsZZ@{~v!5Qm4 zKcg z|1oWi7rRaclZN7O6FWH+&TZ$nfA8Dx?A&+>B+EEAy2qq(mm}^Q1+O(_9t&&!Deo1-@wKb!nW2{n% zv9RDc(ic>l14Hl3>|4QeGeH}U&2$@`3tzrJO>aPE6pSNmn(BD$VxBFpV0Pa9IEmIwGb|e)hBnpxt-w2`g0~CoK-iO6 z-W{Dl-F<0VjxvDg&mU`|aWobhH-0x3&GUl6H{bF1QxITqO6t{DIFbMnQndbf_?LlI))?tMs`&B zM1sBuaHC&m`_k|3y3qgrcGi~H`)dEay*=C9+#HKuLzRX>thB$dQmB}2iuT&6Ls6Hq z)1(&~eO6ySVvwQ>xgGBmXYIY@IE+AV;QWp>CNRBt<*@(K`8a293T9iXJp7UUrB2wt zoorQCwvLRuTtU!j24-`431XgaZc6aZP%qyB0bX0D=C%&aKBwp<`n{=72XtzWd!Mbe zTFDc5Lsu~;hw8=p+FEUxSXNp^ma1SpG;0-4%wA-l4T;J8IzFn{HZ=A)i#THDJrT9H zCRiVW5H!_7M2o#YdKLMC#j$kXic1jXwnlxSLUX<{)J=H%3&f4O4? zSoOTzSwMj3*aM+vV2RZ9uPoL-M0l(ar>JIM+_x1&k?(6!Dz$!hPBoEHPz=r(0z+9I z%X>PN3?>0IeZ@ZT?V${p+e@oMcb`xwx7B!e73|pA#YO*#<^Amy_`5fna&Pwcn`(;@ zUM6nPu2EDXWC2GD_01;1T#UoO&=3!cyPGky05&f_D*myahTb`LZ@?{mx0w6%hcj(* zR9Ey>>E)N_wq{%B&hR%qJ&#B!R@}F7JiVyZu(<*m`lO{ifcH-k!%R2Z&ok%_Lj9&)187NaR5Y0g=q9pFN~_d_0m%1RsJu+IDF6H}o1A zHbZ^o>FYt#jI0**ud@N>$XXYh*VluZ^=t_ali^KBf7jx>VslS#q@fxbPG-U-5eZ52 zw7ODv6h0AAXim;WvRQanV3F0^En!Tn^e_lS41k|us;H=hbz@>-VL8_FA6#xi_e(2z zSt^7?ltAmxwfXrZnUxKh!xLpTgS=<$@wTCtS5>94`}ZJy(4d#))#VY4VEyMiSKP%oI|8~mD^RW z1*^-wSYyW^f0=t*fk+dcm?6;t^Um+=QovN~&HPlA0ar0>D^$dhdN z3o3r;Z=xco76h|Z?_EH^EA=sFM4R zDp#fZdYa4#Cb(d8+thytvAt(Fxx&prIec6Z^9_5t0w|!X`+UA|D|rVoE+xLC5<@27 zR*LQah8?rjAWzZ|)CkxJ$Mw=3#xt~2U7!BCw2W`^LCkcJTZoD?kaW6Fp#ELm3gizyVi`^!xXX{p;9eE}|}WE7Ac} z?VXQabtJ+@{LS4KAby!*9#Wl4MIlgcIB&Iu%`syI-*q70dn8$9(7Z%z)7F5}V~I<9 z7Xl6_>^|9tp)J2`3L-b>;eWN?sWK=BNM6B+OsFws8fZJ(3YSbB zaV=DZusA+(gIv7lT7Bet=qC2DpFo0Z-Q$;u*IJ-dQTNOZaKnRw+wAtn9r-K~XLfUu z3I!AQ>HOl2gTAwiU@)-TK>&${fd`S10dR;A3cqUs{xhi5L_*azYbPc;{upo|vqMmS zpQBrcH-5ELJ=0~ji?*|Z#Oy!Fd44vshTNK21W#pnE>WRfq*4-o?$qBTDF$Z;=Lb8G+9(D%>zA1IPeF_;@FD^-NNs(dkb zM3%U6p!22PW&(MuIT2sgPzK;6ekSr~^7wkqeUC5@83w)fd(PIk*7Etq&WJ@%BvE=? zU!_tE7l80>)2YGA7}}mc_MW@^^OQzdM!9W&Dzrv*Sep50lBwKa>HN`P8SHp4@`R25 z=lVgJ_cmR2lBqh|x1S(v%hnxTKa8r!~lO=18U={F$-!{ zIAi{{iXXfQpX2B18HLTj&p(FJLfdb1^he0+EQfg@a1%@TP;(4nGZItt<$N8E#m3+Z zi*ujSygcS6qDV}*!u2}4<-$9P&>xN~s3uUPxc9JA{tpA>XKBGDe}qrc9b{ny*eQ%~ z4fu=E2xAGIV0~{hFrq^0t#3^MMKpmS-P@wg^Vj~wH)wgyQC#xcO`IfpqKHsac zb2%b9LVi;UAYs${X=Y*39KX^JB75jxM~eASdLgBtD;59%Gw-0pMujgPKYkpBE3Te4 zWNtcLrmYjVRN-aX{woxl#QME^Gq24wiz0ym%^;B`yTQ>dFm|(h^hXVo@200T|NW?M zsnbIKjfO>32K-Bg&$qO%+aw=}t-guDBZu}d^~Ff!*@oWgs&g(5Y#L1WQ2W!N8&AEC z!EMG2xUm{ZaDGi1kVx1usO;0$>HVgMqBhR$lI$T)fKg+v<&Ixlrjlm+=h;la(t^G| z&2;76MJf`wHQZCVWn$qI_HEo6y_mFVxtMo>H?4S`d~efls^>b?=+0UJ?%wo96KOOe z0Wpn#&=mw$)kH3=clF0LMCEK`4%z5)F`L{L{=-lEQCTU+-C*8@Fhot=e>f%-_w9Vn z`|YA7cpbF=8cA1+g5Cl@A5b^&rKP7&cUJk_SO|FZoNtBIBZ8{8u0TTb=Iz^miJmF_ z_Vt7>UUYk`_*q!;+0yu`Ys|Is6%V&pP};a$as!o<57un1FRu1!zG&;bpzAUR zY8y0&CR!C%DV{I**+qV3cFej(tzDX>mjaUr8BA)WnRP-G5q~dixxvEq)}@<6=|MeXneBr7yY!C8gQIa*KEY-a^?ppC`7y` zV>OJR5JQLiE7vIIyb)XqeEfEH2>i26u>?V9M#YVQL8y#Sjss*wfRs?&fF8a)0kd!S zhOfS|nAuUa$V8V&Bcjgiv+T`aVp~AG`NS(7v0-D{zvf|~Z6bnN5_u9)x&%ckks?ci zN)n7jZoH4Kig76)H)#)Gp#VX_13vS6eJ5-8jbZeD$8Xp*sc?Pz>QBb1jHS|f>`ixF z6~bfgKNuU+1Y_b>Rw*fuN)(Be9GSOp$Tc$1nA7KY!<7{MWpXfi4|aKqxBMb&b5kL$rtE)dXR`Tr6lkyL;ES2l@j|lS ztQ}P(KGS+!H9&~|Nu3PqTTRWn@<=_BIce(6*^>Ss0uxpl?w!N+)Kz{Z3hlA20@e^+N`i9*noM29d@J(GIRXo6v@ZTur_<1(e<^`sT_VU^UO7G$m9 zzAKY~9rC$gt1;ZSWz3_uw5&MuNfo=jhu^Cr0hbS>pt+u6W6LS|&(wGYB*-X=IvgM} z8z&SNsFMR%25C`?Ul`^jYkt+k`U)BIA z&$H8;b^Qu4#Q=8to2i#^j}BNN79-g`_Vp9np=t1IIDh-x(ae3eQF{`W&$}n?D;Q1v zPpW*d4?~_1;@tH59@WmMsk4rH+h&3C29}D@5=cR759)C=(H7ejNhSz6pwhF0-Stez zeO1~MuYk1YAHmYiiOrgfR^)7A=T;a*_6n)bqs z4dn>8<2RBv=^tceu}piTul^aaBqgj|(B*xI`RB{%gk&*>CW6&w5?HMg5E3S7qvt)L z31Po8>3gk+Jag9$`C0KmY}F8F?r9tU_sv!yaNF?=f5seMgDvljGKQBpF+wNSqzvCAxEG>(_ix-saw%HC3uf zE=W1fH6omE%S(=qp_Yo00p5fr^Z@(5ZQ0pY4Xni_vDSQ;zSAzWjbB`Y$fZHl{Bqrr z-+9zqtemrbz2G3`u$}^%$R2Xt<3+8G!18wz%JckAsQQ4xU=6UA6(>r zyT>qda8WD0KjP4G_QAkwizsFooq~)^zSa9mZ-Pd`>s!_5{;Ng%dY8*xl^A-+CqVR- z78qOi_J$K8$I8n{KCWDIa&mIp&W>(ea2UR&S8JtwI7^|2ZVq_o)9ovUir#1MQRL<2 z-?Fh?!$b+zM+#`4sSrBgFqHXIb_O5BUmLcGgy(Y%^N979p6;H{_=%J^)SEoXdx0Z$J-R-TBjwV@Z$c0APNROAA7HuY4LSXPU%m_gGn^!Fbv zoU&IYrv@88hvH9-yr*klE{fSc6n$N@eCxA2N+T&Hh5Bz~#N$5td0&zbfw1Y{C~G$w zE~j;AGmUefMl#r4X)lA)m!&4RMX#N#!-aa~cq8KyB12lHgDQ?rpld%q`AuIXhf=ZX z852L&{*+srs2hgTaWbtI>A`Wwv!59bKs>#oznRNz2h++#iJMqg!YUX@KilbsO|;rr z@J?lj$Bb*vwK;JnzHb4QoiGG-VsDJO>gpr!M8widYL|6vni9Sd+!Wi~2OX-~d}thx zQc&98Ulf5rPym9i5mMoJoDZzfun02pv!LI+IxZ_~C=eYp3I=0#UTsGOS1>O1&5bNRO`ToS zjY@m2%#XJFrfi#Ck8l|?V9!cz0BNRjaU+7F?QVp2`lfqHE&J45WX(6~K??Gx0m?f% ztI2q6caL84TeX*qSO1xLh91sSr1YfteNHyT>;;#{E&{|7GOM#nmOw)FWB!V4t|!Nr z&x|N!&zYk>X=y!NjnOC+LtX$N9NQZ188Jw~tgD_^o{TDFLBdg zu8U7txpG&5xgjOsyogY$VuN5JG7)*C(tVQ1Y|GuF3=e9)OMq(e>xlA<{}O-?!3FYU z_H3#sK-^@#N_c<`gp3m_`KLd^_Qh_Bp}#h2g+$|*7nUlN3Y76b5Co!ef89DQKl5dd z?}1Cq^xxajPTfVBzzXYEWlIYaxYUp5dC<6Xt^DCmGXU!LceJHa%_aMd-j=pTT?Nbv zaD5@4=m5&lq%~XH)S!(@F?apeCbbWN#GT=CXe?|W!5l)yVI-b(fkFaGFv}@fS-5JM zm|FGDTm9BcX1Z836(NJ@EG>nCgXqF1Ln%{Jxa1rQn_dAMV9rB}!wb(J>Ms<7l#HO` zINnC@9HYDUamz}=c;y0m%*F_f0>A`!eY60`XlZGMLK~F(5>r!mZ+U0Ut2s@&u|NUs zAyVqSc>0j&-aMpHl%v4ux1D1RRPO_Wa1>41LGgd>!g}+SR_C2P80$1D^!fr&(fR#u zFCQlu@_Ss`wqjo;GO8*tRzAqmzCr%2zv~aRsmLs=W_;cgNUAY_Jrp)w0L&m@!rf)< z__Vy$*rY`A(1eMYS3JSc?&y=+&w=@4P}1GI zy<3(Ll>a4tN09M7`=9=clK?I1f0EKeiX>#Sd0|;PRkDwX(PWU4m<;BKbwViMuTwt# zS3J;N9YygDM<$E0qiqBGsXx2)1b2WbBO@aX#$R?6GUh_8#v&R7i{@a+R!jfiFr^{z$FCO;<@S1S zV%FsMi=v_;-b+{CZ#|!9YpfQmpz|qqNo- zOhR$R8=54y2&7l`hY?z{+sC=}?BYuUd195+q?YsVcSD>u)a0yw9n@C(-V}b*O)v1o z_q?NxdJ+`#%5GJ7qE2EFxJr0o!P|Mz?wM=PKJKo>$L@a-IP48Itv?U-;f?1tN@6sN z(0y6iP@#Dfl;My1>S%Oa$M9LJA0msxKGRyn68}1Zp>cjBhA=%$&?ouH#$U$#7_r+M zJ_d&HA2L*1c|}9BRZX#%*=IGjV?i4ZgRg~{2VyTOdrTO8ZKlgG06uh3ndg2q(^$Vy z%D$0`WQW7y3Ib5?JNU*C?09Q5XW(W8I;f?Udu(~m6WnAWHDO%TBXWH&nOtyU-uL@p zvb!6<^6+l|Q`k#v?8()?hMfHL6Dj%s@i1VO}v11LaM3*fy*Cy z6^5OU-q2(HwSX_c3lNg)8yh!X7v?j{zP>GtzsV;n4I9cGL{hQc!%a4EV>p0AEsKGZ zMN)f3S;y9?pRZAd`CUv$xxe3-_P#q0lc^GVF&Jv+cQBUge=ixl?vrJMj2X|B5fqCV zS6Dz2t^4F5)Y)V}3Vnr+K2{&D4QdX&pnqg#Wh3?gpqa0SRq=C_4bDe0iG}UqUd(~y zjOWM;&mK*>7xmU?8&0DB>g#&;u7`dJYI+xek-^U-HtadDEXVq8T=d!3uNB`F;^@tk z3Ln49G!uZ~I}KqnarLjVYLu!gW(%kNezKvlis~HwEO~ikyN1H@AQA?G-l2UX@ggY3wSSqcPtsygS|oX`Gu0 z^mvKeax}p7@nfUGo0+S$p`0|V_Dt%Pb@s|Ooc85bpT?W*3|uj&PPqn;#W2OP7gS#Z zeu_SzQMUSxy^Z4@K66o&LCWb&E8@`9SGog0ND$Y2qBom_4@XW611BwaY#=bs`YsIJ zexHkD6OI4iJot0>yK;|1m9YIjFUFGG*`BW8J(kTi-&ubfV6XB>45L+A_S;_&Bu3sZ z%~@DJ(Xf(Tn2vrFu7BHkcuM6WmoKhcu0aI0jKGpgyUw@K=4J>T1D}*s*4`ed$Xf|x z)v9W*%|}N=OSMCO9YgRrgYAqNpDzEnC^aE~`f(_Gibc{2ajOaeaNXDD(v@M+xy= z#=?WnbbxsO@ne-wpFS}k=$ScX(KDJ;1)DMqknrLKIenKKc-Kb6dwk*fzSt7RLnt38 zo@>Yb#Vp=EMvk@Wj-FA+HE5S*C&(dCgd7#e;c>LCcJi*_%s?6(4fx_7gsxps`>v8` zk-SW!biTpqO=DxD^oI{W5+8i+x;q-!75k{`f9A~!a;q?aNWXepMls|iA**if_Fx*@)Bs)if9Z!=9)`(^g=&J{!+~%8nLdu9m(JuvHyY!cFT4^|K1lX zWm#j&DgjCwB0GX3A4T{Wqe+NA7b{Up4Xm=h)U6v8d>wRkFr!%pFl&tdQf1hAKgO}q z)TtJHtGTxMY}ju6EH6Qvm{Q2KefQ0$UOdWI%-^D)NjSz{yuO_5OQ>+@w7GxZK4_}$ z?h&1lRzPa``Q@K?d8*vpPlE}0_e6#r{(F`HP}{LV?>WjSxMUly*o2A`Q=r)2hSq3& zoKd~^LmGPc^e-6iDucEx)6Rky7$d{MH$0)c95~1m4nx> zJy!ulcmjj+kHjBfGnHuC<9jskJK@AE;A)eE;|i`j)u?Hh^4sj&+Rie#G8*V$vfx*u%vF8WMIUaQpSSl106zEN_noli(frRvmJfGJOOB^TG0I0LKk5S>!d^5EA z&a)b!-qWbK&t*NKXA%(VqCrMnYPIs5mj2l*N{L7rrn zarpX8@u8QE-bk}F8bG>0R3VrNwE7(@%F5;_@rImFnan$7m~|0^?RC?6<3e=47lD#^5=MrCo=InMtxPL zQxn9X=P)%6^kyjkohMgCC0209x|@F(T4RaBYM-~-&KVUAR5sHiNuKV0kj1t@JN{na zVqy|ertD)?vag6eDtdJUsQtmeihWd;07A9#R6Vjm6 z)tJyxoVh%2WZ3U?Dd{?^Y{~+LgrUia$?q(NGnqz!mz;d7q8tg&OS%vSM=Ak$VQ`<6k@GBo$pilTQLIMLr4rN+jiaABRH{?5(GDgDv;4$Wu{ zmKD}3ObwltQ>L@zDZe7I)q3EgL_gZWI2Ds^D#wG!5>V=szD# z^r-nkFwv?1N#$#`@G@KY*rB`7y$O2S$7kDrqfG3*pUqtO{|=lz`pb)=7Jgg2VoH1k zY|G8uJM`sy$KH1&d;v~rqbUu^h!=iueALX`R1v{?@+7aICh;eqGDz2dy!1n*?|;DE zI7U(}205k8N&y*2==V!lg-Zk}kgii(aGUMM8TBo8TeygbuNgQ<|wg z80NAFGL2G*kx@?MW;0>YZAPC$%s&$Ym#oV4&fVnhDqm?l-xc9iJ(7jY_S$}Vd%4$j zoJrw*b^IOd+-LCG0q+VZz~;U6QIlKu_0hnT^7pOnR?JN}gEX$j#xaoy^p(vr+)zDD z*e;3J&bft&AGLCb_v8z|v1`jytIa3}jX~>tnI^8Ysk_(T(M*P(=x6O4%F9QZ*Xm5A zhktDJ&?Xn{2@y3~jdELXs7N+c4SGt`QXxo*Y!})wbjbGc0j~CY0`KnxoYo(qi^52T zP{Chf!f-5j%iJk!$_ja~1Ib=$K7%CW7>{I&xcc9p7>&NtTBvu}iB=X1Qx?OB-PDXA ztN2UTJ{8BO6k<-lFxAuIbx~7L@aINjCyCC-EXKSBp& z>%W>*NpSv)sCoplEC?OW;8XTl4aA&0-x{!5D#CrNzp}d7mtecplq6@`dwY1}5JLAg zHWnWZ9sTCZX_lVNr!w%<^4>y@43$?1iGlC)<|l^ySTs?p8{iDtntad_Y`xELr%fbk z8PEJL0jR{sWg?m4FLLnLo&VQJ7Qit1QziHROm0OC(1CMm|2;jJ^Xh+Z=Zj;jYL{y~ z{&$Jm>3EEu47-0w=GKM7eY-eH)1o7KR~T-BOBIKn>jf^; zS?x8q)mUnr)4YJ25;!ww6`zoxE-n2CX!U`*Q$~bxNPhkt{}dPZJ+g0^>QR2KoAjfH zg7z~qWNtl~{#S!ig4*J^i_96QoW7xBU?_D+VKJU4QVcT$!1C#r1LQvW{Ws#@mSe9G z=P8g+zUQ7Ze`+RQ1gJM;>a4^*>6e1PQK+*h{@ zBk{qx9Ma$|%s1MQ*i2WL4P_LTd3mztZx5SI7Bzk`Gdr6fOw$4Dqe(I2lA6E^ZjgRD zeUGEn!ZNO_G9Rj1I0`fP&#f@z_{LXNaYR1-77-P-Ib%bxi(CsAhOGwM4*mPG)*0%I zASy~tC0+li={&ma>ZfZsEQ=$Lrj=GD(Z75et-fVr&s0J+oy zDu|nKW`zss&kVgMc}rNw6n*{Zta|0`;G|*OmbNHr8N24Bl*unK08v6UY7c@2oL@LNsc`=O{W~m0BBJDQ&ZXVq zZzq}%2&opDrG>}%qBM+uZ&cm4%Re1${~cBJ&U@Q4r=q%^FtB-fg1Au`kJnDK>nJzd}3J_@0r97dK_0yk%s) za<-B#=VhndUOz-TO1>8rHOIMTb(fdd^eX+*smX&E)WNX&#wfQQ`%TCxoqp5us<-{- z)y#U&x0g?9?3bGQufQY~cK|xD^a5BDBX^IzoCG+^r{aVQdD>9zz<$XxTgvHkknEP& zE!1(_Oh@68^Zrwl?c}(9JKDr!lf|&$6JBHNV9!QZSO_BX7l=&8zdT`Sy_x7HVCP2; z#Pn1;kB#N!=7#H1%hc$F;RB+kt9?Sv^vCNtJcjk=4Q7(T5j@3VNGCTJG4an>a3EVU z{*hLy{5C4Fd7RgOW+)lbFtuRuVi}lP1YjrYzm}t@1V#tAi2w6(jqrcVO8`Lt89G^Vchvs$!Un$}S)qMsHH@#wLO*TjN^9rX0xo1X?i3%8WTw1e*z5ZC; zL7KWNts5zjY)fXfC_X}{XYRgG=iQM5OpNs8M~b9;N=b>yO$I(24p3rHWC4RriF4!2 z1>?>Jr;@8&iCN|BO=~egOv#dL|4^Ggio7^#841c-fjK#b9al4kBNZaeUjMwg$Tdj* zxb&vD9xuKO@9Nme0j6h7tPE4r)8|JMezOvPG*;@;$33W~)|6uj_y_g^-@?B=>KT#!9^zM+!>G%{xG$_OUpYMDMny%f*vS$iC#N1(^p%p7Y&fWBhHYm!kb?N>hm#B+{ppX`9Uh6EOB_z+G*ts_ z@)87iKiA;?MC@V0gM{WgIupoI$1R>HGmVnyOM3}wFKPu|%a zZ5jtU^+xThwGK}Tif+j%R!Uijzmf4ff^9w_kHTi8_{=#-a_u~JK4~4^G~DhWw0%cp zDx?J{0>5fM;(PY9ssT1?#qvhz*QCcbxju%E(K>HX#uO`ajERRUSGqRWP~?gFErR;p zmk67=67^D0j+&xDj2C|V8WHicN|=u?B@jTzOm~J0Df=GP1)|$5o}I)K8vU0dCMTDM zJBS`%r6ZG(9H3RMQ7iJ6JYX)Sh{L;$=r(YQ%uF8ic1TD_)%6;WR(%vb-4=#wT_Ctv z7V0geaPZN8&)q95TrY!6MEzvBH7z3vWse`|uj`6fZpB@}dr+Y?gR>q16~`m#38h)T zCyd3rGUg`VWOa8FTZ4HbtjFOK#D7hB-{OyGc=VXQCr}ewTg)eZ`{DNbyP1A*E!eJ2 zc_U+KBn=Zq^}A{56TCI=`C&zNVt>%pd?Fcq$=)(;NsD7zc_B#z-t2!d%E>YZ+Si$OP7V1h>~*1K|o-0YwL`>fhs>g z9~XjEig%W>wRw7*$_ajLTs?<{jg9_FSUA(n0Rq@*5eSc)jBz`%4D_wl{(+&~@RH{l z8;694SHq9$@9oQb;fWH(nS<*KvC` zA|k3Lj9}Gmnyf6M>qwdW(rVO!rY^=2`{K?vB9KNZSpuhE)-H$`xVUI2Kfur4g3N~=0p#;bZ9Gh@f=W*;9;4Wh`M+2*+m&qnJoVX#h6Ql= zIhF?c?#DrXES^pNbd|`z*@mgUwXX0+9w@JUqabQ(FRLa4$EzK4JZe!}dANa_x2leg zyseQ~DqqZOyZ;L!qA@>J9Ql{c*pc$`yLl$0oa-w4Grzj#hsk$6-$l*>v;LOpA9{II z9>#!-yHPoKc+`cwFMsB5q`$S$w1JfFHqbvE&-2d`j3PaIE7CMl__LsUBCl0R8BVX1 zDVxHkPYPemeR_Z?#uowBH5_2ub;jq)zVSo%3|KjeiwESLEe&w^!W@;dh5JBEp}u8e zT3InmEj9Z4fq*!5uIOG zANB8wOAO=L&ekReBHKrg1ONj+=sR#M!OP1l3bI4By|tNH|7|sCw4Jm5vv0;wSa}(a zH+(WPQzy-LSKd}g5AfOAG4H{&7*{b_SZl)P6ZGE);2udE)5?}9ak2)>sO}y&SXZYy z?jHA88LTlaEx|PdvfWMx#Z;95@qp}*iQMPt5b)SDBkg;k!Q%?#2ay(xPZWZl?L-jX z>N(s0(7ffAxvPuS;AiRH@Cm!+md5_A4{5x1WQ6nz{3mA)7u!P$8N5SP8!KRgW46T$ zxbTVrzIwg^ybTwNeK*<}tpPMS^R)PU$m;0Te3=3rSvqnAe@h<9h z$`Pu?O10>;AWx@SGMz0btlrbNoMDR>blWE-ULn^g*D2g%jRd1gwhhoYjXqiAT0@1h zf)*PWCjq9Cy~Rc@kkHr3?5~3{o4a+O(g)sueX`;p>+4uopizsOv3pkd+^8}uED@IrlMvcqqF>-Bp_k}iiHzs;PTM(s1ZygcxY z3jxy)GN#pYrvu!)ZD2eal9c+L=hQH;0AoFr3?Ai>zpzWBWuXUdK7D#BcFbpFPlWpk z#!4+u|CAe7rqcv2dZ-Zm$pZT_xe7AQvcZ`?N7eP`^-AV3uxb#SlQRNVdaY#O4BZL1 z0iq?{t5>X^-Mv&0@v>E)UfKB$enEj;_T0b)i*uVnFiACwTbO|XuIm}9=Ce;I8e*6D z9TE~$Ec1;RN3E3VHHqwEp{GTobj~kc3Y=~gkJ61dQbi$mw3^*rObCY^aQBm5fd zJ~Dml`Qg63>FD>x2W5MZQEaTRpnx>nx2ZRk%OaY$-$Z3*BD)16e5~d{{hMrx+Zstx zC?pDgX^Q3jF0ECMB;!*NKqTg%^%8so&1!@kdd4H^>dK8PI#9&t(UferY7-eIE#M=a zhA+m&l>mqP?!3}UN+!43Z*r@6#8<=e1Z}6sFh?J8xvj)|%F{I=3`Fl%Ppmw11izRr zt(Xar7#Leq3;b4c;G0s_sa zx}1r=j`V+-kFUPKtP7hcko3ygWgY?*Rg1D8@<9M<1yLlr{10AENP+W1=U+UM+ z5DL;06gra*y;8pnXHtW+@p-g|<0waK)(^}{eU1UQV&LE;JBo}Id_HnP*PoFr-wF*q z_m~_AW0-}SKp(hMFQF#Zb03(gwBIu*{p{f>xY}^`Dn;;EPe$zST25E!V<*-NX1ELl zpEKVc^2&VKbPF)-xh;BOUqi%vvo2Tcyqy{S^N4fy;0s`XV|In)2B~= zf^%Bn3pC-4oU?{}b*Lo{->QYV&61c=u}(OGo*7d8qDnuH=G{wDpATn`;f9N9`E^@? zoQ~H{DV&zHkS^h>BfUqN`C+Cve(k_mjGALabOR@Zo;x8wvX~$ce`f42?|aJBHBSiu$H!&Xwa-0t`>F zDUS?lRK5ret^M&N+Bc+rd{9qL40z5{$ZXw)Yao!R)joVfA5QX@y4*;;4O4aCeGH=7 z$iawb_%C0|fv<#t2{seRq)?3pya#J-W;6yi3|D5gxJSdLb2nD#hR`$rOCr?1J0-(l zX-fP1o%{kE9X{P!WskVe&8gO%Z1D<1tR2gR<(mQU>q_@>AIr!_lJ$z`zY>i8y|buK zI6SoNDx&)XwxGcV07_XD9CbWzqwj4_I!50@iRwLiDz5-wpqOpGOp!T7SBKwb2@WGL z@$%M5dI+_u4@P~%1LMnO#m{3h9_ueK;lx|N-Qz`F>Bai5#RDe4wGx+~5-bVK^Xw`r zDMcTMc#A*w2d#B|o09Nhl)ZcDF&v`7R!BNHe&z zOoYe5dh;{-@|z@-I1P+qQfw$!cgL3+)Q-6L#Xw*+_N#UVp3U_W=Ns#La0Obb>kAzj z+1^hOu3}F@{x~y!s)8jb3ok!z7Cf7})g%%?=%;;@59lZ-@;oBD^a?OF9kRMFkJejw zV-3E#asT%1TMlm2=^ZM1%K6IkR(1+-eg+&az<}-dedH3Nj#Cw;?wl>(B*Bec+_x8^R>i}^I$@O1!Ox6ho8T(r z=;#Qr9~Vef(qI5P6ko3m-$)T?ZvxH<%4bRLI|y8zqM`#Z_BD)2(k%~BVCO09as{We z1le33SB=A!7Rb-1X}(+0bYs)DHI6Q7es-O@=A{8@DDE(oE+u8lhEY;? z8zI_1oUMQXJ-hdKwbI$7q)ek?JSSQ~z<5teYGz2+^9qh{?42$r@gUa{w#B4m*TXfS zS$G`|jZaMMEMVRG)zzhbheN~bbk}4-?t~5lx4DVMzQCXtd#)zMA6(Y}(SsS%V%Gf( zML_#)kOCQiWbYxU**o0j3xC>7XDzLJ?4+EZZ>+7Yol!v#;O^Zdt6L|dhGk&jENiaW zZw0bujHi55CkGfTo-W62;^-(8UFP&_*$44w>5pSuY+tO7JNsI>|1tuA~j5Gl^oCAuI-p8Ic2;=zOX{t}I}vZ3q%6=h$^eM?!3EIWV++^Ed+*qQLho^PaawY9UI zFpOH8gmT|+vrkt&ve~Nh$=7eM3%JIRZNRM-?u8%Tvxkcvc}RdJjYy)>*=IHW-+en1 zBTTkaGXwEXC`BZ7&moxce(U8Oi;79OLt~E{e;Z_Zpn0 z{lNB24G2QbzF;3Dl|$1lC7KImeH*`WcXQi~i;G)B6HFvdwjS>fx$G}BKYNwh8AUG* z_Hy6-qw-4JD;>4_PIHgTT24)qgv}yr!J#HXZ!)F?($q@mzc;Wkrj%O%7&?^)S_``a z1NnK?`UN>u1!`Jah9G~<2fzN;7&Hi4?LY^m@eoQm6(uFYrDk4Z5KAhJ9E9RU?9r1x zu~y=-`fr6EmzvtsoX#w7SQ;;+=skD7jo@6?+YYZOd~fwI>pZ`pKn+99YLt!bOd4

tc&vKXJ>|-b>moPxq}L$) z%;26xE*V|ab3A5)65XPrBDtf`-)TVCzO2n9`f{VNVDEaHZn1yL>D{+ilm@Lppa5#< z)~Y&qsKUQC_gtE`oaDc0x|9Pkyv23sg8);UtMxxdnnje>UDV^V-RqMAL0(R>wrT;Q z(wT9>KDULyshg03x%;J8>%gkTXIEJe4vdxH5APf$%f%@uhDY|fd$qLz3;-g+f)5M3 zj(Fd!C;rnNR`a*g&*1fr1LUk`lLmHo49{|TVNtW;Hh3@rl*M0g`tGD*1o>ZXj(5ag z)Eon%2?zIvD~*IsuANhJuXl&?u;a&Py4TI>+HG^G8CM3K{U3*0m;N}b+9pMvi@5ifB&HtBq)pr56y6dKi$VuHh%Lh~|0*@@p z^(Y~KMN9^BL!1eg^e1>a;6c4dRT5>~#YQDXH+Aq`knYLB@8D{fPOL?gR^_sB(XwiH zTGzfo;v4%XufP5ti;i5L=k8;{V9)JJi-8-TdPspMGGGTW-fB}9FiFdHuk`V%KVqZk z%wSv|;9S`euElPxqZB0tfFzL#d9VGO*N$%`yw^eG#Ns*FxY8mXc{;11ir>;g-b~vh z<#JQGiC2#(iB=kees7e_x?eDaYat$TQ~f&?KQ!FkZo8>l!{bTeYGHQN(4MWn&WfcM zmQnA{Q)g#9=T7l#P3cnw(m}p9G=1$waG}nUf;m{OVPOa=Z@uj9%|L6XkN% zD_nr>OypknJr}8C-tQ^L>_RvE&sRuMLm8R=v@ zJ3W(`f4T-u=w~Yk4i+zg>f$}sDFh5J_x$*D5?=lx-u(d5%%8)`nQZah{`DPCeyrnN zhSFNtwYpXiD$n`YEA9z$XGF;NYCt;U9`b8>e(&3{Kj4avgnW-Q;eR$t>dW@x8SRW2 zd4RjbH*mv141^oaU}P}Xi%uEV1oZ}aG)X%Bx!;ddSHR4Lr7hKamtStDk!`WbtK5FR zv8L;q7yKE4ooSIR#cKbbt01 zjT>0dDGlNg7xAK=|HQc>zucT3?nChJN06R32%dKn-~H>I<%c{-#_8ld%X7u&Vz-j~ zYr*pmWRFaBk7ch81Juo59Ue)d$_FYgE9XYxb92-PMa73{I;WRL2_GA~EGpP`9-WQ9c&64L6ta6%M=lbc?4xJ$Iji^2gbT0UeWQ1{-n~u>t$q_dt3goIRmP__ z80pYFt5U=MJa6?*Z>EU4zj^S9vsY5lsr1<;^s01Y!Mzr}80ZAk!bq=XEy?r^xB-V= z8m3@B;Ku6BPsSk-2WmGlh2Z2y-~xloHC>T!;m+F>wjx+_ z(OQ6xKA!>z$&`;ze2OonzJ&s%Y@oZNI`(d<5YsG zlT(@15gdwuJcg6YF1rAkS7+DG2j(F;QU{_z@*5B;7R8Zze9^MICRQ}nrYhWOlaw#+ z!fk)I*?*wYty-|1(aM3XD!%zu0H6A_XMD$_22U%3NHNq_m|Iiv&=AO>DoHjy5t&v-Wi;6#(*3IHFdbd1TX~A}o){W~VLZDeWjLEA7-Rje zq-KrexJL7*p6mWjD}B9p1~A}XJBJr5GB4}x$0Zm znlj}YA)(P8gwuP)>a^xU8MXcF7WepM>)5nBA=Fi>s+cx_JnWarTCIO1O{ zYvvAXAkLG2RLZ57-j@PaMmX(J*HQPK4Xq~LxK1@VP!m!jmr*F*oqJcO9`j#?jH~pS z@)(@}nE4NL9kDCV$rjAhwB>-ZxKl#+9~L{Pz{TxGi5?AOZUW$(aLQt+-`DJaXJcCo zlABcV3t4D)wwP?`Aq}+}?at14lLVv~-}}ZG*tD~N?aoGmC3z}))sR-NyAg=y?CjhU z9W)7OyeD}WZB|y-YM3_dNcUMOH*a!wW?PQD=~C9UG3J4EB&F-V8bQ!toOOf9ogmt# zyZPzN2LKa>0Ft2qEs|re&w41u`as*w?ZN2p#n?OyJQ(w(uv0BDR>b4t>&g_~%TUuS zmYoynf;kfJ^7G<^^mL)O*48tZhBXe!RbM^1&jC5pax;f6^rDID$stvVfcC))pfHzr zc{k-2`=<~pCX(+}v#lK$?uM7L-6(pNQU&ib9ibG~=&aRNf?~+^rfNOmmE<9D$QvT$ zBytL=)x>pmIFcQGf>WJbrm9L<X?R&f2|y0|%e&TyX7xA07O|={rhzTmK2+Q9@3%({=JNy+AK)2;7~*<~(2J6$X%5yPhcY_TANti9oLyl*BK2=427V?3Fp% z>ZHuh^;Unf=)Z&-*cw4;xj7T|xl<3tr*{v3{WFj@eI`DkZTyj{)rTyw1KK`*sg;W? z!`ToV^fALUa7yB%J?9NzO{9;Yxc`jYh=AV%nUe+%vzkTcx3gN~6NEK(^yh$x+0`@iQ3Q5;^3&0lkGUQ|sL-Z3#baza+r0h`6?b2DTU+mlJ89Qv z5_t}XgA1>^R`zZBcXh?BMl9k8UBI4x6S?g?y<+3qvQ0)YX5JAmd%)xAZ@NDJukiBW zChR0>Lyn4x?>tnQ_@!s_V)^!vSy9UtoY(QeI&r{1I(z4fHR7)tKF^>np)+6QeA;>R zGKZCwy_kc72XB`|RcFY5H$3xDcH^7aK@m|<)H-+PD?*Ycugn|Y_ptiAy8&+axg&g# ziUY!oo&05^q>M@v62W`V;>C$fCJ4uVF;%dwKOf)GE@DXr9KX6T+=6snW)BMw=Rm5t z?LrRCyJVARqqT>q!D>~6!0Z<(jVv)JGa%+EbN!|0e!WwDO~Z44!P6qW5_vS+E!i4e z1TTTQ_V)L}_>fG~;34=2AfFdCuGjNayR>aX_2(%3!q*6gVN;4}#-gK~bN0frg=3i> zqQL_v%F@iO)ND-(DX)w9x1gnT{7Q8JWn2`Eka_BA{{jE~{%FZs3!mr!b@_s=1D@p~ z!SsC>nnE5T%)7N{l+B-)7=90m!@f5**l?7xqM{;ty9`eh^;X{-*xSo_9`!3JDM?(; zrJ_eAQxLUrIFd1n=H&D#gJj8ai&<R5rUt_>?zv6f;Av_!$x)G~PPTUjL z)KpX>8Apw)ZV?d?b5E7e#ye_LCyhhcpPb|E+_*VtleK}*)B1ZmkQvsXR;?4JzsI?kT1#Kis@VC?5iQ-P%tf8RxQ-CT*#giY@Z z9YyfSMe=lVF-7aXdBd5Ln-jYE%@!vpYsB^=xaTnP_CZZUBd|6PHhW&hZSt8DcPe^n z0!YgIt8gyZZ3++OMTNWsuq`H%d1npFc;vm3;Cr`MC^afIsUc~ z2GA1Pg>k-}`6z6aqC(!|b2pT25u!oLJk3o;U1W9nnaOHR$Kpz3W09Lo3XVv%q zFxkt!S%#~hMii@UxS)FgH`4M!P1BFqwU!@Z;_4}IqO}dnY)=LrIRKw3xm0D8 z@F(C;7GM4JRLt>H`aS74Rr*lIkiOYkz_NWy@3D*3edKh*Y$f&=IK*%228&&}`wWh{ zqafPwD}8tJWATm=2iKg_UQpQ<*G1Q%v`3pwg}7_w=z&%ii*tH2pL;jy~jlP=A zSRAX#8EBTmO5`~>IMAJs+ScCRS)#5p4@ps3%72)3+&lSLz@G>*_1;auFhGv7bpb6{ zf>k_N$&9a4?dfmblD=SXC9Nb}>cRgw$P%4Yt_2CjEe^C@r?CZe_0_Bcn+`U^{Ts&? zQ>nj@1iNeg_ZTlWW*P6{@c=dvP|ZKbu?>M}WQdbPbOIZhnW71Q{`|=&A`*@tF*{)G z6!t{RYbiPr8C)}AD3c1ISzBpq(;@nD=z z2IA9_DXBkDAooG!+Ji9A4=pu;U_fMcq2+ZuMI_3T!akELnDyAPhAI{d8Xq=33>?-; zc-7RF`$ffLN3BNJ_=`x4QQcJRv)2%wP8swZ$H*e^q`WI2WxyJV6Q4tIb@XoWphKxH zEcA0*nmp`h0zyfF#!;DFb5*h}uR?i+@M>*E}iUja@gH_FB*!3B_tB5f|L{Qkzg5r z+vDay5;^$dzWDOn@0*(!cBv`ui$8Xon})b<()dqICQ)%;eA=_nr_GIHiN$^KWplF^ z(@`w$i@PLyPaJ_)Ye{3`wu3UFv>lQap{wG+z(OYwmn>fzPWoAO629aW`5&!=wSTk@ zUw0%63rDiRF=Ol#_V$j;%?wty*J$pLN+apY32< z3z5%tGg{?4tJ(qBsW*)BU3H{C;x}ya9R)GI&W~y|%XcRqh)X^a7x|j=!y;dER#dt9 zmz{aF5c#b$lJhd1jdEONr@}{)AoC4E-W}n33mu6grwbkeUs3zAxpCB*V{u>XZg;o4 z+uhpgiuQYEF^S>2N#&CwvClvwe!=U}q=uve8or6s1sgI4y%mcuMh~VTa{wB(_+pb7 z0ylpb{%OQ*_vTrDBnuW51~q|$jvT0XB7wx=&{6_*moSj%ThIQ(;DEN|X>dp{avBifqaL_QJ@>Vnu(04Jp*%o=Bix2mee*XeZ7nP#cFfNvKHgR!$_) z^#*Sny_p;_q>qeg&`+fi%PMF6Abn0H>j&w9t0(zL9vc6hQD7Tt@NzPP$ZW{GbFKYr za~eS3-7fxqwZG!&&o=~qH4c0IMOm=O)juW%K2J^@(ks_PL`H`*2uecj+KGPzCWl5G zdGwpWibgtoaaE8S=KcMPecV+*IA-}+SOCel-?Jr2#)CdC4WQ?c6T}*az_06;FjyVPu?2qTuwZrJSMtDc{*^p3p07i@oN9l(M`0nG)B&qI zk-%U+2>Hl1V)Mr}o+FR6;42!RkW_>C^lu&xPgANv{5Yn}^l&jHx%zc-822(ZOu$$3 z3m&*JC*i&)DeE#ENH6^-zR%=G{fq_mput|yThWQk5XFXBYaF;LNWy=^zJxJp8@kST z2Rxn?jftbj>Vn0D=k_fhQl4S3qeu6834_w1ZmxgLx@kk`uNhr+@VWT<{h@gH_PF^U go=9l-|7j_~gZKr9_yqxn_yq!o_yq&E_yq)51E3AK_y7O^ delta 1429 zcmV;G1#0@uk`U065RfDR%aJ7{7t`q}m(K2V_OQG6UNjU5OGqSA1t}-akzg5rw;#oq z@832DlE}dq55@g&zi)1y*`=m?JI^d2%t06A011_UHF*-#B7!rE2_INO8|ovZJj0lDBs&NvOnQbf=||%^ z0g1I>!8KbZpEv@q){@4=Z3ksUX*(n2N#&y=u}?rFe!=U}q=uve8or6s1sgI4y%mekMh~VTa{wB(_-vCH z0ylqWel_B@d-J3}k_C$jgPOoWM-EgxkwD^bXeoiZOBhJ>t!Mvepu>4$cWd~4VN?_- z&=aU%+$R#K#uErj!uyHz4|6;)igXHdL;z}h0v?a?2?+afa6nt~I5?yiISq*LQIald z$tN2+RdV8V!O%KudTiviV1bpQsu_|E={bLH8v@eC^b+)!)$|g8cc5oMYV3#sa;>Qc za={|gq9qJ8R3Yk}QiyP?0*!|jEU-cYm4^}2<@PKDO`K*B3LR@PW)L{UhS-yLB>K}i zqlm231f==I>4KdRj{0dkV$czh2G9BcYzB2nKj`850SMJLrf&`VvI)Tf_xlT8cffyL zPr^f2cERg4ensozKx%LruXQDMQ(p5(?yU^U&?D1}H;nMJ2y(H6vyQnu`Pl$>QD>;v znZkK%pAB#q2i6PKg3S`nTl;K~@n{>;+o>g-C!Lu#vjy%Xg%?;pg_kVhyv5H3cnSRo z4xGenpU6X1f59TnQ_IdAdtqc`v7&#$h7@XWPb5&UgMXqUv=e6(sEtFLBvhn#D<=}@ zdV{x(-b{`d(nrQL=%><%WtFpjkUpo9^@H@l)suWA4~_rMD6kDRcsZFtWHw~pxz_%* zISruiZWn*Q+F$YX=NkgQ8i&39qAXbC>K_vWpC=~{>6PmtBBR3@1SO$%?L>b9lS3np zJo-&wMI#-)xGG2uboe6(^v%Y{hDBfM3<6{5cA#YRMNS+vK1K9KOqU~H$KF^fp_6{0Cz#bo2rJBC!_(K`lrm|wB|`5_JihuRjBZZGL!LG#=P6GnIXm>L37SlA zY!t==mnrFjltTL!_;uY92CD-(w!rTk7OXD(LLL~-zmP}9^L1#KQ;mQ3C@f@?I$(7t z@=g`q2O%HXMr{7L#(}y2iAP%S6^&0wszH4EHxGxWDb*l;98+d`xR{b${W>{}dl?%h z;H&us58RlOaNm=Zbr}w%m;MvqXY!+d#)5j#U@z#c=tO3SV#BO84qO!^;lE*D!kDxT zU1z)l9?y!##L;7Q!D2ANbNde|&oJ20qkFxCLFrI8*S}`nv?27@jIKKPTzviUrTFsw j+vb0mrfBvEtHv*b^#zCZ1p$Zk1p Date: Mon, 14 Jan 2013 23:44:16 +1000 Subject: [PATCH 2/4] sanitize renaming id cards via computer and agent cards Signed-off-by: Cael_Aislinn --- code/game/machinery/computer/card.dm | 6 +++++- code/game/objects/items/weapons/cards_ids.dm | 4 ++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index 773d4897c7..fc422d6d87 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -253,7 +253,11 @@ var/t2 = modify //var/t1 = input(usr, "What name?", "ID computer", null) as text if ((authenticated && modify == t2 && (in_range(src, usr) || (istype(usr, /mob/living/silicon))) && istype(loc, /turf))) - modify.registered_name = href_list["reg"] + var/temp_name = reject_bad_name(href_list["reg"]) + if(temp_name) + modify.registered_name = temp_name + else + src.visible_message("[src] buzzes rudely.") if ("mode") mode = text2num(href_list["mode_target"]) if ("print") diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 9117e3f63d..0ebd8ed7a0 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -132,8 +132,8 @@ /obj/item/weapon/card/id/syndicate/attack_self(mob/user as mob) if(!src.registered_name) //Stop giving the players unsanitized unputs! You are giving ways for players to intentionally crash clients! -Nodrak - var t = copytext(sanitize(input(user, "What name would you like to put on this card?", "Agent card name", ishuman(user) ? user.real_name : user.name)),1,26) - if(!t || t == "Unknown" || t == "floor" || t == "wall" || t == "r-wall" || t == "") //Same as mob/new_player/prefrences.dm + var t = reject_bad_name(input(user, "What name would you like to put on this card?", "Agent card name", ishuman(user) ? user.real_name : user.name)) + if(!t) //Same as mob/new_player/prefrences.dm alert("Invalid name.") return src.registered_name = t From e4db320f97f39e85b3f04a850189571f5a8e4aca Mon Sep 17 00:00:00 2001 From: Cael_Aislinn Date: Tue, 15 Jan 2013 00:00:15 +1000 Subject: [PATCH 3/4] removed unused files, moved simple_animal/head Signed-off-by: Cael_Aislinn --- baystation12.dme | 2 +- .../mob/{ => living}/simple_animal/head.dm | 0 code/modules/mob/simple_animal/bear.dm | 160 -------- code/modules/mob/simple_animal/behemoth.dm | 126 ------ code/modules/mob/simple_animal/carp.dm | 189 --------- code/modules/mob/simple_animal/cat.dm | 67 ---- code/modules/mob/simple_animal/constructs.dm | 351 ----------------- code/modules/mob/simple_animal/corgi.dm | 365 ------------------ code/modules/mob/simple_animal/crab.dm | 31 -- code/modules/mob/simple_animal/mouse.dm | 152 -------- code/modules/mob/simple_animal/parrot.dm | 94 ----- code/modules/mob/simple_animal/shade.dm | 59 --- .../mob/simple_animal/simple_animal.dm | 58 --- .../mob/simple_animal/simple_animal_life.dm | 95 ----- .../mob/simple_animal/simple_animal_misc.dm | 217 ----------- code/modules/mob/simple_animal/worm.dm | 199 ---------- 16 files changed, 1 insertion(+), 2164 deletions(-) rename code/modules/mob/{ => living}/simple_animal/head.dm (100%) delete mode 100644 code/modules/mob/simple_animal/bear.dm delete mode 100644 code/modules/mob/simple_animal/behemoth.dm delete mode 100644 code/modules/mob/simple_animal/carp.dm delete mode 100644 code/modules/mob/simple_animal/cat.dm delete mode 100644 code/modules/mob/simple_animal/constructs.dm delete mode 100644 code/modules/mob/simple_animal/corgi.dm delete mode 100644 code/modules/mob/simple_animal/crab.dm delete mode 100644 code/modules/mob/simple_animal/mouse.dm delete mode 100644 code/modules/mob/simple_animal/parrot.dm delete mode 100644 code/modules/mob/simple_animal/shade.dm delete mode 100644 code/modules/mob/simple_animal/simple_animal.dm delete mode 100644 code/modules/mob/simple_animal/simple_animal_life.dm delete mode 100644 code/modules/mob/simple_animal/simple_animal_misc.dm delete mode 100644 code/modules/mob/simple_animal/worm.dm diff --git a/baystation12.dme b/baystation12.dme index b897555fc3..855e416fcf 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -968,6 +968,7 @@ #include "code\modules\mob\living\simple_animal\clown.dm" #include "code\modules\mob\living\simple_animal\constructs.dm" #include "code\modules\mob\living\simple_animal\corpse.dm" +#include "code\modules\mob\living\simple_animal\head.dm" #include "code\modules\mob\living\simple_animal\kobold.dm" #include "code\modules\mob\living\simple_animal\parrot.dm" #include "code\modules\mob\living\simple_animal\shade.dm" @@ -1001,7 +1002,6 @@ #include "code\modules\mob\new_player\preferences_setup.dm" #include "code\modules\mob\new_player\skill.dm" #include "code\modules\mob\new_player\sprite_accessories.dm" -#include "code\modules\mob\simple_animal\head.dm" #include "code\modules\paperwork\clipboard.dm" #include "code\modules\paperwork\filingcabinet.dm" #include "code\modules\paperwork\folders.dm" diff --git a/code/modules/mob/simple_animal/head.dm b/code/modules/mob/living/simple_animal/head.dm similarity index 100% rename from code/modules/mob/simple_animal/head.dm rename to code/modules/mob/living/simple_animal/head.dm diff --git a/code/modules/mob/simple_animal/bear.dm b/code/modules/mob/simple_animal/bear.dm deleted file mode 100644 index 9a95d5e506..0000000000 --- a/code/modules/mob/simple_animal/bear.dm +++ /dev/null @@ -1,160 +0,0 @@ -#define BEAR_STANCE_IDLE 1 -#define BEAR_STANCE_ALERT 2 -#define BEAR_STANCE_ATTACK 3 -#define BEAR_STANCE_ATTACKING 4 -#define BEAR_STANCE_TIRED 5 - -//Space bears! -/mob/living/simple_animal/bear - name = "space bear" - desc = "RawrRawr!!" - icon_state = "bear" - icon_living = "bear" - icon_dead = "bear_dead" - icon_gib = "bear_gib" - speak = list("RAWR!","Rawr!","GRR!","Growl!") - speak_emote = list("growls", "roars") - emote_hear = list("rawrs","grumbles","grawls") - emote_see = list("stares ferociously", "stomps") - speak_chance = 1 - turns_per_move = 5 - see_in_dark = 6 - meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat - response_help = "pets the" - response_disarm = "gently pushes aside the" - response_harm = "pokes the" - - stop_automated_movement_when_pulled = 0 - maxHealth = 60 - health = 60 - - //Space bears aren't affected by atmos. - min_oxy = 0 - max_oxy = 0 - min_tox = 0 - max_tox = 0 - min_co2 = 0 - max_co2 = 0 - min_n2 = 0 - max_n2 = 0 - - var/stance = BEAR_STANCE_IDLE //Used to determine behavior - var/stance_step = 0 //Used to delay checks depending on what stance the bear is in - var/mob/living/target_mob //Once the bear enters attack stance, it will try to chase this mob. This it to prevent it changing it's mind between multiple mobs. - -/proc/isbear(var/mob/M) - return istype(M, /mob/living/simple_animal/bear) - -/mob/living/simple_animal/bear/Life() - ..() - - if(!stat) - if(loc && istype(loc,/turf/space)) - icon_state = "bear" - else - icon_state = "bearfloor" - - switch(stance) - if(BEAR_STANCE_IDLE) - stop_automated_movement = 0 - stance_step++ - if(stance_step > 5) - stance_step = 0 - for( var/mob/living/L in viewers(7,src) ) - if(isbear(L)) continue - if(!L.stat) - emote("stares alertly at [L]") - stance = BEAR_STANCE_ALERT - break - if(BEAR_STANCE_ALERT) - stop_automated_movement = 1 - var/found_mob = 0 - for( var/mob/living/L in viewers(7,src) ) - if(isbear(L)) continue - if(!L.stat) - stance_step = max(0, stance_step) //If we have not seen a mob in a while, the stance_step will be negative, we need to reset it to 0 as soon as we see a mob again. - stance_step++ - found_mob = 1 - target_mob = L - src.dir = get_dir(src,target_mob) //Keep staring at the mob - - if(stance_step in list(1,4,7)) //every 3 ticks - var/action = pick( list( "growls at [L]", "stares angrily at [L]", "prepares to attack [L]", "closely watches [L]" ) ) - if(action) - emote(action) - break - if(!found_mob) - stance_step-- - - if(stance_step <= -20) //If we have not found a mob for 20-ish ticks, revert to idle mode - stance = BEAR_STANCE_IDLE - if(stance_step >= 7) //If we have been staring at a mob for 7 ticks, - stance = BEAR_STANCE_ATTACK - if(BEAR_STANCE_ATTACK) //This one should only be active for one tick, - stop_automated_movement = 1 - if(!target_mob || target_mob.stat) - stance = BEAR_STANCE_ALERT - stance_step = 5 //Make it very alert, so it quickly attacks again if a mob returns - if(target_mob in viewers(7,src)) - walk_to(src, target_mob, 1, 3) - stance = BEAR_STANCE_ATTACKING - stance_step = 0 - if(BEAR_STANCE_ATTACKING) - - stop_automated_movement = 1 - stance_step++ - if(!target_mob || target_mob.stat) - stance = BEAR_STANCE_ALERT - stance_step = 5 //Make it very alert, so it quickly attacks again if a mob returns - return - if(!(target_mob in viewers(7,src))) - stance = BEAR_STANCE_ALERT - stance_step = 5 //Make it very alert, so it quickly attacks again if a mob returns - target_mob = null - return - if(get_dist(src, target_mob) <= 1) //Attacking - emote( pick( list("slashes at [target_mob]", "bites [target_mob]") ) ) - - var/damage = rand(20,30) - - if(ishuman(target_mob)) - var/mob/living/carbon/human/H = target_mob - var/dam_zone = pick("chest", "l_hand", "r_hand", "l_leg", "r_leg") - var/datum/organ/external/affecting = H.get_organ(ran_zone(dam_zone)) - H.apply_damage(damage, BRUTE, affecting, H.run_armor_check(affecting, "melee")) - else if(isliving(target_mob)) - var/mob/living/L = target_mob - L.adjustBruteLoss(damage) - - if(stance_step >= 20) //attacks for 20 ticks, then it gets tired and needs to rest - emote( "is worn out and needs to rest" ) - stance = BEAR_STANCE_TIRED - stance_step = 0 - walk(src, 0) //This stops the bear's walking - return - if(BEAR_STANCE_TIRED) - stop_automated_movement = 1 - stance_step++ - if(stance_step >= 10) //rests for 10 ticks - if(target_mob && target_mob in viewers(7,src)) - stance = BEAR_STANCE_ATTACK //If the mob he was chasing is still nearby, resume the attack, otherwise go idle. - else - stance = BEAR_STANCE_IDLE - - -/mob/living/simple_animal/bear/attackby(var/obj/item/O as obj, var/mob/user as mob) - if(stance != BEAR_STANCE_ATTACK && stance != BEAR_STANCE_ATTACKING) - stance = BEAR_STANCE_ALERT - stance_step = 6 - target_mob = user - ..() - -/mob/living/simple_animal/bear/attack_hand(mob/living/carbon/human/M as mob) - if(stance != BEAR_STANCE_ATTACK && stance != BEAR_STANCE_ATTACKING) - stance = BEAR_STANCE_ALERT - stance_step = 6 - target_mob = M - ..() - -/mob/living/simple_animal/bear/Process_Spacemove(var/check_drift = 0) - return //No drifting in space for space bears! \ No newline at end of file diff --git a/code/modules/mob/simple_animal/behemoth.dm b/code/modules/mob/simple_animal/behemoth.dm deleted file mode 100644 index 0c252eea0e..0000000000 --- a/code/modules/mob/simple_animal/behemoth.dm +++ /dev/null @@ -1,126 +0,0 @@ -/mob/living/simple_animal/constructbehemoth - name = "Behemoth" - real_name = "Behemoth" - original_name = "Behemoth" - desc = "The pinnacle of occult technology, Behemoths are the ultimate weapon in the Cult of Nar-Sie's arsenal." - icon = 'mob.dmi' - icon_state = "behemoth" - icon_living = "behemoth" - icon_dead = "shade_dead" - maxHealth = 750 - health = 750 - speak_emote = list("rumbles") - emote_hear = list("wails","screeches") - response_help = "thinks better of touching" - response_disarm = "flails at" - response_harm = "harmlessly punches the" - harm_intent_damage = 0 - melee_damage_lower = 50 - melee_damage_upper = 50 - attacktext = "brutally crushes" - minbodytemp = 0 - maxbodytemp = 4000 - min_oxy = 0 - max_co2 = 0 - max_tox = 0 - speed = 5 - wall_smash = 1 - nopush = 1 - a_intent = "harm" - stop_automated_movement = 1 - canstun = 0 - canweaken = 0 - var/energy = 0 - var/max_energy = 1000 - - - Life() - ..() - if(stat == 2) - new /obj/item/weapon/ectoplasm (src.loc) - for(var/mob/M in viewers(src, null)) - if((M.client && !( M.blinded ))) - M.show_message("\red [src] collapses in a shattered heap ") - ghostize(0) - del src - return - -/mob/living/simple_animal/constructbehemoth/attackby(var/obj/item/O as obj, var/mob/user as mob) - if(O.force) - if(O.force >= 11) - health -= O.force - for(var/mob/M in viewers(src, null)) - if ((M.client && !( M.blinded ))) - M.show_message("\red \b [src] has been attacked with the [O] by [user]. ") - else - for(var/mob/M in viewers(src, null)) - if ((M.client && !( M.blinded ))) - M.show_message("\red \b The [O] bounces harmlessly off of [src]. ") - else - usr << "\red This weapon is ineffective, it does no damage." - for(var/mob/M in viewers(src, null)) - if ((M.client && !( M.blinded ))) - M.show_message("\red [user] gently taps [src] with the [O]. ") - - -/mob/living/simple_animal/constructbehemoth/Bump(atom/movable/AM as mob|obj, yes) - - spawn( 0 ) - if ((!( yes ) || now_pushing)) - return - now_pushing = 1 - if(ismob(AM)) - var/mob/tmob = AM - if(tmob.nopush) - now_pushing = 0 - return - - tmob.LAssailant = src - now_pushing = 0 - ..() - if (!( istype(AM, /atom/movable) )) - return - if (!( now_pushing )) - now_pushing = 1 - if (!( AM.anchored )) - var/t = get_dir(src, AM) - if (istype(AM, /obj/structure/window)) - if(AM:ini_dir == NORTHWEST || AM:ini_dir == NORTHEAST || AM:ini_dir == SOUTHWEST || AM:ini_dir == SOUTHEAST) - for(var/obj/structure/window/win in get_step(AM,t)) - now_pushing = 0 - return - step(AM, t) - now_pushing = null - return - return - - -////////////////Powers////////////////// - - -/* -/client/proc/summon_cultist() - set category = "Behemoth" - set name = "Summon Cultist (300)" - set desc = "Teleport a cultist to your location" - if (istype(usr,/mob/living/simple_animal/constructbehemoth)) - - if(usr.energy<300) - usr << "\red You do not have enough power stored!" - return - - if(usr.stat) - return - - usr.energy -= 300 - var/list/mob/living/cultists = new - for(var/datum/mind/H in ticker.mode.cult) - if (istype(H.current,/mob/living)) - cultists+=H.current - var/mob/cultist = input("Choose the one who you want to summon", "Followers of Geometer") as null|anything in (cultists - usr) - if(!cultist) - return - if (cultist == usr) //just to be sure. - return - cultist.loc = usr.loc - usr.visible_message("/red [cultist] appears in a flash of red light as [usr] glows with power")*/ diff --git a/code/modules/mob/simple_animal/carp.dm b/code/modules/mob/simple_animal/carp.dm deleted file mode 100644 index 127ddbf8ce..0000000000 --- a/code/modules/mob/simple_animal/carp.dm +++ /dev/null @@ -1,189 +0,0 @@ -#define CARP_STANCE_IDLE 1 -#define CARP_STANCE_ATTACK 2 -#define CARP_STANCE_ATTACKING 3 - -/mob/living/simple_animal/carp - name = "space carp" - desc = "A ferocious, fang-bearing creature that resembles a fish." - icon_state = "carp" - icon_living = "carp" - icon_dead = "carp_dead" - icon_gib = "carp_gib" - speak_chance = 0 - turns_per_move = 5 - meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat - response_help = "pets the" - response_disarm = "gently pushes aside the" - response_harm = "hits the" - - stop_automated_movement_when_pulled = 0 - maxHealth = 25 - health = 25 - - harm_intent_damage = 8 - melee_damage_lower = 5 - melee_damage_upper = 15 - attacktext = "bites" - attack_sound = 'bite.ogg' - - //Space carp aren't affected by atmos. - min_oxy = 0 - max_oxy = 0 - min_tox = 0 - max_tox = 0 - min_co2 = 0 - max_co2 = 0 - min_n2 = 0 - max_n2 = 0 - minbodytemp = 0 //so they don't freeze in space - maxbodytemp = 295 //if it's just 25 degrees, they start to burn up - - var/stance = CARP_STANCE_IDLE //Used to determine behavior - var/stance_step = 0 //Used to delay checks depending on what stance the bear is in - var/mob/living/target_mob //Once the bear enters attack stance, it will try to chase this mob. This it to prevent it changing it's mind between multiple mobs. - heat_damage_per_tick = 1 - -/mob/living/simple_animal/carp/elite - desc = "A ferocious, fang-bearing creature that resembles a fish. It has an evil gleam in its eye." - maxHealth = 50 - health = 50 - melee_damage_lower = 10 - melee_damage_upper = 20 - -/proc/iscarp(var/mob/M) - return istype(M, /mob/living/simple_animal/carp) - -/mob/living/simple_animal/carp/Life() - ..() - - if(!stat) - switch(stance) - if(CARP_STANCE_IDLE) - stop_automated_movement = 0 - stance_step++ - if(stance_step > 5) - stance_step = 0 - for( var/mob/living/L in viewers(7,src) ) - if(iscarp(L)) continue - if(!L.stat) - if(prob(50)) - src.visible_message("[src] gnashes at [L]!") - stance = CARP_STANCE_ATTACK - target_mob = L - break - - if(CARP_STANCE_ATTACK) //This one should only be active for one tick - stop_automated_movement = 1 - if(!target_mob || target_mob.stat) - stance = CARP_STANCE_IDLE - stance_step = 5 //Make it very alert, so it quickly attacks again if a mob returns - if(target_mob in viewers(7,src)) - walk_to(src, target_mob, 1, 3) - stance = CARP_STANCE_ATTACKING - stance_step = 0 - - if(CARP_STANCE_ATTACKING) - stop_automated_movement = 1 - stance_step++ - if(!target_mob || target_mob.stat) - stance = CARP_STANCE_IDLE - stance_step = 4 //Make it very alert, so it quickly attacks again if a mob returns - target_mob = null - walk(src,0) - return - if(!(target_mob in viewers(7,src))) - stance = CARP_STANCE_IDLE - stance_step = 1 - target_mob = null - walk(src,0) - return - if(get_dist(src, target_mob) <= 1) //Attacking - if(isliving(target_mob)) - var/mob/living/L = target_mob - L.attack_animal(src) - if(prob(10)) - L.Weaken(5) - L.visible_message("\the [src] knocks down \the [L]!") - -/mob/living/simple_animal/carp/Die() - ..() - target_mob = null - stance = CARP_STANCE_IDLE - walk(src,0) - -/mob/living/simple_animal/carp/Process_Spacemove(var/check_drift = 0) - return 0 //No drifting in space for space carp! //original comments do not steal - -/mob/living/simple_animal/carp/Process_Spaceslipping(var/prob_slip = 5) - return 0 - -//---- - -/mob/living/simple_animal/carp/cyborg - name = "cyborg space carp" - desc = "A ferocious, fang-bearing cyborg that resembles a fish. It has glowing red eyes." - icon_state = "carpborg" - icon_living = "carpborg" - icon_dead = "carpborg_dead" - icon_gib = "carpborg_gib" - speak = list("Objective established.","Goal: Terminate.","Mission parameters defined.","All casualties are acceptable.") - speak_emote = list("beeps") - emote_hear = list("makes a sinister clanking noise.","hisses and steams.","makes a menacing beeping noise.") - emote_see = list("sparks slightly.","flashes a red light ominously.") - speak_chance = 10 - var/firing = 0 - -/mob/living/simple_animal/carp/cyborg/Life() - ..() - walk(src,0) - - if(!stat) - if(prob(5)) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, src) - s.start() - switch(stance) - if(CARP_STANCE_ATTACKING) - if(target_mob) - src.dir = get_dir(src, target_mob) - /*if(get_dist(src, target_mob) > 5) - step_towards(src,target_mob)*/ - if(get_dist(src, target_mob) > 1 && !firing) - //fire laser eyes - firing = 1 - if(prob(40)) - emote("[pick("makes an ominous whining noise!","makes a low humming noise!","begins charging up something!")]") - - spawn(40) - if(!target_mob) - return - firing = 0 - //load_into_chamber() - var/obj/item/projectile/beam/B = new(src) - - B.firer = src - //B.def_zone = targloc - //in_chamber.def_zone = user.zone_sel.selecting - - var/turf/targloc = get_turf(target_mob) - var/turf/myloc = get_turf(src) - - B.original = targloc - B.loc = myloc - B.starting = myloc - B.silenced = 0 - B.current = myloc - B.yo = targloc.y - myloc.y - B.xo = targloc.x - myloc.x - // - B.fired() - - //shake the camera? probably not, these lasers don't explode... yet - /*for(var/mob/M in view(src,7)) - shake_camera(user, recoil + 1, recoil)*/ - playsound(src, pick('pulse.ogg','pulse2.ogg','pulse3.ogg'), 50, 1) - -/mob/living/simple_animal/carp/cyborg/Die() - if(prob(15)) - src.say_auto("I'll be back!") - ..() diff --git a/code/modules/mob/simple_animal/cat.dm b/code/modules/mob/simple_animal/cat.dm deleted file mode 100644 index 9c44a0ab53..0000000000 --- a/code/modules/mob/simple_animal/cat.dm +++ /dev/null @@ -1,67 +0,0 @@ -//Cat -/mob/living/simple_animal/cat - name = "cat" - desc = "A domesticated, feline pet. Has a tendency to adopt crewmembers." - icon_state = "cat" - icon_living = "cat" - icon_dead = "cat_dead" - speak = list("Meow!","Esp!","Purr!","HSSSSS") - speak_emote = list("purrs", "meows") - emote_hear = list("meows","mews") - emote_see = list("shakes its head", "shivers") - speak_chance = 1 - turns_per_move = 5 - see_in_dark = 6 - meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat - response_help = "pets the" - response_disarm = "gently pushes aside the" - response_harm = "kicks the" - var/turns_since_scan = 0 - var/mob/living/simple_animal/mouse/movement_target - min_oxy = 16 //Require atleast 16kPA oxygen - minbodytemp = 223 //Below -50 Degrees Celcius - maxbodytemp = 323 //Above 50 Degrees Celcius - -/mob/living/simple_animal/cat/Life() - //MICE! - if((src.loc) && isturf(src.loc)) - if(!stat && !resting && !buckled) - for(var/mob/living/simple_animal/mouse/M in view(1,src)) - if(!M.stat) - M.splat() - emote(pick("\red splats the [M]!","\red toys with the [M]","worries the [M]")) - movement_target = null - stop_automated_movement = 0 - break - - ..() - - for(var/mob/living/simple_animal/mouse/snack in oview(src, 3)) - if(prob(15)) - emote(pick("hisses and spits!","mrowls fiercely!","eyes [snack] hungrily.")) - break - - if(!stat && !resting && !buckled) - turns_since_scan++ - if(turns_since_scan > 5) - walk_to(src,0) - turns_since_scan = 0 - if((movement_target) && !(isturf(movement_target.loc) || ishuman(movement_target.loc) )) - movement_target = null - stop_automated_movement = 0 - if( !movement_target || !(movement_target.loc in oview(src, 3)) ) - movement_target = null - stop_automated_movement = 0 - for(var/mob/living/simple_animal/mouse/snack in oview(src,3)) - if(isturf(snack.loc) && !snack.stat) - movement_target = snack - break - if(movement_target) - stop_automated_movement = 1 - walk_to(src,movement_target,0,3) - -//RUNTIME IS ALIVE! SQUEEEEEEEE~ -/mob/living/simple_animal/cat/Runtime - name = "Runtime" - desc = "Its fur has the look and feel of velvet, and it's tail quivers occasionally." - diff --git a/code/modules/mob/simple_animal/constructs.dm b/code/modules/mob/simple_animal/constructs.dm deleted file mode 100644 index 74644fe668..0000000000 --- a/code/modules/mob/simple_animal/constructs.dm +++ /dev/null @@ -1,351 +0,0 @@ - -/////////////////Juggernaut/////////////// - -/mob/living/simple_animal/constructarmoured - name = "Juggernaut" - real_name = "Juggernaut" - original_name = "Juggernaut" - desc = "A possessed suit of armour driven by the will of the restless dead" - icon = 'mob.dmi' - icon_state = "armour" - icon_living = "armour" - icon_dead = "shade_dead" - maxHealth = 250 - health = 250 - speak_emote = list("hisses") - emote_hear = list("wails","screeches") - response_help = "thinks better of touching" - response_disarm = "flails at" - response_harm = "harmlessly punches the" - harm_intent_damage = 0 - melee_damage_lower = 30 - melee_damage_upper = 30 - attacktext = "smashes their armoured gauntlet into" - minbodytemp = 0 - maxbodytemp = 4000 - min_oxy = 0 - max_co2 = 0 - max_tox = 0 - speed = 3 - wall_smash = 1 - nopush = 1 - a_intent = "harm" - stop_automated_movement = 1 - canstun = 0 - canweaken = 0 - - - Life() - ..() - if(stat == 2) - new /obj/item/weapon/ectoplasm (src.loc) - for(var/mob/M in viewers(src, null)) - if((M.client && !( M.blinded ))) - M.show_message("\red [src] collapses in a shattered heap ") - ghostize(0) - del src - return - -/mob/living/simple_animal/constructarmoured/attackby(var/obj/item/O as obj, var/mob/user as mob) - if(O.force) - if(O.force >= 11) - health -= O.force - for(var/mob/M in viewers(src, null)) - if ((M.client && !( M.blinded ))) - M.show_message("\red \b [src] has been attacked with the [O] by [user]. ") - else - for(var/mob/M in viewers(src, null)) - if ((M.client && !( M.blinded ))) - M.show_message("\red \b The [O] bounces harmlessly off of [src]. ") - else - usr << "\red This weapon is ineffective, it does no damage." - for(var/mob/M in viewers(src, null)) - if ((M.client && !( M.blinded ))) - M.show_message("\red [user] gently taps [src] with the [O]. ") - - -/mob/living/simple_animal/constructarmoured/Bump(atom/movable/AM as mob|obj, yes) - - spawn( 0 ) - if ((!( yes ) || now_pushing)) - return - now_pushing = 1 - if(ismob(AM)) - var/mob/tmob = AM - if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations)) - if(prob(5)) - src << "\red You fail to push [tmob]'s fat ass out of the way." - now_pushing = 0 - return - if(tmob.nopush) - now_pushing = 0 - return - - tmob.LAssailant = src - now_pushing = 0 - ..() - if (!( istype(AM, /atom/movable) )) - return - if (!( now_pushing )) - now_pushing = 1 - if (!( AM.anchored )) - var/t = get_dir(src, AM) - if (istype(AM, /obj/structure/window)) - if(AM:ini_dir == NORTHWEST || AM:ini_dir == NORTHEAST || AM:ini_dir == SOUTHWEST || AM:ini_dir == SOUTHEAST) - for(var/obj/structure/window/win in get_step(AM,t)) - now_pushing = 0 - return - step(AM, t) - now_pushing = null - return - return - - -/mob/living/simple_animal/constructarmoured/attack_animal(mob/living/simple_animal/M as mob) - if(istype(M, /mob/living/simple_animal/constructbuilder)) - health += 10 - M.emote("mends some of \the [src]'s wounds") - else - if(M.melee_damage_upper <= 0) - M.emote("[M.friendly] \the [src]") - else - for(var/mob/O in viewers(src, null)) - O.show_message("\The [M] [M.attacktext] \the [src]!", 1) - var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) - health -= damage - - -/mob/living/simple_animal/constructarmoured/examine() - set src in oview() - - var/msg = "*---------*\nThis is \icon[src] \a [src]!\n" - if (src.health < src.maxHealth) - msg += "" - if (src.health >= src.maxHealth/2) - msg += "It looks slightly dented.\n" - else - msg += "It looks severely dented!\n" - msg += "" - msg += "*---------*" - - usr << msg - return - -/mob/living/simple_animal/constructarmoured/proc/mind_initialize(mob/G) - mind = new - mind.current = src - mind.assigned_role = "Juggernaut" - mind.key = G.key - -////////////////////////Wraith///////////////////////////////////////////// - - - -/mob/living/simple_animal/constructwraith - name = "Wraith" - real_name = "Wraith" - original_name = "Wraith" - desc = "A wicked bladed shell contraption piloted by a bound spirit" - icon = 'mob.dmi' - icon_state = "floating" - icon_living = "floating" - icon_dead = "shade_dead" - maxHealth = 75 - health = 75 - speak_emote = list("hisses") - emote_hear = list("wails","screeches") - response_help = "thinks better of touching" - response_disarm = "flails at" - response_harm = "punches the" - melee_damage_lower = 25 - melee_damage_upper = 25 - attacktext = "slashes" - minbodytemp = 0 - maxbodytemp = 4000 - min_oxy = 0 - max_co2 = 0 - max_tox = 0 - speed = -1 - a_intent = "harm" - stop_automated_movement = 1 - canstun = 0 - canweaken = 0 - see_in_dark = 7 - - Life() - ..() - if(stat == 2) - new /obj/item/weapon/ectoplasm (src.loc) - for(var/mob/M in viewers(src, null)) - if((M.client && !( M.blinded ))) - M.show_message("\red [src] collapses in a shattered heap ") - ghostize(0) - del src - return - - -/mob/living/simple_animal/constructwraith/attackby(var/obj/item/O as obj, var/mob/user as mob) - if(O.force) - health -= O.force - for(var/mob/M in viewers(src, null)) - if ((M.client && !( M.blinded ))) - M.show_message("\red \b [src] has been attacked with the [O] by [user]. ") - else - usr << "\red This weapon is ineffective, it does no damage." - for(var/mob/M in viewers(src, null)) - if ((M.client && !( M.blinded ))) - M.show_message("\red [user] gently taps [src] with the [O]. ") - -/mob/living/simple_animal/constructwraith/Bump(atom/movable/AM as mob|obj, yes) - - spawn( 0 ) - if ((!( yes ) || now_pushing)) - return - now_pushing = 1 - if(ismob(AM)) - var/mob/tmob = AM - if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations)) - if(prob(50)) - src << "\red You fail to push [tmob]'s fat ass out of the way." - now_pushing = 0 - return - if(tmob.nopush) - now_pushing = 0 - return - - tmob.LAssailant = src - now_pushing = 0 - ..() - if (!( istype(AM, /atom/movable) )) - return - if (!( now_pushing )) - now_pushing = 1 - if (!( AM.anchored )) - var/t = get_dir(src, AM) - if (istype(AM, /obj/structure/window)) - if(AM:ini_dir == NORTHWEST || AM:ini_dir == NORTHEAST || AM:ini_dir == SOUTHWEST || AM:ini_dir == SOUTHEAST) - for(var/obj/structure/window/win in get_step(AM,t)) - now_pushing = 0 - return - step(AM, t) - now_pushing = null - return - return - -/mob/living/simple_animal/constructwraith/attack_animal(mob/living/simple_animal/M as mob) - if(istype(M, /mob/living/simple_animal/constructbuilder)) - health += 10 - M.emote("mends some of \the [src]'s wounds") - else - if(M.melee_damage_upper <= 0) - M.emote("[M.friendly] \the [src]") - else - for(var/mob/O in viewers(src, null)) - O.show_message("\The [M] [M.attacktext] \the [src]!", 1) - var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) - health -= damage - - - -/mob/living/simple_animal/constructwraith/examine() - set src in oview() - - var/msg = "*---------*\nThis is \icon[src] \a [src]!\n" - if (src.health < src.maxHealth) - msg += "" - if (src.health >= src.maxHealth/2) - msg += "It looks slightly dented.\n" - else - msg += "It looks severely dented!\n" - msg += "" - msg += "*---------*" - - usr << msg - return - -/mob/living/simple_animal/constructwraith/proc/mind_initialize(mob/G) - mind = new - mind.current = src - mind.assigned_role = "Wraith" - mind.key = G.key - -/////////////////////////////Artificer///////////////////////// - -/mob/living/simple_animal/constructbuilder - name = "Artificer" - real_name = "Artificer" - original_name = "Artificer" - desc = "A bulbous construct dedicated to building and maintaining The Cult of Nar-Sie's armies" - icon = 'mob.dmi' - icon_state = "artificer" - icon_living = "artificer" - icon_dead = "shade_dead" - maxHealth = 50 - health = 50 - speak_emote = list("hisses") - emote_hear = list("wails","screeches") - response_help = "thinks better of touching" - response_disarm = "flails at" - response_harm = "viciously beats" - harm_intent_damage = 5 - melee_damage_lower = 5 - melee_damage_upper = 5 - attacktext = "rams" - minbodytemp = 0 - maxbodytemp = 4000 - min_oxy = 0 - max_co2 = 0 - max_tox = 0 - speed = 0 - wall_smash = 1 - nopush = 1 - a_intent = "harm" - stop_automated_movement = 1 - canstun = 0 - canweaken = 0 - - Life() - ..() - if(stat == 2) - new /obj/item/weapon/ectoplasm (src.loc) - for(var/mob/M in viewers(src, null)) - if((M.client && !( M.blinded ))) - M.show_message("\red [src] collapses in a shattered heap ") - ghostize(0) - del src - return - -/mob/living/simple_animal/constructbuilder/attack_animal(mob/living/simple_animal/M as mob) - if(istype(M, /mob/living/simple_animal/constructbuilder)) - health += 5 - M.emote("mends some of \the [src]'s wounds") - else - if(M.melee_damage_upper <= 0) - M.emote("[M.friendly] \the [src]") - else - for(var/mob/O in viewers(src, null)) - O.show_message("\The [M] [M.attacktext] \the [src]!", 1) - var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) - health -= damage - -/mob/living/simple_animal/constructbuilder/examine() - set src in oview() - - var/msg = "*---------*\nThis is \icon[src] \a [src]!\n" - if (src.health < src.maxHealth) - msg += "" - if (src.health >= src.maxHealth/2) - msg += "It looks slightly dented.\n" - else - msg += "It looks severely dented!\n" - msg += "" - msg += "*---------*" - - usr << msg - return - -/mob/living/simple_animal/constructbuilder/proc/mind_initialize(mob/G) - mind = new - mind.current = src - mind.assigned_role = "Artificer" - mind.key = G.key \ No newline at end of file diff --git a/code/modules/mob/simple_animal/corgi.dm b/code/modules/mob/simple_animal/corgi.dm deleted file mode 100644 index 005a8cdfdb..0000000000 --- a/code/modules/mob/simple_animal/corgi.dm +++ /dev/null @@ -1,365 +0,0 @@ -//Corgi -/mob/living/simple_animal/corgi - name = "\improper corgi" - real_name = "corgi" - desc = "It's a corgi." - icon_state = "corgi" - icon_living = "corgi" - icon_dead = "corgi_dead" - speak = list("YAP", "Woof!", "Bark!", "AUUUUUU") - speak_emote = list("barks", "woofs") - emote_hear = list("barks", "woofs", "yaps","pants") - emote_see = list("shakes its head", "shivers") - speak_chance = 1 - turns_per_move = 10 - meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/corgi - meat_amount = 3 - response_help = "pets the" - response_disarm = "bops the" - response_harm = "kicks the" - see_in_dark = 5 - var/obj/item/inventory_head - var/obj/item/inventory_back - var/turns_since_scan = 0 - var/obj/movement_target - -/mob/living/simple_animal/corgi/show_inv(mob/user as mob) - /* - user.machine = src - if(user.stat) return - - var/dat = "

Inventory of [name]

" - if(inventory_head) - dat += "
Head: [inventory_head] (Remove)" - else - dat += "
Head: Nothing" - if(inventory_back) - dat += "
Back: [inventory_back] (Remove)" - else - dat += "
Back: Nothing" - - user << browse(dat, text("window=mob[];size=325x500", name)) - onclose(user, "mob[real_name]") - */ - return - -/mob/living/simple_animal/corgi/attackby(var/obj/item/O as obj, var/mob/user as mob) - if(inventory_head && inventory_back) - //helmet and armor = 100% protection - if( istype(inventory_head,/obj/item/clothing/head/helmet) && istype(inventory_back,/obj/item/clothing/suit/armor) ) - if( O.force ) - usr << "\red This animal is wearing too much armor. You can't cause /him any damage." - for (var/mob/M in viewers(src, null)) - M.show_message("\red \b [user] hits [src] with the [O], however [src] is too armored.") - else - usr << "\red This animal is wearing too much armor. You can't reach its skin." - for (var/mob/M in viewers(src, null)) - M.show_message("\red [user] gently taps [src] with the [O]. ") - if(prob(15)) - emote("looks at [user] with [pick("an amused","an annoyed","a confused","a resentful", "a happy", "an excited")] expression on \his face") - return - ..() - -/mob/living/simple_animal/corgi/Topic(href, href_list) - if(usr.stat) return - - //Removing from inventory - if(href_list["remove_inv"]) - if(get_dist(src,usr) > 1 || !(ishuman(usr) || ismonkey(usr) || isrobot(usr) || isalienadult(usr))) - return - var/remove_from = href_list["remove_inv"] - switch(remove_from) - if("head") - if(inventory_head) - name = real_name - desc = initial(desc) - speak = list("YAP", "Woof!", "Bark!", "AUUUUUU") - speak_emote = list("barks", "woofs") - emote_hear = list("barks", "woofs", "yaps","pants") - emote_see = list("shakes its head", "shivers") - desc = "It's a corgi." - inventory_head.loc = src.loc - inventory_head = null - else - usr << "\red There is nothing to remove from its [remove_from]." - return - if("back") - if(inventory_back) - inventory_back.loc = src.loc - inventory_back = null - else - usr << "\red There is nothing to remove from its [remove_from]." - return - - //show_inv(usr) //Commented out because changing Ian's name and then calling up his inventory opens a new inventory...which is annoying. - - //Adding things to inventory - else if(href_list["add_inv"]) - if(get_dist(src,usr) > 1 || !(ishuman(usr) || ismonkey(usr) || isrobot(usr) || isalienadult(usr))) - return - var/add_to = href_list["add_inv"] - if(!usr.get_active_hand()) - usr << "\red You have nothing in your hand to put on its [add_to]." - return - switch(add_to) - if("head") - if(inventory_head) - usr << "\red It's is already wearing something." - return - else - var/obj/item/item_to_add = usr.get_active_hand() - if(!item_to_add) - return - - //Corgis are supposed to be simpler, so only a select few objects can actually be put - //to be compatible with them. The objects are below. - //Many hats added, Some will probably be removed, just want to see which ones are popular. - - var/list/allowed_types = list( - /obj/item/clothing/head/helmet, - /obj/item/clothing/glasses/sunglasses, - /obj/item/clothing/head/caphat, - /obj/item/clothing/head/collectable/captain, - /obj/item/clothing/head/that, - /obj/item/clothing/head/that, - /obj/item/clothing/head/kitty, - /obj/item/clothing/head/collectable/kitty, - /obj/item/clothing/head/rabbitears, - /obj/item/clothing/head/collectable/rabbitears, - /obj/item/clothing/head/beret, - /obj/item/clothing/head/collectable/beret, - /obj/item/clothing/head/det_hat, - /obj/item/clothing/head/nursehat, - /obj/item/clothing/head/pirate, - /obj/item/clothing/head/collectable/pirate, - /obj/item/clothing/head/ushanka, - /obj/item/clothing/head/chefhat, - /obj/item/clothing/head/collectable/chef, - /obj/item/clothing/head/collectable/police, - /obj/item/clothing/head/wizard/fake, - /obj/item/clothing/head/wizard, - /obj/item/clothing/head/collectable/wizard, - /obj/item/clothing/head/collectable/hardhat, - /obj/item/weapon/bedsheet, - /obj/item/clothing/head/helmet/space/santahat, - /obj/item/clothing/head/collectable/paper, - ) - - if( ! ( item_to_add.type in allowed_types ) ) - usr << "\red It doesn't seem too keen on wearing that item." - return - - usr.drop_item() - item_to_add.loc = src - src.inventory_head = item_to_add - rebuild_appearance() - - //Various hats and items (worn on his head) change Ian's behaviour. His attributes are reset when a HAT is removed. - - - switch(inventory_head && inventory_head.type) - if(/obj/item/clothing/head/caphat, /obj/item/clothing/head/collectable/captain) - name = "Captain [real_name]" - desc = "Probably better than the last captain." - if(/obj/item/clothing/head/kitty, /obj/item/clothing/head/collectable/kitty) - name = "Runtime" - emote_see = list("coughs up a furball", "stretches") - emote_hear = list("purrs") - speak = list("Purrr", "Meow!", "MAOOOOOW!", "HISSSSS", "MEEEEEEW") - desc = "It's a cute little kitty-cat! ... wait ... what the hell?" - if(/obj/item/clothing/head/rabbitears, /obj/item/clothing/head/collectable/rabbitears) - name = "Hoppy" - emote_see = list("twitches its nose", "hops around a bit") - desc = "This is hoppy. It's a corgi-...urmm... bunny rabbit" - if(/obj/item/clothing/head/beret, /obj/item/clothing/head/collectable/beret) - name = "Yann" - desc = "Mon dieu! C'est un chien!" - speak = list("le woof!", "le bark!", "JAPPE!!") - emote_see = list("cowers in fear", "surrenders", "plays dead","looks as though there is a wall in front of /him") - if(/obj/item/clothing/head/det_hat) - name = "Detective [real_name]" - desc = "[name] sees through your lies..." - emote_see = list("investigates the area","sniffs around for clues","searches for scooby snacks") - if(/obj/item/clothing/head/nursehat) - name = "Nurse [real_name]" - desc = "[name] needs 100cc of beef jerky...STAT!" - if(/obj/item/clothing/head/pirate, /obj/item/clothing/head/collectable/pirate) - name = "'[pick("Ol'","Scurvy","Black","Rum","Gammy","Bloody","Gangrene","Death","Long-John")] [pick("kibble","leg","beard","tooth","poop-deck","Threepwood","Le Chuck","corsair","Silver","Crusoe")]'" - desc = "Yaarghh!! Thar' be a scurvy dog!" - emote_see = list("hunts for treasure","stares coldly...","gnashes his tiny corgi teeth") - emote_hear = list("growls ferociously", "snarls") - speak = list("Arrrrgh!!","Grrrrrr!") - if(/obj/item/clothing/head/ushanka) - name = "[pick("Comrade","Commissar","Glorious Leader")] [real_name]" - desc = "A follower of Karl Barx." - emote_see = list("contemplates the failings of the capitalist economic model", "ponders the pros and cons of vangaurdism") - if(/obj/item/clothing/head/collectable/police) - name = "Officer [real_name]" - emote_see = list("drools","looks for donuts") - desc = "Stop right there criminal scum!" - if(/obj/item/clothing/head/wizard/fake, /obj/item/clothing/head/wizard, /obj/item/clothing/head/collectable/wizard) - name = "Grandwizard [real_name]" - speak = list("YAP", "Woof!", "Bark!", "AUUUUUU", "EI NATH!") - if(/obj/item/weapon/bedsheet) - name = "\improper Ghost" - speak = list("WoooOOOooo~","AUUUUUUUUUUUUUUUUUU") - emote_see = list("stumbles around", "shivers") - emote_hear = list("howls","groans") - desc = "Spooky!" - if(/obj/item/clothing/head/helmet/space/santahat) - name = "Rudolph the Red-Nosed Corgi" - emote_hear = list("barks christmas songs", "yaps") - desc = "He has a very shiny nose." - - if("back") - if(inventory_back) - usr << "\red It's already wearing something." - return - else - var/obj/item/item_to_add = usr.get_active_hand() - if(!item_to_add) - return - - //Corgis are supposed to be simpler, so only a select few objects can actually be put - //to be compatible with them. The objects are below. - - var/list/allowed_types = list( - /obj/item/clothing/suit/armor/vest, - /obj/item/device/radio - ) - - if( ! ( item_to_add.type in allowed_types ) ) - usr << "\red This object won't fit." - return - - usr.drop_item() - item_to_add.loc = src - src.inventory_back = item_to_add - rebuild_appearance() - - //show_inv(usr) //Commented out because changing Ian's name and then calling up his inventory opens a new inventory...which is annoying. - else - ..() - -/mob/living/simple_animal/corgi/Life() - ..() - rebuild_appearance() - - //Feeding, chasing food, FOOOOODDDD - if(!stat && !resting && !buckled) - turns_since_scan++ - if(turns_since_scan > 5) - turns_since_scan = 0 - if((movement_target) && !(isturf(movement_target.loc) || ishuman(movement_target.loc) )) - movement_target = null - stop_automated_movement = 0 - if( !movement_target || !(movement_target.loc in oview(src, 3)) ) - movement_target = null - stop_automated_movement = 0 - for(var/obj/item/weapon/reagent_containers/food/snacks/S in oview(src,3)) - if(isturf(S.loc) || ishuman(S.loc)) - movement_target = S - break - if(movement_target) - stop_automated_movement = 1 - step_to(src,movement_target,1) - sleep(3) - step_to(src,movement_target,1) - sleep(3) - step_to(src,movement_target,1) - - if(movement_target) //Not redundant due to sleeps, Item can be gone in 6 decisecomds - if (movement_target.loc.x < src.x) - dir = WEST - else if (movement_target.loc.x > src.x) - dir = EAST - else if (movement_target.loc.y < src.y) - dir = SOUTH - else if (movement_target.loc.y > src.y) - dir = NORTH - else - dir = SOUTH - - if(isturf(movement_target.loc) ) - movement_target.attack_animal(src) - else if(ishuman(movement_target.loc) ) - if(prob(20)) - emote("stares at the [movement_target] that [movement_target.loc] has with a sad puppy-face") - - if(prob(1)) - emote(pick("dances around","chases its tail")) - spawn(0) - for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2,1,2,4,8,4,2)) - dir = i - sleep(1) - -/obj/item/weapon/reagent_containers/food/snacks/meat/corgi - name = "Corgi meat" - desc = "Tastes like... well you know..." - -/mob/living/simple_animal/corgi/Bump(atom/movable/AM as mob|obj, yes) - - spawn( 0 ) - if ((!( yes ) || now_pushing)) - return - now_pushing = 1 - if(ismob(AM)) - var/mob/tmob = AM - if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations)) - if(prob(70)) - src << "\red You fail to push [tmob]'s fat ass out of the way." - now_pushing = 0 - return - if(tmob.nopush) - now_pushing = 0 - return - - tmob.LAssailant = src - now_pushing = 0 - ..() - if (!( istype(AM, /atom/movable) )) - return - if (!( now_pushing )) - now_pushing = 1 - if (!( AM.anchored )) - var/t = get_dir(src, AM) - if (istype(AM, /obj/structure/window)) - if(AM:ini_dir == NORTHWEST || AM:ini_dir == NORTHEAST || AM:ini_dir == SOUTHWEST || AM:ini_dir == SOUTHEAST) - for(var/obj/structure/window/win in get_step(AM,t)) - now_pushing = 0 - return - step(AM, t) - now_pushing = null - return - return -//PC stuff-Sieve - -/mob/living/simple_animal/corgi/proc/mind_initialize(mob/G) - mind = new - mind.current = src - mind.assigned_role = "Corgi" - mind.key = G.key - - -/mob/living/simple_animal/corgi/attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri - if(istype(O, /obj/item/weapon/newspaper)) - if(!stat) - for(var/mob/M in viewers(user, null)) - if ((M.client && !( M.blinded ))) - M.show_message("\blue [user] baps [name] on the nose with the rolled up [O]") - spawn(0) - for(var/i in list(1,2,4,8,4,2,1,2)) - dir = i - sleep(1) - else - ..() - -//IAN! SQUEEEEEEEEE~ -/mob/living/simple_animal/corgi/Ian - name = "Ian" - real_name = "Ian" //Intended to hold the name without altering it. - gender = "male" - desc = "It's a somewhat notorious corgi." - response_help = "pets" - response_disarm = "bops" - response_harm = "kicks" diff --git a/code/modules/mob/simple_animal/crab.dm b/code/modules/mob/simple_animal/crab.dm deleted file mode 100644 index 92ba087034..0000000000 --- a/code/modules/mob/simple_animal/crab.dm +++ /dev/null @@ -1,31 +0,0 @@ -//Look Sir, free crabs! -/mob/living/simple_animal/crab - name = "crab" - desc = "A hard-shelled crustacean. Seems quite content to lounge around all the time." - icon_state = "crab" - icon_living = "crab" - icon_dead = "crab_dead" - speak_emote = list("clicks") - emote_hear = list("clicks") - emote_see = list("clacks") - speak_chance = 1 - turns_per_move = 5 - meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat - response_help = "pets the" - response_disarm = "gently pushes aside the" - response_harm = "stomps the" - stop_automated_movement = 1 - friendly = "pinches" - var/obj/item/inventory_head - var/obj/item/inventory_mask - -/mob/living/simple_animal/crab/Life() - ..() - //CRAB movement - if(!ckey && !stat) - if(isturf(src.loc) && !resting && !buckled) //This is so it only moves if it's not inside a closet, gentics machine, etc. - turns_since_move++ - if(turns_since_move >= turns_per_move) - Move(get_step(src,pick(4,8))) - turns_since_move = 0 - rebuild_appearance() diff --git a/code/modules/mob/simple_animal/mouse.dm b/code/modules/mob/simple_animal/mouse.dm deleted file mode 100644 index 203b4481ae..0000000000 --- a/code/modules/mob/simple_animal/mouse.dm +++ /dev/null @@ -1,152 +0,0 @@ -/mob/living/simple_animal/mouse - name = "mouse" - real_name = "mouse" - desc = "It's a small, disease-ridden rodent." - icon_state = "mouse_gray" - icon_living = "mouse_gray" - icon_dead = "mouse_gray_dead" - speak = list("Squeek!","SQUEEK!","Squeek?") - speak_emote = list("squeeks","squeeks","squiks") - emote_hear = list("squeeks","squeaks","squiks") - emote_see = list("runs in a circle", "shakes", "scritches at something") - speak_chance = 1 - turns_per_move = 5 - see_in_dark = 6 - health = 5 - meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat - response_help = "pets the" - response_disarm = "gently pushes aside the" - response_harm = "splats the" - density = 0 - var/color //brown, gray and white - layer = 2.5 //so they can hide under objects - swap_on_mobbump = 0 - min_oxy = 16 //Require atleast 16kPA oxygen - minbodytemp = 223 //Below -50 Degrees Celcius - maxbodytemp = 323 //Above 50 Degrees Celcius - -/mob/living/simple_animal/mouse/Life() - ..() - if(!stat && prob(speak_chance)) - for(var/mob/M in view()) - M << 'sound/effects/mousesqueek.ogg' - -/mob/living/simple_animal/mouse/gray - color = "gray" - icon_state = "mouse_gray" - -/mob/living/simple_animal/mouse/white - color = "white" - icon_state = "mouse_white" - -/mob/living/simple_animal/mouse/brown - color = "brown" - icon_state = "mouse_brown" - -/mob/living/simple_animal/mouse/New() - if(!color) - color = pick( list("brown","gray","white") ) - icon_state = "mouse_[color]" - icon_living = "mouse_[color]" - icon_dead = "mouse_[color]_dead" - desc = "It's a small [color] rodent, often seen hiding in maintenance areas and making a nuisance of itself." - -/mob/living/simple_animal/mouse/proc/splat() - src.health = 0 - src.stat = DEAD - src.icon_dead = "mouse_[color]_splat" - src.icon_state = "mouse_[color]_splat" - -/proc/ismouse(var/obj/O) - return istype(O,/mob/living/simple_animal/mouse) - -//copy paste from alien/larva, if that func is updated please update this one also -/mob/living/simple_animal/mouse/verb/ventcrawl() - set name = "Crawl through Vent" - set desc = "Enter an air vent and crawl through the pipe system." - set category = "Mouse" - -// if(!istype(V,/obj/machinery/atmoalter/siphs/fullairsiphon/air_vent)) -// return - var/obj/machinery/atmospherics/unary/vent_pump/vent_found - var/welded = 0 - for(var/obj/machinery/atmospherics/unary/vent_pump/v in range(1,src)) - if(!v.welded) - vent_found = v - break - else - welded = 1 - if(vent_found) - if(vent_found.network&&vent_found.network.normal_members.len) - var/list/vents = list() - for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in vent_found.network.normal_members) - if(temp_vent.loc == loc) - continue - vents.Add(temp_vent) - var/list/choices = list() - for(var/obj/machinery/atmospherics/unary/vent_pump/vent in vents) - if(vent.loc.z != loc.z) - continue - var/atom/a = get_turf(vent) - choices.Add(a.loc) - var/turf/startloc = loc - var/obj/selection = input("Select a destination.", "Duct System") in choices - var/selection_position = choices.Find(selection) - if(loc==startloc) - var/obj/target_vent = vents[selection_position] - if(target_vent) - for(var/mob/O in oviewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("[src] scrambles into the ventillation ducts!"), 1) - loc = target_vent.loc - else - src << "\blue You need to remain still while entering a vent." - else - src << "\blue This vent is not connected to anything." - else if(welded) - src << "\red That vent is welded." - else - src << "\blue You must be standing on or beside an air vent to enter it." - return - -//copy paste from alien/larva, if that func is updated please update this one alsoghost -/mob/living/simple_animal/mouse/verb/hide() - set name = "Hide" - set desc = "Allows to hide beneath tables or certain items. Toggled on or off." - set category = "Mouse" - - if (layer != TURF_LAYER+0.2) - layer = TURF_LAYER+0.2 - src << text("\blue You are now hiding.") - for(var/mob/O in oviewers(src, null)) - if ((O.client && !( O.blinded ))) - O << text("[] scurries to the ground!", src) - else - layer = MOB_LAYER - src << text("\blue You have stopped hiding.") - for(var/mob/O in oviewers(src, null)) - if ((O.client && !( O.blinded ))) - O << text("[] slowly peaks up from the ground...", src) - -//make mice fit under tables etc? this was hacky, and not working -/* -/mob/living/simple_animal/mouse/Move(var/dir) - - var/turf/target_turf = get_step(src,dir) - //CanReachThrough(src.loc, target_turf, src) - var/can_fit_under = 0 - if(target_turf.ZCanPass(get_turf(src),1)) - can_fit_under = 1 - - ..(dir) - if(can_fit_under) - src.loc = target_turf - for(var/d in cardinal) - var/turf/O = get_step(T,d) - //Simple pass check. - if(O.ZCanPass(T, 1) && !(O in open) && !(O in closed) && O in possibles) - open += O - */ - -mob/living/simple_animal/mouse/restrained() //Hotfix to stop mice from doing things with MouseDrop - return 1 \ No newline at end of file diff --git a/code/modules/mob/simple_animal/parrot.dm b/code/modules/mob/simple_animal/parrot.dm deleted file mode 100644 index 00beabf6b7..0000000000 --- a/code/modules/mob/simple_animal/parrot.dm +++ /dev/null @@ -1,94 +0,0 @@ -/mob/living/simple_animal/parrot - name = "\improper Parrot" - desc = "It's a parrot! No dirty words!" - icon = 'mob.dmi' - icon_state = "parrot" - icon_living = "parrot" - icon_dead = "parrot_dead" - speak = list("Hi","Hello!","Cracker?","BAWWWWK george mellons griffing me") - speak_emote = list("squawks","says","yells") - emote_hear = list("squawks.","bawks.") - emote_see = list("flutters its wings.", "glares at you.") - speak_chance = 5 - turns_per_move = 5 - meat_type = /obj/item/weapon/reagent_containers/food/snacks/cracker/ - response_help = "pets the" - response_disarm = "gently moves aside the" - response_harm = "swats the" - min_oxy = 16 //Require atleast 16kPA oxygen - minbodytemp = 223 //Below -50 Degrees Celcius - maxbodytemp = 323 //Above 50 Degrees Celcius - - l_ear = new /obj/item/device/radio/headset/headset_eng() - -/mob/living/simple_animal/parrot/DrProfessor - name = "Doctor Professor Parrot, PhD" - desc = "That's the Doctor Professor. He has more degrees than all of the engineering team put together, and has several published papers on quantum cracker theory." - speak = list(":e Check the singlo, you chucklefucks!",":e Wire the solars, you lazy bums!",":e WHO TOOK THE DAMN RIG SUIT?",":e OH GOD ITS FREE CALL THE SHUTTLE",":e Open secure storage please.",":e I think something happened to the containment field...") - response_harm = "is attacked in the face by" - -/obj/item/weapon/reagent_containers/food/snacks/cracker/ - name = "Cracker" - desc = "It's a salted cracker." - -/mob/living/simple_animal/parrot/show_inv(mob/user as mob) - user.machine = src - if(user.stat) return - - var/dat = "

Inventory of [name]

" - if(l_ear) - dat += "
Headset: [l_ear] (Remove)" - else - dat += "
Headset: Nothing" - - user << browse(dat, text("window=mob[];size=325x500", name)) - onclose(user, "mob[real_name]") - return - - - -/mob/living/simple_animal/parrot/Topic(href, href_list) - if(usr.stat) return - - //Removing from inventory - if(href_list["remove_inv"]) - if(get_dist(src,usr) > 1 || !(ishuman(usr) || ismonkey(usr) || isrobot(usr) || isalienadult(usr))) - return - var/remove_from = href_list["remove_inv"] - switch(remove_from) - if("ears") - if(l_ear) - src.say(":e BAWWWWWK LEAVE THE HEADSET BAWKKKKK!") - l_ear.loc = src.loc - l_ear = null - else - usr << "\red There is nothing to remove from its [remove_from]." - return - - //Adding things to inventory - else if(href_list["add_inv"]) - if(get_dist(src,usr) > 1 || !(ishuman(usr) || ismonkey(usr) || isrobot(usr) || isalienadult(usr))) - return - var/add_to = href_list["add_inv"] - if(!usr.get_active_hand()) - usr << "\red You have nothing in your hand to put on its [add_to]." - return - switch(add_to) - if("ears") - if(l_ear) - usr << "\red It's already wearing something." - return - else - var/obj/item/item_to_add = usr.get_active_hand() - if(!item_to_add) - return - - if( !istype(item_to_add, /obj/item/device/radio/headset) ) - usr << "\red This object won't fit." - return - - usr.drop_item() - item_to_add.loc = src - src.l_ear = item_to_add - else - ..() diff --git a/code/modules/mob/simple_animal/shade.dm b/code/modules/mob/simple_animal/shade.dm deleted file mode 100644 index 3edff7159a..0000000000 --- a/code/modules/mob/simple_animal/shade.dm +++ /dev/null @@ -1,59 +0,0 @@ -/mob/living/simple_animal/shade - name = "Shade" - desc = "A bound spirit" - icon = 'mob.dmi' - icon_state = "shade" - icon_living = "shade" - icon_dead = "shade_dead" - maxHealth = 50 - health = 50 - speak_emote = list("hisses") - emote_hear = list("wails","screeches") - response_help = "puts their hand through" - response_disarm = "flails at" - response_harm = "punches the" - melee_damage_lower = 5 - melee_damage_upper = 15 - attacktext = "drains the life from" - minbodytemp = 0 - maxbodytemp = 4000 - min_oxy = 0 - max_co2 = 0 - max_tox = 0 - speed = -1 - stop_automated_movement = 1 - - - Life() - ..() - if(stat == 2) - new /obj/item/weapon/ectoplasm (src.loc) - for(var/mob/M in viewers(src, null)) - if((M.client && !( M.blinded ))) - M.show_message("\red [src] lets out a contented sigh as their form unwinds. ") - ghostize(0) - del src - return - - - attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri - if(istype(O, /obj/item/device/soulstone)) - O.transfer_soul("SHADE", src, user) - else - if(O.force) - health -= O.force - for(var/mob/M in viewers(src, null)) - if ((M.client && !( M.blinded ))) - M.show_message("\red \b [src] has been attacked with the [O] by [user]. ") - else - usr << "\red This weapon is ineffective, it does no damage." - for(var/mob/M in viewers(src, null)) - if ((M.client && !( M.blinded ))) - M.show_message("\red [user] gently taps [src] with the [O]. ") - return - -/mob/living/simple_animal/shade/proc/mind_initialize(mob/G) - mind = new - mind.current = src - mind.assigned_role = "Shade" - mind.key = G.key \ No newline at end of file diff --git a/code/modules/mob/simple_animal/simple_animal.dm b/code/modules/mob/simple_animal/simple_animal.dm deleted file mode 100644 index adf5fd5810..0000000000 --- a/code/modules/mob/simple_animal/simple_animal.dm +++ /dev/null @@ -1,58 +0,0 @@ -/mob/living/simple_animal - name = "animal" - icon = 'animal.dmi' - var/icon_living = "" - var/icon_dead = "" - var/icon_gib = null //We only try to show a gibbing animation if this exists. - maxHealth = 20 - var/list/speak = list() - var/list/speak_emote = list()// Emotes while speaking IE: Ian [emote], [text] -- Ian barks, "WOOF!". Spoken text is generated from the speak variable. - var/speak_chance = 0 - var/list/emote_hear = list() //EHearable emotes - var/list/emote_see = list() //Unlike speak_emote, the list of things in this variable only show by themselves with no spoken text. IE: Ian barks, Ian yaps - health = 20 - var/turns_per_move = 1 - var/turns_since_move = 0 - universal_speak = 1 - var/meat_amount = 0 - var/meat_type - var/stop_automated_movement = 0 //Use this to temporarely stop random movement or to if you write special movement code for animals. - var/stop_automated_movement_when_pulled = 1 //When set to 1 this stops the animal from moving when someone is pulling it. - - //Interaction - var/response_help = "You try to help" - var/response_disarm = "You try to disarm" - var/response_harm = "You try to hurt" - var/harm_intent_damage = 3 - - //Temperature effect - var/minbodytemp = 270 - var/maxbodytemp = 325 - var/heat_damage_per_tick = 3 //amount of damage applied if animal's body temperature is higher than maxbodytemp - var/cold_damage_per_tick = 2 //same as heat_damage_per_tick, only if the bodytemperature it's lower than minbodytemp - - //Atmos effect - Yes, you can make creatures that require plasma or co2 to survive. N2O is a trace gas and handled separately, hence why it isn't here. It'd be hard to add it. Hard and me don't mix (Yes, yes make all the dick jokes you want with that.) - Errorage - var/min_oxy = 5 - var/max_oxy = 0 //Leaving something at 0 means it's off - has no maximum - var/min_tox = 0 - var/max_tox = 1 - var/min_co2 = 0 - var/max_co2 = 5 - var/min_n2 = 0 - var/max_n2 = 0 - var/unsuitable_atoms_damage = 2 //This damage is taken when atmos doesn't fit all the requirements above - - - //LETTING SIMPLE ANIMALS ATTACK? WHAT COULD GO WRONG. Defaults to zero so Ian can still be cuddly - var/melee_damage_lower = 0 - var/melee_damage_upper = 0 - var/attacktext = "attacks" - var/attack_sound = null - var/friendly = "nuzzles" //If the mob does no damage with it's attack - var/wall_smash = 0 //if they can smash walls - - var/speed = 5 - - var/can_open_doors = 0 //door opening kind of guy - - var/obj/item/device/radio/headset/l_ear = null diff --git a/code/modules/mob/simple_animal/simple_animal_life.dm b/code/modules/mob/simple_animal/simple_animal_life.dm deleted file mode 100644 index 8b480b9a61..0000000000 --- a/code/modules/mob/simple_animal/simple_animal_life.dm +++ /dev/null @@ -1,95 +0,0 @@ - -/mob/living/simple_animal/Life() - - //Health - if(stat == DEAD) - if(health > 0) - icon_state = icon_living - stat = CONSCIOUS - density = 1 - return - else if(health < 1) - Die() - else if(health > maxHealth) - health = maxHealth - - //Movement - if(!ckey && !stop_automated_movement) - if(isturf(src.loc) && !resting && !buckled && canmove) //This is so it only moves if it's not inside a closet, gentics machine, etc. - turns_since_move++ - if(turns_since_move >= turns_per_move) - Move(get_step(src,pick(cardinal))) - turns_since_move = 0 - - //Speaking - if(!ckey && prob(speak_chance)) - var/length = (speak ? speak.len : 0) + (emote_see ? emote_see.len : 0) + (emote_hear ? emote_hear.len : 0) - if(speak && speak.len && prob((speak.len / length) * 100)) - src.say_auto(pick(speak)) - else if(emote_see && emote_see.len && prob((emote_see.len / length) * 100)) - emote("auto",1,pick(emote_see)) - else if(emote_hear && emote_hear.len) - emote("auto",2,pick(emote_hear)) - //var/act,var/m_type=1,var/message = null - - //Atmos - var/atmos_suitable = 1 - - var/atom/A = src.loc - if(isturf(A)) - var/turf/T = A - var/areatemp = T.temperature - if( abs(areatemp - bodytemperature) > 50 ) - var/diff = areatemp - bodytemperature - diff = diff / 5 - //world << "changed from [bodytemperature] by [diff] to [bodytemperature + diff]" - bodytemperature += diff - - if(istype(T,/turf/simulated)) - var/turf/simulated/ST = T - if(ST.air) - var/tox = ST.air.toxins - var/oxy = ST.air.oxygen - var/n2 = ST.air.nitrogen - var/co2 = ST.air.carbon_dioxide - - if(min_oxy) - if(oxy < min_oxy) - atmos_suitable = 0 - if(max_oxy) - if(oxy > max_oxy) - atmos_suitable = 0 - if(min_tox) - if(tox < min_tox) - atmos_suitable = 0 - if(max_tox) - if(tox > max_tox) - atmos_suitable = 0 - if(min_n2) - if(n2 < min_n2) - atmos_suitable = 0 - if(max_n2) - if(n2 > max_n2) - atmos_suitable = 0 - if(min_co2) - if(co2 < min_co2) - atmos_suitable = 0 - if(max_co2) - if(co2 > max_co2) - atmos_suitable = 0 - - //Atmos effect - if(bodytemperature < minbodytemp) - health -= cold_damage_per_tick - if(prob(15)) - emote("auto",1,"shivers![prob(50) ? "[pick(" It seems quite cold."," It seems to be freezing.")]" : ""]") - - else if(bodytemperature > maxbodytemp) - health -= heat_damage_per_tick - if(prob(15)) - emote("auto",1,"sweats![prob(50) ? "[pick(" It seems quite hot."," It seems to be burning up.")]" : ""]") - - if(!atmos_suitable) - health -= unsuitable_atoms_damage - if(prob(15)) - emote("auto",1,"gasps![prob(50) ? "[pick(" It seems unable to breath."," It seems to be asphyxiating.")]" : ""]") diff --git a/code/modules/mob/simple_animal/simple_animal_misc.dm b/code/modules/mob/simple_animal/simple_animal_misc.dm deleted file mode 100644 index 2c79a47126..0000000000 --- a/code/modules/mob/simple_animal/simple_animal_misc.dm +++ /dev/null @@ -1,217 +0,0 @@ - -/mob/living/simple_animal/Login() - if(src && src.client) - src.client.screen = null - ..() - -/mob/living/simple_animal/Bumped(AM as mob|obj) - if(!AM) return - if(isturf(src.loc) && !resting && !buckled) - if(ismob(AM)) - var/newamloc = src.loc - src.loc = AM:loc - AM:loc = newamloc - else - ..() - -/mob/living/simple_animal/gib() - if(meat_amount && meat_type) - for(var/i = 0; i < meat_amount; i++) - new meat_type(src.loc) - ..() - -/mob/living/simple_animal/say_quote(var/text) - if(speak_emote && speak_emote.len) - var/emote = pick(speak_emote) - if(emote) - return "[src] [emote], \"[text]\"" - return "says, \"[text]\""; - -//when talking, simple_animals can only understand each other -/mob/living/simple_animal/say(var/message) - for(var/mob/M in view(src,7)) - if(istype(M, src.type) || M.universal_speak) - M << say_quote(message) - else - M << "[src] [pick("makes some strange noises.","makes some strange noises.","makes some strange noises.","makes a small commotion.","kicks up a fuss about something.")]" - return - -//when talking, simple_animals can only understand each other -/mob/living/simple_animal/proc/say_auto(var/message) - for(var/mob/M in view(src,7)) - M << "[src] [pick(speak_emote)], \"[message]\"" - -/mob/living/simple_animal/emote(var/act = "auto", var/m_type=1, var/message = null) - switch(act) - if ("scream") - message = "[src] makes a loud and pained whimper" - m_type = 2 - if ("custom") - var/input = copytext(sanitize(input("Choose an emote to display.") as text|null),1,MAX_MESSAGE_LEN) - if (!input) - return - var/input2 = input("Is this a visible or hearable emote?") in list("Visible","Hearable") - if (input2 == "Visible") - m_type = 1 - else if (input2 == "Hearable") - m_type = 2 - else - alert("Unable to use this emote, must be either hearable or visible.") - return - message = "[src] [input]" - if ("me") - if(silent) - return - if (src.client && (client.muted || client.muted_complete)) - src << "You are muted." - return - if (stat) - return - if(!(message)) - return - else - if(cmptext(copytext(message, 1, 3), "v ")) - message = "[src] [copytext(message, 3)]" - m_type = 1 - else if(cmptext(copytext(message, 1, 3), "h ")) - message = "[src] [copytext(message, 3)]" - m_type = 2 - else - message = "[src] [message]" - if("auto") - message = "[src] [message]" - /*else - if(!message) - src << "Invalid Emote: [act]"*/ - if ((message && src.stat == 0)) - if (m_type & 1) - for(var/mob/O in viewers(src, null)) - O.show_message(message, m_type) - else - for(var/mob/O in hearers(src, null)) - O.show_message(message, m_type) - return - - -/mob/living/simple_animal/attack_animal(mob/living/simple_animal/M as mob) - if(M.melee_damage_upper == 0) - M.emote("[M.friendly] [src]") - else - for(var/mob/O in viewers(src, null)) - O.show_message("\red [M] [M.attacktext] [src]!", 1) - var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) - health -= damage - -/mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj) - if(!Proj) return - src.health -= Proj.damage - return 0 - -/mob/living/simple_animal/attack_hand(mob/living/carbon/human/M as mob) - ..() - - switch(M.a_intent) - - if ("help") - if (health > 0) - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message("\blue [M] [response_help] [src]") - - if ("grab") - if (M == src) - return - if (nopush) - return - var/obj/item/weapon/grab/G = new /obj/item/weapon/grab( M ) - G.assailant = M - if (M.hand) - M.l_hand = G - else - M.r_hand = G - G.layer = 20 - G.affecting = src - grabbed_by += G - G.synch() - - LAssailant = M - - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message(text("\red [] has grabbed [] passively!", M, src), 1) - - if ("hurt") - health -= harm_intent_damage - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message("\red [M] [response_harm] [src]") - - if ("disarm") - for(var/mob/O in viewers(src, null)) - if ((O.client && !( O.blinded ))) - O.show_message("\blue [M] [response_disarm] [src]") - - return - -/mob/living/simple_animal/attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri - if(istype(O, /obj/item/stack/medical)) - if(stat != DEAD) - var/obj/item/stack/medical/MED = O - if(health < maxHealth) - if(MED.amount >= 1) - health = min(maxHealth, health + MED.heal_brute) - MED.amount -= 1 - if(MED.amount <= 0) - del(MED) - for(var/mob/M in viewers(src, null)) - if ((M.client && !( M.blinded ))) - M.show_message("\blue [user] applies the [MED] on [src]") - else - user << "\blue this [src] is dead, medical items won't bring it back to life." - else - if(O.force) - health -= O.force - for(var/mob/M in viewers(src, null)) - if ((M.client && !( M.blinded ))) - M.show_message("\red \b [src] has been attacked with the [O] by [user]. ") - else - usr << "\red This weapon is ineffective, it does no damage." - for(var/mob/M in viewers(src, null)) - if ((M.client && !( M.blinded ))) - M.show_message("\red [user] gently taps [src] with the [O]. ") - - -/mob/living/simple_animal/movement_delay() - return speed - -/mob/living/simple_animal/Stat() - ..() - - statpanel("Status") - stat(null, "Health: [round((health / maxHealth) * 100)]%") - -/mob/living/simple_animal/proc/Die() - icon_state = icon_dead - stat = DEAD - density = 0 - src << "\red You have died!" - verbs -= /mob/living/simple_animal/say - return - -/mob/living/simple_animal/ex_act(severity) - flick("flash", flash) - switch (severity) - if (1.0) - health -= 500 - gib() - return - - if (2.0) - health -= 60 - - - if(3.0) - health -= 30 - -/proc/issimpleanimal(var/mob/AM) - return istype(AM,/mob/living/simple_animal) diff --git a/code/modules/mob/simple_animal/worm.dm b/code/modules/mob/simple_animal/worm.dm deleted file mode 100644 index 18b66178e6..0000000000 --- a/code/modules/mob/simple_animal/worm.dm +++ /dev/null @@ -1,199 +0,0 @@ -/mob/living/simple_animal/space_worm - name = "space worm segment" - desc = "A part of a space worm." - icon = 'critter.dmi' - icon_state = "spaceworm" - icon_living = "spaceworm" - icon_dead = "spacewormdead" - - speak_emote = list("transmits") //not supposed to be used under AI control - emote_hear = list("transmits") //I'm just adding it so it doesn't runtime if controlled by player who speaks - - response_help = "touches" - response_disarm = "flails at" - response_harm = "punches the" - - harm_intent_damage = 2 - - maxHealth = 30 - health = 30 - - stop_automated_movement = 1 - animate_movement = SYNC_STEPS - - minbodytemp = 0 - maxbodytemp = 350 - min_oxy = 0 - max_co2 = 0 - max_tox = 0 - - a_intent = "harm" //so they don't get pushed around - - nopush = 1 - wall_smash = 1 - - speed = -1 - - var/mob/living/simple_animal/space_worm/previous //next/previous segments, correspondingly - var/mob/living/simple_animal/space_worm/next //head is the nextest segment - - var/stomachProcessProbability = 50 - var/digestionProbability = 20 - var/flatPlasmaValue = 5 //flat plasma amount given for non-items - - var/atom/currentlyEating //what the worm is currently eating - var/eatingDuration = 0 //how long he's been eating it for - - head - name = "space worm head" - icon_state = "spacewormhead" - icon_living = "spacewormhead" - icon_dead = "spacewormdead" - - maxHealth = 20 - health = 20 - - melee_damage_lower = 10 - melee_damage_upper = 15 - attacktext = "bites" - - animate_movement = SLIDE_STEPS - - New(var/location, var/segments = 6) - ..() - - var/mob/living/simple_animal/space_worm/current = src - - for(var/i = 1 to segments) - var/mob/living/simple_animal/space_worm/newSegment = new /mob/living/simple_animal/space_worm(loc) - current.Attach(newSegment) - current = newSegment - - update_icon() - if(stat == CONSCIOUS || stat == UNCONSCIOUS) - icon_state = "spacewormhead[previous?1:0]" - if(previous) - dir = get_dir(previous,src) - else - icon_state = "spacewormheaddead" - - Life() - ..() - - if(next && !(next in view(src,1))) - Detach() - - if(stat == DEAD) //dead chunks fall off and die immediately - if(previous) - previous.Detach() - if(next) - Detach(1) - - if(prob(stomachProcessProbability)) - ProcessStomach() - - update_icon() - - return - - Del() //if a chunk a destroyed, make a new worm out of the split halves - if(previous) - previous.Detach() - ..() - - Move() - var/attachementNextPosition = loc - if(..()) - if(previous) - previous.Move(attachementNextPosition) - update_icon() - - Bump(atom/obstacle) - if(currentlyEating != obstacle) - currentlyEating = obstacle - eatingDuration = 0 - - if(!AttemptToEat(obstacle)) - eatingDuration++ - else - currentlyEating = null - eatingDuration = 0 - - return - - proc/update_icon() //only for the sake of consistency with the other update icon procs - if(stat == CONSCIOUS || stat == UNCONSCIOUS) - if(previous) //midsection - icon_state = "spaceworm[get_dir(src,previous) | get_dir(src,next)]" //see 3 lines below - else //tail - icon_state = "spacewormtail" - dir = get_dir(src,next) //next will always be present since it's not a head and if it's dead, it goes in the other if branch - else - icon_state = "spacewormdead" - - return - - proc/AttemptToEat(var/atom/target) - if(istype(target,/turf/simulated/wall)) - if((!istype(target,/turf/simulated/wall/r_wall) && eatingDuration >= 100) || eatingDuration >= 200) //need 20 ticks to eat an rwall, 10 for a regular one - var/turf/simulated/wall/wall = target - wall.ReplaceWithFloor() - new /obj/item/stack/sheet/metal(src, flatPlasmaValue) - return 1 - else if(istype(target,/atom/movable)) - if(istype(target,/mob) || eatingDuration >= 50) //5 ticks to eat stuff like airlocks - var/atom/movable/objectOrMob = target - contents += objectOrMob - return 1 - - return 0 - - proc/Attach(var/mob/living/simple_animal/space_worm/attachement) - if(!attachement) - return - - previous = attachement - attachement.next = src - - return - - proc/Detach(die = 0) - var/mob/living/simple_animal/space_worm/newHead = new /mob/living/simple_animal/space_worm/head(loc,0) - var/mob/living/simple_animal/space_worm/newHeadPrevious = previous - - previous = null //so that no extra heads are spawned - - newHead.Attach(newHeadPrevious) - - if(die) - newHead.Die() - - del(src) - - proc/ProcessStomach() - for(var/atom/movable/stomachContent in contents) - if(prob(digestionProbability)) - if(istype(stomachContent,/obj/item/stack)) //converts to plasma, keeping the stack value - if(!istype(stomachContent,/obj/item/stack/sheet/plasma)) - var/obj/item/stack/oldStack = stomachContent - new /obj/item/stack/sheet/plasma(src, oldStack.amount) - del(oldStack) - continue - else if(istype(stomachContent,/obj/item)) //converts to plasma, keeping the w_class - var/obj/item/oldItem = stomachContent - new /obj/item/stack/sheet/plasma(src, oldItem.w_class) - del(oldItem) - continue - else - new /obj/item/stack/sheet/plasma(src, flatPlasmaValue) //just flat amount - del(stomachContent) - continue - - if(previous) - for(var/atom/movable/stomachContent in contents) //transfer it along the digestive tract - previous.contents += stomachContent - else - for(var/atom/movable/stomachContent in contents) //or poop it out - loc.contents += stomachContent - - return \ No newline at end of file From dc42275ae20df31540755fc6239d12ef3446baf6 Mon Sep 17 00:00:00 2001 From: Cael_Aislinn Date: Tue, 15 Jan 2013 14:00:57 +1000 Subject: [PATCH 4/4] bunch of new alt titles, based off forum and IRC suggestions Signed-off-by: Cael_Aislinn --- code/game/jobs/job/assistant.dm | 3 ++- code/game/jobs/job/captain.dm | 4 +++- code/game/jobs/job/civilian.dm | 11 +++++++++-- code/game/jobs/job/civilian_chaplain.dm | 3 ++- code/game/jobs/job/engineering.dm | 3 +++ code/game/jobs/job/medical.dm | 9 ++++----- code/game/jobs/job/science.dm | 3 ++- code/game/jobs/job/security.dm | 5 ++++- 8 files changed, 29 insertions(+), 12 deletions(-) diff --git a/code/game/jobs/job/assistant.dm b/code/game/jobs/job/assistant.dm index 3028502420..2706d44aa4 100644 --- a/code/game/jobs/job/assistant.dm +++ b/code/game/jobs/job/assistant.dm @@ -9,6 +9,7 @@ selection_color = "#dddddd" access = list() //See /datum/job/assistant/get_access() minimal_access = list() //See /datum/job/assistant/get_access() + alt_titles = list("Technical Assistant","Medical Intern","Research Assistant","Security Cadet") /datum/job/assistant/equip(var/mob/living/carbon/human/H) if(!H) return 0 @@ -20,4 +21,4 @@ if(config.assistant_maint) return list(access_maint_tunnels) else - return list() \ No newline at end of file + return list() diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm index 09bfdd280d..761b787e24 100644 --- a/code/game/jobs/job/captain.dm +++ b/code/game/jobs/job/captain.dm @@ -11,6 +11,7 @@ req_admin_notify = 1 access = list() //See get_access() minimal_access = list() //See get_access() + alt_titles = list("Administrator") equip(var/mob/living/carbon/human/H) @@ -55,6 +56,7 @@ selection_color = "#ddddff" idtype = /obj/item/weapon/card/id/silver req_admin_notify = 1 + alt_titles = list("Human resources director","Executive Officer") access = list(access_security, access_sec_doors, access_brig, access_court, access_forensics_lockers, access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads, access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue, @@ -84,4 +86,4 @@ H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H), slot_r_hand) else H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H.back), slot_in_backpack) - return 1 \ No newline at end of file + return 1 diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm index 5c072d60db..8d003944a3 100644 --- a/code/game/jobs/job/civilian.dm +++ b/code/game/jobs/job/civilian.dm @@ -10,7 +10,7 @@ selection_color = "#dddddd" access = list(access_bar) minimal_access = list(access_bar) - + alt_titles = list("Waiter","Waitress") equip(var/mob/living/carbon/human/H) if(!H) return 0 @@ -52,6 +52,7 @@ selection_color = "#dddddd" access = list(access_kitchen, access_morgue) minimal_access = list(access_kitchen, access_morgue) + alt_titles = list("Gourmet chef","Cook") equip(var/mob/living/carbon/human/H) @@ -80,7 +81,7 @@ selection_color = "#dddddd" access = list(access_hydroponics, access_morgue) // Removed tox and chem access because STOP PISSING OFF THE CHEMIST GUYS // //Removed medical access because WHAT THE FUCK YOU AREN'T A DOCTOR YOU GROW WHEAT //Given Morgue access because they have a viable means of cloning. minimal_access = list(access_hydroponics, access_morgue) // Removed tox and chem access because STOP PISSING OFF THE CHEMIST GUYS // //Removed medical access because WHAT THE FUCK YOU AREN'T A DOCTOR YOU GROW WHEAT //Given Morgue access because they have a viable means of cloning. - + alt_titles = list("Hydroponicist") equip(var/mob/living/carbon/human/H) if(!H) return 0 @@ -110,6 +111,7 @@ selection_color = "#dddddd" access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mint, access_mining, access_mining_station) minimal_access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mint, access_mining, access_mining_station) + alt_titles = list("Supplies Officer","Logistics Officer") equip(var/mob/living/carbon/human/H) @@ -140,6 +142,7 @@ selection_color = "#dddddd" access = list(access_maint_tunnels, access_cargo, access_cargo_bot, access_mailsorting) minimal_access = list(access_maint_tunnels, access_cargo, access_cargo_bot, access_mailsorting) + alt_titles = list("Supplies worker","Courier","Logistics worker") equip(var/mob/living/carbon/human/H) @@ -168,6 +171,7 @@ selection_color = "#dddddd" access = list(access_mining, access_mint, access_mining_station, access_mailsorting) minimal_access = list(access_mining, access_mint, access_mining_station, access_mailsorting) + alt_titles = list("Deep space miner","NTCA Affiliate","Prospector") equip(var/mob/living/carbon/human/H) @@ -279,6 +283,7 @@ selection_color = "#dddddd" access = list(access_janitor, access_maint_tunnels) minimal_access = list(access_janitor, access_maint_tunnels) + alt_titles = list("Custodial officer","Hygiene supervisor","OHS assistant","Health and Safety worker") equip(var/mob/living/carbon/human/H) @@ -307,6 +312,7 @@ selection_color = "#dddddd" access = list(access_library) minimal_access = list(access_library) + alt_titles = list("Journalist","Clerk","Record keeper") equip(var/mob/living/carbon/human/H) @@ -335,6 +341,7 @@ var/global/lawyer = 0//Checks for another lawyer selection_color = "#dddddd" access = list(access_lawyer, access_court, access_sec_doors) minimal_access = list(access_lawyer, access_court, access_sec_doors) + alt_titles = list("Attourney","Barrister","Solicitor","Queen's Counsel","Paralegal") equip(var/mob/living/carbon/human/H) diff --git a/code/game/jobs/job/civilian_chaplain.dm b/code/game/jobs/job/civilian_chaplain.dm index 859eaffe95..f896fa919d 100644 --- a/code/game/jobs/job/civilian_chaplain.dm +++ b/code/game/jobs/job/civilian_chaplain.dm @@ -10,6 +10,7 @@ selection_color = "#dddddd" access = list(access_morgue, access_chapel_office, access_crematorium) minimal_access = list(access_morgue, access_chapel_office, access_crematorium) + alt_titles = list("Counselor","Psychiatrist","Crew services adviser","Morale Officer") equip(var/mob/living/carbon/human/H) @@ -26,7 +27,7 @@ H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) spawn(0) var/religion_name = "Christianity" - var/new_religion = copytext(sanitize(input(H, "You are the Chaplain. Would you like to change your religion? Default is Christianity, in SPACE.", "Name change", religion_name)),1,MAX_NAME_LEN) + var/new_religion = copytext(sanitize(input(H, "You are the crew services officer. Would you like to change your religion? Default is Christianity, in SPACE.", "Name change", religion_name)),1,MAX_NAME_LEN) if (!new_religion) new_religion = religion_name diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm index f89ba4e217..b3f6a1b8a8 100644 --- a/code/game/jobs/job/engineering.dm +++ b/code/game/jobs/job/engineering.dm @@ -9,6 +9,7 @@ selection_color = "#ffeeaa" idtype = /obj/item/weapon/card/id/silver req_admin_notify = 1 + alt_titles = list("Engineering supervisor") access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_teleporter, access_external_airlocks, access_atmospherics, access_emergency_storage, access_eva, access_heads, access_construction, access_sec_doors, @@ -51,6 +52,7 @@ selection_color = "#fff5cc" access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction) minimal_access = list(access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction) + alt_titles = list("Technician","Maintenance technician","Engine technician","EVA technician","Electrician","Construction specialist") @@ -86,6 +88,7 @@ selection_color = "#fff5cc" access = list(access_atmospherics, access_maint_tunnels, access_emergency_storage, access_construction) minimal_access = list(access_atmospherics, access_maint_tunnels, access_emergency_storage, access_construction) + alt_titles = list("Pipeworker","Gas supervisor","Firefighter") equip(var/mob/living/carbon/human/H) diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm index 406c9aca2c..9068192adc 100644 --- a/code/game/jobs/job/medical.dm +++ b/code/game/jobs/job/medical.dm @@ -50,7 +50,7 @@ access = list(access_medical, access_morgue, access_surgery) minimal_access = list(access_medical, access_morgue, access_surgery) - alt_titles = list("Surgeon", "Emergency Physician", "Virologist") + alt_titles = list("Surgeon","Emergency Physician","Nurse","Orderly") equip(var/mob/living/carbon/human/H) if(!H) return 0 @@ -102,6 +102,7 @@ selection_color = "#ffeef0" access = list(access_medical, access_chemistry) minimal_access = list(access_medical, access_chemistry) + alt_titles = list("Pharmacist") equip(var/mob/living/carbon/human/H) @@ -130,6 +131,7 @@ selection_color = "#ffeef0" access = list(access_medical, access_morgue, access_genetics, access_research) minimal_access = list(access_medical, access_morgue, access_genetics, access_research) + alt_titles = list("Sequencer") equip(var/mob/living/carbon/human/H) @@ -146,8 +148,6 @@ H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) return 1 -/* - /datum/job/virologist title = "Virologist" flag = VIROLOGIST @@ -159,6 +159,7 @@ selection_color = "#ffeef0" access = list(access_medical, access_virology) minimal_access = list(access_medical, access_virology) + alt_titles = list("Pathologist","Microbiologist") equip(var/mob/living/carbon/human/H) @@ -179,5 +180,3 @@ else H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack) return 1 -*/ - diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm index a59ce9d67e..a2cc28a8e2 100644 --- a/code/game/jobs/job/science.dm +++ b/code/game/jobs/job/science.dm @@ -47,7 +47,7 @@ access = list(access_tox, access_tox_storage, access_research, access_xenobiology) minimal_access = list(access_tox, access_tox_storage, access_research, access_xenobiology) - alt_titles = list("Xenoarcheologist", "Anomalist", "Plasma Researcher", "Xenobiologist") + alt_titles = list("Xenoarcheologist", "Anomalist", "Plasma Researcher", "Xenobiologist","High Energy Materials Researcher") equip(var/mob/living/carbon/human/H) if(!H) return 0 @@ -75,6 +75,7 @@ selection_color = "#ffeeff" access = list(access_robotics, access_tech_storage, access_morgue, access_research) //As a job that handles so many corpses, it makes sense for them to have morgue access. minimal_access = list(access_robotics, access_tech_storage, access_morgue, access_research) //As a job that handles so many corpses, it makes sense for them to have morgue access. + alt_titles = list("Biomedical engineer","Mechatronic engineer") equip(var/mob/living/carbon/human/H) if(!H) return 0 diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm index 0a3e4d695a..3e6d19a8b1 100644 --- a/code/game/jobs/job/security.dm +++ b/code/game/jobs/job/security.dm @@ -9,6 +9,7 @@ selection_color = "#ffdddd" idtype = /obj/item/weapon/card/id/silver req_admin_notify = 1 + alt_titles = list("Commander","Commissioner") access = list(access_security, access_sec_doors, access_brig, access_armory, access_court, access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers, access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting, @@ -55,6 +56,7 @@ spawn_positions = 1 supervisors = "the head of security" selection_color = "#ffeeee" + alt_titles = list("Arsenal clerk","Brig supervisor","Superintendant") access = list(access_security, access_sec_doors, access_brig, access_armory, access_court) minimal_access = list(access_security, access_sec_doors, access_brig, access_armory, access_court) @@ -95,7 +97,7 @@ access = list(access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court) minimal_access = list(access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court) - alt_titles = list("Forensic Technician") + alt_titles = list("Forensic Technician","Investigator") equip(var/mob/living/carbon/human/H) if(!H) return 0 @@ -142,6 +144,7 @@ selection_color = "#ffeeee" access = list(access_security, access_sec_doors, access_brig, access_court) minimal_access = list(access_security, access_sec_doors, access_brig, access_court) + alt_titles = list("OHS marshal","Enforcer") equip(var/mob/living/carbon/human/H)